aboutsummaryrefslogtreecommitdiff
path: root/z_linux_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'z_linux_test.go')
-rw-r--r--z_linux_test.go287
1 files changed, 287 insertions, 0 deletions
diff --git a/z_linux_test.go b/z_linux_test.go
new file mode 100644
index 0000000..9089fd8
--- /dev/null
+++ b/z_linux_test.go
@@ -0,0 +1,287 @@
+// Copyright 2017 The Sqlite Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sqlite
+
+import (
+ "bytes"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strconv"
+ "testing"
+)
+
+func TestMP(t *testing.T) {
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.RemoveAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ wd, err := os.Getwd()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.Chdir(wd); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ if err := os.Chdir(dir); err != nil {
+ t.Fatal(err)
+ }
+
+ if out, err := exec.Command("go", "build", "-o", "mptest", "github.com/cznic/sqlite/internal/mptest").CombinedOutput(); err != nil {
+ t.Fatalf("go build mptest: %s\n%s", err, out)
+ }
+
+ pat := filepath.Join(wd, filepath.FromSlash("testdata/mptest"), "*.test")
+ m, err := filepath.Glob(pat)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if len(m) == 0 {
+ t.Fatalf("%s: no files", pat)
+ }
+
+ nm := filepath.FromSlash("./mptest")
+ for _, v := range m {
+ os.Remove("db")
+ out, err := exec.Command(nm, "db", v).CombinedOutput()
+ t.Logf("%s", out)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+}
+
+func TestThread1(t *testing.T) {
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.RemoveAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ wd, err := os.Getwd()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.Chdir(wd); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ if err := os.Chdir(dir); err != nil {
+ t.Fatal(err)
+ }
+
+ if out, err := exec.Command("go", "build", "-o", "threadtest1", "github.com/cznic/sqlite/internal/threadtest1").CombinedOutput(); err != nil {
+ t.Fatalf("go build mptest: %s\n%s", err, out)
+ }
+
+ for i := 0; i <= 20; i++ {
+ out, err := exec.Command("./threadtest1", strconv.Itoa(i), "-v").CombinedOutput()
+ t.Logf("%v:\n%s", i, out)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+}
+
+func TestThread2(t *testing.T) {
+ t.Log("TODO")
+ return //TODO-
+
+ //TODO sqlite3.c:143403: createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); -> fatal error: bad pointer in write barrier
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.RemoveAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ wd, err := os.Getwd()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.Chdir(wd); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ if err := os.Chdir(dir); err != nil {
+ t.Fatal(err)
+ }
+
+ if out, err := exec.Command("go", "build", "-o", "threadtest2", "github.com/cznic/sqlite/internal/threadtest2").CombinedOutput(); err != nil {
+ t.Fatalf("go build mptest: %s\n%s", err, out)
+ }
+
+ out, err := exec.Command("./threadtest2").CombinedOutput()
+ t.Logf("%s", out)
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestThread3(t *testing.T) {
+ t.Log("TODO")
+ return //TODO-
+
+ //TODO sqlite3.c:142510: sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); -> fatal error: bad pointer in write barrier
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.RemoveAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ wd, err := os.Getwd()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.Chdir(wd); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ if err := os.Chdir(dir); err != nil {
+ t.Fatal(err)
+ }
+
+ s := []string{"build", "-o", "threadtest3"}
+ if *memTrace {
+ s = append(s, "-tags", "memory.trace", "-race")
+ }
+ if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest3")...).CombinedOutput(); err != nil {
+ t.Fatalf("go build mptest: %s\n%s", err, out)
+ }
+
+ for _, opts := range [][]string{
+ {"walthread1"},
+ {"walthread2"},
+ {"walthread3"},
+ {"walthread4"},
+ {"walthread5"},
+ {"cgt_pager_1"},
+ {"dynamic_triggers"},
+ {"checkpoint_starvation_1"},
+ {"checkpoint_starvation_2"},
+ {"create_drop_index_1"},
+ {"lookaside1"},
+ {"vacuum1"},
+ {"stress1"},
+ {"stress2"},
+ } {
+ out, err := exec.Command("./threadtest3", opts...).CombinedOutput()
+ dbg("%v\n%s", opts, out)
+ t.Logf("%v\n%s", opts, out)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if bytes.Contains(out, []byte("fault address")) ||
+ bytes.Contains(out, []byte("data race")) ||
+ bytes.Contains(out, []byte("RACE")) {
+ t.Fatal("fault")
+ }
+ }
+}
+
+func TestThread4(t *testing.T) {
+ t.Log("TODO")
+ return //TODO-
+
+ //TODO sqlite3.c:143403: createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); -> fatal error: bad pointer in write barrier
+ cases := 0
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.RemoveAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ wd, err := os.Getwd()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ if err := os.Chdir(wd); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ if err := os.Chdir(dir); err != nil {
+ t.Fatal(err)
+ }
+
+ s := []string{"build", "-o", "threadtest4"}
+ if *memTrace {
+ s = append(s, "-tags", "memory.trace", "-race")
+ }
+ if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest4")...).CombinedOutput(); err != nil {
+ t.Fatalf("go build mptest: %s\n%s", err, out)
+ }
+
+ for _, opts := range [][]string{
+ {},
+ {"-wal"},
+ {"-serialized"},
+ {"-serialized", "-wal"},
+ {"--multithread"},
+ {"--multithread", "-wal"},
+ {"--multithread", "-serialized"},
+ {"--multithread", "-serialized", "-wal"},
+ } {
+ for i := 2; i <= 20; i++ {
+ out, err := exec.Command("./threadtest4", append(opts, strconv.Itoa(i))...).CombinedOutput()
+ t.Logf("%v: %v\n%s", i, opts, out)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if bytes.Contains(out, []byte("fault address")) ||
+ bytes.Contains(out, []byte("data race")) ||
+ bytes.Contains(out, []byte("RACE")) {
+ t.Fatalf("case %v: fault", cases)
+ }
+ cases++
+ }
+ }
+ t.Logf("cases: %v", cases)
+}