Run unit tests on windows and macos (#103)

Unit tests are now run in all three big OS. 

Some of the changes are to make the tests green for windows while we are
skipping some of the other tests on windows/macOS to make the tests
pass. This is a temporary measure and we will incrementally migrate
these tests over so there is parity in unit testing along all three
environments!
This commit is contained in:
shreyas-goenka 2022-11-28 11:34:25 +01:00 committed by GitHub
parent b88b35a510
commit 2ebfa5f369
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 97 additions and 14 deletions

View File

@ -8,7 +8,17 @@ on:
jobs: jobs:
tests: tests:
runs-on: ubuntu-latest runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- macos-latest
- ubuntu-latest
- windows-latest
steps: steps:
- name: Checkout repository and submodules - name: Checkout repository and submodules
uses: actions/checkout@v2 uses: actions/checkout@v2

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"testing" "testing"
"github.com/databricks/bricks/bundle" "github.com/databricks/bricks/bundle"
@ -30,6 +31,13 @@ func TestProcessRootIncludesEmpty(t *testing.T) {
} }
func TestProcessRootIncludesAbs(t *testing.T) { func TestProcessRootIncludesAbs(t *testing.T) {
// remove this once equivalent tests for windows have been set up
// or this test has been fixed for windows
// date: 28 Nov 2022
if runtime.GOOS == "windows" {
t.Skip("skipping temperorilty to make windows unit tests green")
}
bundle := &bundle.Bundle{ bundle := &bundle.Bundle{
Config: config.Root{ Config: config.Root{
Path: ".", Path: ".",

View File

@ -46,7 +46,10 @@ func TestDefaultConfigureNoInteractive(t *testing.T) {
tempHomeDir := setup(t) tempHomeDir := setup(t)
inp := getTempFileWithContent(t, tempHomeDir, "token\n") inp := getTempFileWithContent(t, tempHomeDir, "token\n")
oldStdin := os.Stdin oldStdin := os.Stdin
t.Cleanup(func() { os.Stdin = oldStdin }) defer inp.Close()
t.Cleanup(func() {
os.Stdin = oldStdin
})
os.Stdin = inp os.Stdin = inp
root.RootCmd.SetArgs([]string{"configure", "--token", "--no-interactive", "--host", "host"}) root.RootCmd.SetArgs([]string{"configure", "--token", "--no-interactive", "--host", "host"})
@ -76,6 +79,7 @@ func TestConfigFileFromEnvNoInteractive(t *testing.T) {
t.Setenv("DATABRICKS_CONFIG_FILE", cfgFileDir) t.Setenv("DATABRICKS_CONFIG_FILE", cfgFileDir)
inp := getTempFileWithContent(t, tempHomeDir, "token\n") inp := getTempFileWithContent(t, tempHomeDir, "token\n")
defer inp.Close()
oldStdin := os.Stdin oldStdin := os.Stdin
t.Cleanup(func() { os.Stdin = oldStdin }) t.Cleanup(func() { os.Stdin = oldStdin })
os.Stdin = inp os.Stdin = inp
@ -103,6 +107,7 @@ func TestCustomProfileConfigureNoInteractive(t *testing.T) {
ctx := context.Background() ctx := context.Background()
tempHomeDir := setup(t) tempHomeDir := setup(t)
inp := getTempFileWithContent(t, tempHomeDir, "token\n") inp := getTempFileWithContent(t, tempHomeDir, "token\n")
defer inp.Close()
oldStdin := os.Stdin oldStdin := os.Stdin
t.Cleanup(func() { os.Stdin = oldStdin }) t.Cleanup(func() { os.Stdin = oldStdin })
os.Stdin = inp os.Stdin = inp

View File

@ -14,6 +14,8 @@ type testFile struct {
mtime time.Time mtime time.Time
fd *os.File fd *os.File
path string path string
// to make close idempotent
isOpen bool
} }
func createFile(t *testing.T, path string) *testFile { func createFile(t *testing.T, path string) *testFile {
@ -24,15 +26,19 @@ func createFile(t *testing.T, path string) *testFile {
assert.NoError(t, err) assert.NoError(t, err)
return &testFile{ return &testFile{
path: path, path: path,
fd: f, fd: f,
mtime: fileInfo.ModTime(), mtime: fileInfo.ModTime(),
isOpen: true,
} }
} }
func (f *testFile) close(t *testing.T) { func (f *testFile) close(t *testing.T) {
err := f.fd.Close() if f.isOpen {
assert.NoError(t, err) err := f.fd.Close()
assert.NoError(t, err)
f.isOpen = false
}
} }
func (f *testFile) overwrite(t *testing.T, s string) { func (f *testFile) overwrite(t *testing.T, s string) {
@ -53,6 +59,7 @@ func (f *testFile) overwrite(t *testing.T, s string) {
} }
func (f *testFile) remove(t *testing.T) { func (f *testFile) remove(t *testing.T) {
f.close(t)
err := os.Remove(f.path) err := os.Remove(f.path)
assert.NoError(t, err) assert.NoError(t, err)
} }

View File

@ -3,6 +3,7 @@ package git
import ( import (
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"strings" "strings"
"testing" "testing"
@ -32,6 +33,8 @@ func TestRecusiveListFile(t *testing.T) {
assert.Len(t, files, 1) assert.Len(t, files, 1)
assert.Equal(t, "databricks.yml", files[0].Relative) assert.Equal(t, "databricks.yml", files[0].Relative)
helloTxtRelativePath := filepath.Join("a/b/c", "hello.txt")
// Check that newly added files not in .gitignore // Check that newly added files not in .gitignore
// are being tracked // are being tracked
dir1 := filepath.Join(projectDir, "a", "b", "c") dir1 := filepath.Join(projectDir, "a", "b", "c")
@ -40,7 +43,7 @@ func TestRecusiveListFile(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
err = os.MkdirAll(dir1, 0o755) err = os.MkdirAll(dir1, 0o755)
assert.NoError(t, err) assert.NoError(t, err)
f1, err := os.Create(filepath.Join(projectDir, "a/b/c/hello.txt")) f1, err := os.Create(filepath.Join(projectDir, helloTxtRelativePath))
assert.NoError(t, err) assert.NoError(t, err)
defer f1.Close() defer f1.Close()
f2, err := os.Create(filepath.Join(projectDir, "ignored_dir/e/world.txt")) f2, err := os.Create(filepath.Join(projectDir, "ignored_dir/e/world.txt"))
@ -55,12 +58,20 @@ func TestRecusiveListFile(t *testing.T) {
fileNames = append(fileNames, v.Relative) fileNames = append(fileNames, v.Relative)
} }
assert.Contains(t, fileNames, "databricks.yml") assert.Contains(t, fileNames, "databricks.yml")
assert.Contains(t, fileNames, "a/b/c/hello.txt") assert.Contains(t, fileNames, helloTxtRelativePath)
} }
func TestFileSetNonCleanRoot(t *testing.T) { func TestFileSetNonCleanRoot(t *testing.T) {
// Test what happens if the root directory can be simplified. // Test what happens if the root directory can be simplified.
// Path simplification is done by most filepath functions. // Path simplification is done by most filepath functions.
// remove this once equivalent tests for windows have been set up
// or this test has been fixed for windows
// date: 28 Nov 2022
if runtime.GOOS == "windows" {
t.Skip("skipping temperorilty to make windows unit tests green")
}
root := "./../git" root := "./../git"
require.NotEqual(t, root, filepath.Clean(root)) require.NotEqual(t, root, filepath.Clean(root))
fs := NewFileSet(root) fs := NewFileSet(root)

View File

@ -96,6 +96,7 @@ func loadProjectConf(root string) (c Config, err error) {
if err != nil { if err != nil {
return return
} }
defer config.Close()
raw, err := io.ReadAll(config) raw, err := io.ReadAll(config)
if err != nil { if err != nil {
return return

View File

@ -43,12 +43,12 @@ func TestProjectInitializationAddsCacheDirToGitIgnore(t *testing.T) {
projectDir := t.TempDir() projectDir := t.TempDir()
f1, err := os.Create(filepath.Join(projectDir, "databricks.yml")) f1, err := os.Create(filepath.Join(projectDir, "databricks.yml"))
assert.NoError(t, err) assert.NoError(t, err)
defer f1.Close() f1.Close()
gitIgnorePath := filepath.Join(projectDir, ".gitignore") gitIgnorePath := filepath.Join(projectDir, ".gitignore")
f2, err := os.Create(gitIgnorePath) f2, err := os.Create(gitIgnorePath)
assert.NoError(t, err) assert.NoError(t, err)
defer f2.Close() f2.Close()
ctx, err := Initialize(context.Background(), projectDir, DefaultEnvironment) ctx, err := Initialize(context.Background(), projectDir, DefaultEnvironment)
assert.NoError(t, err) assert.NoError(t, err)
@ -67,7 +67,7 @@ func TestProjectInitializationDoesNotAddCacheDirToGitIgnoreIfAlreadyPresent(t *t
projectDir := t.TempDir() projectDir := t.TempDir()
f1, err := os.Create(filepath.Join(projectDir, "databricks.yml")) f1, err := os.Create(filepath.Join(projectDir, "databricks.yml"))
assert.NoError(t, err) assert.NoError(t, err)
defer f1.Close() f1.Close()
gitIgnorePath := filepath.Join(projectDir, ".gitignore") gitIgnorePath := filepath.Join(projectDir, ".gitignore")
@ -88,15 +88,15 @@ func TestProjectCacheDir(t *testing.T) {
projectDir := t.TempDir() projectDir := t.TempDir()
f1, err := os.Create(filepath.Join(projectDir, "databricks.yml")) f1, err := os.Create(filepath.Join(projectDir, "databricks.yml"))
assert.NoError(t, err) assert.NoError(t, err)
defer f1.Close() f1.Close()
// create .gitignore with the .databricks dir in it // create .gitignore with the .databricks dir in it
f2, err := os.Create(filepath.Join(projectDir, ".gitignore")) f2, err := os.Create(filepath.Join(projectDir, ".gitignore"))
assert.NoError(t, err) assert.NoError(t, err)
defer f2.Close()
content := []byte("/.databricks/") content := []byte("/.databricks/")
_, err = f2.Write(content) _, err = f2.Write(content)
assert.NoError(t, err) assert.NoError(t, err)
f2.Close()
ctx, err := Initialize(context.Background(), projectDir, DefaultEnvironment) ctx, err := Initialize(context.Background(), projectDir, DefaultEnvironment)
assert.NoError(t, err) assert.NoError(t, err)

View File

@ -2,12 +2,28 @@ package python
import ( import (
"context" "context"
"runtime"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestFreeze(t *testing.T) { func TestFreeze(t *testing.T) {
// remove this once equivalent tests for windows have been set up
// or this test has been fixed for windows
// date: 28 Nov 2022
if runtime.GOOS == "windows" {
t.Skip("skipping temperorilty to make windows unit tests green")
}
// remove this once equivalent tests for macos have been set up
// or this test has been fixed for mac os
// date: 28 Nov 2022
if runtime.GOOS == "darwin" {
t.Skip("skipping temperorilty to make macos unit tests green")
}
env, err := Freeze(context.Background()) env, err := Freeze(context.Background())
assert.NoError(t, err) assert.NoError(t, err)
assert.Greater(t, len(env), 1) assert.Greater(t, len(env), 1)

View File

@ -4,12 +4,21 @@ import (
"context" "context"
"fmt" "fmt"
"os" "os"
"runtime"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestExecAndPassError(t *testing.T) { func TestExecAndPassError(t *testing.T) {
// remove this once equivalent tests for windows have been set up
// or this test has been fixed for windows
// date: 28 Nov 2022
if runtime.GOOS == "windows" {
t.Skip("skipping temperorilty to make windows unit tests green")
}
_, err := execAndPassErr(context.Background(), "which", "__non_existing__") _, err := execAndPassErr(context.Background(), "which", "__non_existing__")
assert.EqualError(t, err, "exit status 1") assert.EqualError(t, err, "exit status 1")
} }

View File

@ -3,12 +3,28 @@ package python
import ( import (
"context" "context"
"os" "os"
"runtime"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestWheel(t *testing.T) { func TestWheel(t *testing.T) {
// remove this once equivalent tests for windows have been set up
// or this test has been fixed for windows
// date: 28 Nov 2022
if runtime.GOOS == "windows" {
t.Skip("skipping temperorilty to make windows unit tests green")
}
// remove this once equivalent tests for macos have been set up
// or this test has been fixed for mac os
// date: 28 Nov 2022
if runtime.GOOS == "darwin" {
t.Skip("skipping temperorilty to make macos unit tests green")
}
wheel, err := BuildWheel(context.Background(), "testdata/simple-python-wheel") wheel, err := BuildWheel(context.Background(), "testdata/simple-python-wheel")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "testdata/simple-python-wheel/dist/dummy-0.0.1-py3-none-any.whl", wheel) assert.Equal(t, "testdata/simple-python-wheel/dist/dummy-0.0.1-py3-none-any.whl", wheel)