Skip to content

Commit de02d9a

Browse files
committed
Merge branch 'dev' into 'master'
v1.1.1 See merge request objectbox/objectbox-go!83
2 parents a5d4a17 + 56039c7 commit de02d9a

File tree

14 files changed

+209
-85
lines changed

14 files changed

+209
-85
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ id, err := box.Put(&Person{ FirstName: "Joe", LastName: "Green" })
1818
Want details? **[Read the docs](https://golang.objectbox.io/)** or
1919
**[check out the API reference](https://godoc.org/github.com/objectbox/objectbox-go/objectbox)**.
2020

21-
Latest release: [v1.1.0 (2019-12-16)](https://golang.objectbox.io/)
21+
Latest release: [v1.1.1 (2020-02-14)](https://golang.objectbox.io/)
2222

2323
Some features
2424
-------------

objectbox/version.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (v Version) String() string {
4343
// VersionGo returns the Version of the ObjectBox-Go binding
4444
func VersionGo() Version {
4545
// for label, use `beta.0` format, increasing the counter for each subsequent release
46-
return Version{1, 1, 0, ""}
46+
return Version{1, 1, 1, ""}
4747
}
4848

4949
// VersionLib returns the Version of the dynamic linked ObjectBox library

test/box_test.go

+17-17
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,18 @@ import (
2525
)
2626

2727
func TestBox(t *testing.T) {
28-
objectBox := iot.LoadEmptyTestObjectBox()
29-
defer objectBox.Close()
30-
box1 := iot.BoxForEvent(objectBox)
31-
box2 := iot.BoxForEvent(objectBox)
28+
env := iot.NewTestEnv()
29+
defer env.Close()
30+
box1 := iot.BoxForEvent(env.ObjectBox)
31+
box2 := iot.BoxForEvent(env.ObjectBox)
3232

3333
assert.Eq(t, box1.Box, box2.Box)
3434
}
3535

3636
func TestPutAsync(t *testing.T) {
37-
objectBox := iot.LoadEmptyTestObjectBox()
38-
defer objectBox.Close()
39-
box := iot.BoxForEvent(objectBox)
37+
env := iot.NewTestEnv()
38+
defer env.Close()
39+
box := iot.BoxForEvent(env.ObjectBox)
4040
err := box.RemoveAll()
4141
assert.NoErr(t, err)
4242

@@ -47,7 +47,7 @@ func TestPutAsync(t *testing.T) {
4747
assert.NoErr(t, err)
4848
assert.Eq(t, objectId, event.Id)
4949

50-
assert.NoErr(t, objectBox.AwaitAsyncCompletion())
50+
assert.NoErr(t, env.AwaitAsyncCompletion())
5151

5252
count, err := box.Count()
5353
assert.NoErr(t, err)
@@ -74,9 +74,9 @@ func TestPutAsync(t *testing.T) {
7474
}
7575

7676
func TestUnique(t *testing.T) {
77-
objectBox := iot.LoadEmptyTestObjectBox()
78-
defer objectBox.Close()
79-
box := iot.BoxForEvent(objectBox)
77+
env := iot.NewTestEnv()
78+
defer env.Close()
79+
box := iot.BoxForEvent(env.ObjectBox)
8080

8181
err := box.RemoveAll()
8282
assert.NoErr(t, err)
@@ -101,9 +101,9 @@ func TestUnique(t *testing.T) {
101101
}
102102

103103
func TestBoxBulk(t *testing.T) {
104-
objectBox := iot.LoadEmptyTestObjectBox()
105-
defer objectBox.Close()
106-
box := iot.BoxForEvent(objectBox)
104+
env := iot.NewTestEnv()
105+
defer env.Close()
106+
box := iot.BoxForEvent(env.ObjectBox)
107107

108108
err := box.RemoveAll()
109109
assert.NoErr(t, err)
@@ -167,9 +167,9 @@ func TestBoxBulk(t *testing.T) {
167167
}
168168

169169
func TestPut(t *testing.T) {
170-
objectBox := iot.LoadEmptyTestObjectBox()
171-
defer objectBox.Close()
172-
box := iot.BoxForEvent(objectBox)
170+
env := iot.NewTestEnv()
171+
defer env.Close()
172+
box := iot.BoxForEvent(env.ObjectBox)
173173

174174
assert.NoErr(t, box.RemoveAll())
175175

test/build/build.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import (
2222

2323
// Package builds a single Go package/directory, running `go build path`
2424
func Package(path string) (stdOut []byte, stdErr []byte, err error) {
25-
var cmd = exec.Command("go", "build", path)
25+
var cmd = exec.Command("go", "build")
26+
cmd.Dir = path
2627
stdOut, err = cmd.Output()
2728
if ee, ok := err.(*exec.ExitError); ok {
2829
stdErr = ee.Stderr

test/concurrency_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ func TestConcurrentPutAsync(t *testing.T) {
4545
}
4646

4747
func concurrentInsert(t *testing.T, count, concurrency int, putAsync bool) {
48-
objectBox := iot.LoadEmptyTestObjectBox()
49-
defer objectBox.Close()
50-
box := iot.BoxForEvent(objectBox)
48+
env := iot.NewTestEnv()
49+
defer env.Close()
50+
box := iot.BoxForEvent(env.ObjectBox)
5151

5252
err := box.RemoveAll()
5353
assert.NoErr(t, err)
@@ -93,7 +93,7 @@ func concurrentInsert(t *testing.T, count, concurrency int, putAsync bool) {
9393
t.Log("waiting for all goroutines to finish")
9494
wg.Wait()
9595

96-
assert.NoErr(t, objectBox.AwaitAsyncCompletion())
96+
assert.NoErr(t, env.ObjectBox.AwaitAsyncCompletion())
9797

9898
t.Log("validating counts")
9999
if len(errors) != 0 {

test/generator/file-io.go

+46-8
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,28 @@
1717
package generator
1818

1919
import (
20+
"fmt"
2021
"io/ioutil"
2122
"os"
23+
"path/filepath"
2224
)
2325

24-
func copyFile(sourceFile, targetFile string) error {
26+
func copyFile(sourceFile, targetFile string, permsOverride os.FileMode) error {
2527
data, err := ioutil.ReadFile(sourceFile)
2628
if err != nil {
2729
return err
2830
}
2931

3032
// copy permissions either from the existing target file or from the source file
31-
var perm os.FileMode
32-
if info, _ := os.Stat(targetFile); info != nil {
33-
perm = info.Mode()
34-
} else if info, err := os.Stat(sourceFile); info != nil {
35-
perm = info.Mode()
36-
} else {
37-
return err
33+
var perm os.FileMode = permsOverride
34+
if perm == 0 {
35+
if info, _ := os.Stat(targetFile); info != nil {
36+
perm = info.Mode()
37+
} else if info, err := os.Stat(sourceFile); info != nil {
38+
perm = info.Mode()
39+
} else {
40+
return err
41+
}
3842
}
3943

4044
err = ioutil.WriteFile(targetFile, data, perm)
@@ -49,3 +53,37 @@ func fileExists(path string) bool {
4953
_, err := os.Stat(path)
5054
return !os.IsNotExist(err)
5155
}
56+
57+
func copyDirectory(sourceDir, targetDir string, dirPerms, filePerms os.FileMode) error {
58+
if err := os.MkdirAll(targetDir, dirPerms); err != nil {
59+
return err
60+
}
61+
62+
entries, err := ioutil.ReadDir(sourceDir)
63+
if err != nil {
64+
return err
65+
}
66+
67+
for _, entry := range entries {
68+
sourcePath := filepath.Join(sourceDir, entry.Name())
69+
targetPath := filepath.Join(targetDir, entry.Name())
70+
71+
info, err := os.Stat(sourcePath)
72+
if err != nil {
73+
return err
74+
}
75+
76+
if info.IsDir() {
77+
if err := copyDirectory(sourcePath, targetPath, dirPerms, filePerms); err != nil {
78+
return err
79+
}
80+
} else if info.Mode().IsRegular() {
81+
if err := copyFile(sourcePath, targetPath, filePerms); err != nil {
82+
return err
83+
}
84+
} else {
85+
return fmt.Errorf("not a regular file or directory: %s", sourcePath)
86+
}
87+
}
88+
return nil
89+
}

test/generator/test-all.go

+70-8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ import (
3434
"github.com/objectbox/objectbox-go/test/build"
3535
)
3636

37+
// this containing module name - used for test case modules
38+
const moduleName = "github.com/objectbox/objectbox-go"
39+
3740
// generateAllDirs walks through the "data" and generates bindings for each subdirectory
3841
// set overwriteExpected to TRUE to update all ".expected" files with the generated content
3942
func generateAllDirs(t *testing.T, overwriteExpected bool) {
@@ -54,7 +57,57 @@ func generateAllDirs(t *testing.T, overwriteExpected bool) {
5457
}
5558
}
5659

57-
func generateOneDir(t *testing.T, overwriteExpected bool, dir string) {
60+
func generateOneDir(t *testing.T, overwriteExpected bool, srcDir string) {
61+
var dir = srcDir
62+
63+
var errorTransformer = func(err error) error {
64+
return err
65+
}
66+
67+
var cleanup = func() {}
68+
defer func() {
69+
cleanup()
70+
}()
71+
72+
// Test in a temporary directory - if tested by an end user, the repo is read-only.
73+
// This doesn't apply if overwriteExpected is set, as that's only supposed to be run during this lib's development.
74+
if !overwriteExpected {
75+
tempRoot, err := ioutil.TempDir("", "objectbox-generator-test")
76+
assert.NoErr(t, err)
77+
78+
// we can't defer directly because compilation step is run in a separate goroutine after this function exits
79+
cleanup = func() {
80+
assert.NoErr(t, os.RemoveAll(tempRoot))
81+
}
82+
83+
// copy the source dir, including the relative paths (to make sure expected errors contain same paths)
84+
var tempDir = filepath.Join(tempRoot, srcDir)
85+
assert.NoErr(t, copyDirectory(srcDir, tempDir, 0700, 0600))
86+
t.Logf("Testing in a temporary directory %s", tempDir)
87+
88+
// When outside of the project's directory, we need to set up the whole temp dir as its own module, otherwise
89+
// it won't find this `objectbox-go`. Therefore, we create a go.mod file pointing it to the right path.
90+
cwd, err := os.Getwd()
91+
assert.NoErr(t, err)
92+
var modulePath = "example.com/virtual/objectbox-go/test/generator/" + srcDir
93+
var goMod = "module " + modulePath + "\n" +
94+
"replace " + moduleName + " => " + filepath.Join(cwd, "/../../") + "\n" +
95+
"require " + moduleName + " v0.0.0"
96+
assert.NoErr(t, ioutil.WriteFile(path.Join(tempDir, "go.mod"), []byte(goMod), 0600))
97+
98+
// NOTE: we can't change directory using os.Chdir() because it applies to a process/thread, not a goroutine.
99+
// Therefore, we just map paths in received errors, so they match the expected ones.
100+
dir = tempDir
101+
errorTransformer = func(err error) error {
102+
if err == nil {
103+
return nil
104+
}
105+
var str = strings.Replace(err.Error(), tempRoot+string(os.PathSeparator), "", -1)
106+
str = strings.Replace(str, modulePath, moduleName+"/test/generator/"+srcDir, -1)
107+
return errors.New(str)
108+
}
109+
}
110+
58111
modelInfoFile := generator.ModelInfoFile(dir)
59112
modelInfoExpectedFile := modelInfoFile + ".expected"
60113

@@ -76,18 +129,23 @@ func generateOneDir(t *testing.T, overwriteExpected bool, dir string) {
76129
initialFiles, err := filepath.Glob(filepath.Join(dir, "*.initial"))
77130
assert.NoErr(t, err)
78131
for _, initialFile := range initialFiles {
79-
assert.NoErr(t, copyFile(initialFile, initialFile[0:len(initialFile)-len(".initial")]))
132+
assert.NoErr(t, copyFile(initialFile, initialFile[0:len(initialFile)-len(".initial")], 0))
80133
}
81134

82-
generateAllFiles(t, overwriteExpected, dir, modelInfoFile)
135+
generateAllFiles(t, overwriteExpected, dir, modelInfoFile, errorTransformer)
83136

84137
assertSameFile(t, modelInfoFile, modelInfoExpectedFile, overwriteExpected)
85138
assertSameFile(t, modelFile, modelExpectedFile, overwriteExpected)
86139
}
87140

88141
// verify the result can be built
89142
if !testing.Short() {
143+
// override the defer to prevent cleanup before compilation is actually run
144+
var cleanupAfterCompile = cleanup
145+
cleanup = func() {}
146+
90147
t.Run("compile", func(t *testing.T) {
148+
defer cleanupAfterCompile()
91149
t.Parallel()
92150

93151
var expectedError error
@@ -97,7 +155,7 @@ func generateOneDir(t *testing.T, overwriteExpected bool, dir string) {
97155
expectedError = errors.New(string(content))
98156
}
99157

100-
stdOut, stdErr, err := build.Package("./" + dir)
158+
stdOut, stdErr, err := build.Package(dir)
101159
if err == nil && expectedError == nil {
102160
// successful
103161
return
@@ -107,7 +165,11 @@ func generateOneDir(t *testing.T, overwriteExpected bool, dir string) {
107165
assert.Failf(t, "Unexpected PASS during compilation")
108166
}
109167

110-
var receivedError = fmt.Errorf("%s\n%s\n%s", stdOut, stdErr, err)
168+
// On Windows, we're getting a `go finding` message during the build - remove it to be consistent.
169+
var reg = regexp.MustCompile("go: finding " + moduleName + " v0.0.0[ \r\n]+")
170+
stdErr = reg.ReplaceAll(stdErr, nil)
171+
172+
var receivedError = errorTransformer(fmt.Errorf("%s\n%s\n%s", stdOut, stdErr, err))
111173

112174
// Fix paths in the error output on Windows so that it matches the expected error (which always uses '/').
113175
if os.PathSeparator != '/' {
@@ -137,7 +199,7 @@ func assertSameFile(t *testing.T, file string, expectedFile string, overwriteExp
137199
assert.NoErr(t, err)
138200

139201
if overwriteExpected {
140-
assert.NoErr(t, copyFile(file, expectedFile))
202+
assert.NoErr(t, copyFile(file, expectedFile, 0))
141203
}
142204

143205
contentExpected, err := ioutil.ReadFile(expectedFile)
@@ -148,7 +210,7 @@ func assertSameFile(t *testing.T, file string, expectedFile string, overwriteExp
148210
}
149211
}
150212

151-
func generateAllFiles(t *testing.T, overwriteExpected bool, dir string, modelInfoFile string) {
213+
func generateAllFiles(t *testing.T, overwriteExpected bool, dir string, modelInfoFile string, errorTransformer func(error) error) {
152214
var modelFile = generator.ModelFile(modelInfoFile)
153215

154216
// remove generated files during development (they might be syntactically wrong)
@@ -176,7 +238,7 @@ func generateAllFiles(t *testing.T, overwriteExpected bool, dir string, modelInf
176238

177239
t.Logf(" %s", filepath.Base(sourceFile))
178240

179-
err = generator.Process(sourceFile, getOptions(t, sourceFile, modelInfoFile))
241+
err = errorTransformer(generator.Process(sourceFile, getOptions(t, sourceFile, modelInfoFile)))
180242

181243
// handle negative test
182244
var shouldFail = strings.HasSuffix(filepath.Base(sourceFile), ".fail.go")
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

22
# github.com/objectbox/objectbox-go/test/generator/testdata/property-update
3-
testdata/property-update/objectbox-model.go:16:24: undefined: ABinding
3+
./objectbox-model.go:16:24: undefined: ABinding
44

55
exit status 2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

22
# github.com/objectbox/objectbox-go/test/generator/testdata/rename-property
3-
testdata/rename-property/objectbox-model.go:16:24: undefined: CBinding
3+
./objectbox-model.go:16:24: undefined: CBinding
44

55
exit status 2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11

22
# github.com/objectbox/objectbox-go/test/generator/testdata/rename-relation
3-
testdata/rename-relation/objectbox-model.go:22:24: undefined: NegTaskRelIdBinding
4-
testdata/rename-relation/objectbox-model.go:23:24: undefined: NegTaskRelPtrBinding
5-
testdata/rename-relation/objectbox-model.go:24:24: undefined: NegTaskRelValueBinding
6-
testdata/rename-relation/objectbox-model.go:25:24: undefined: NegTaskRelEmbeddedBinding
7-
testdata/rename-relation/objectbox-model.go:26:24: undefined: NegTaskRelManyPtrBinding
8-
testdata/rename-relation/objectbox-model.go:27:24: undefined: NegTaskRelManyValueBinding
3+
./objectbox-model.go:22:24: undefined: NegTaskRelIdBinding
4+
./objectbox-model.go:23:24: undefined: NegTaskRelPtrBinding
5+
./objectbox-model.go:24:24: undefined: NegTaskRelValueBinding
6+
./objectbox-model.go:25:24: undefined: NegTaskRelEmbeddedBinding
7+
./objectbox-model.go:26:24: undefined: NegTaskRelManyPtrBinding
8+
./objectbox-model.go:27:24: undefined: NegTaskRelManyValueBinding
99

1010
exit status 2

0 commit comments

Comments
 (0)