github.com/cznic/sqlite@v0.0.0-20181122101901-0b3d034df24f/z_linux_test.go (about) 1 // Copyright 2017 The Sqlite Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package sqlite 6 7 import ( 8 "bytes" 9 "io/ioutil" 10 "os" 11 "os/exec" 12 "path/filepath" 13 "testing" 14 ) 15 16 func TestMP(t *testing.T) { 17 dir, err := ioutil.TempDir("", "sqlite-test-") 18 if err != nil { 19 t.Fatal(err) 20 } 21 22 defer func() { 23 if err := os.RemoveAll(dir); err != nil { 24 t.Fatal(err) 25 } 26 }() 27 28 wd, err := os.Getwd() 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 defer func() { 34 if err := os.Chdir(wd); err != nil { 35 t.Fatal(err) 36 } 37 }() 38 39 if err := os.Chdir(dir); err != nil { 40 t.Fatal(err) 41 } 42 43 if out, err := exec.Command("go", "build", "-o", "mptest", "github.com/cznic/sqlite/internal/mptest").CombinedOutput(); err != nil { 44 t.Fatalf("go build mptest: %s\n%s", err, out) 45 } 46 47 pat := filepath.Join(wd, filepath.FromSlash("testdata/mptest"), "*.test") 48 m, err := filepath.Glob(pat) 49 if err != nil { 50 t.Fatal(err) 51 } 52 53 if len(m) == 0 { 54 t.Fatalf("%s: no files", pat) 55 } 56 57 nm := filepath.FromSlash("./mptest") 58 for _, v := range m { 59 os.Remove("db") 60 out, err := exec.Command(nm, "db", v).CombinedOutput() 61 t.Logf("%s", out) 62 if err != nil { 63 t.Fatal(err) 64 } 65 } 66 } 67 68 func TestThread1(t *testing.T) { 69 dir, err := ioutil.TempDir("", "sqlite-test-") 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 defer func() { 75 if err := os.RemoveAll(dir); err != nil { 76 t.Fatal(err) 77 } 78 }() 79 80 wd, err := os.Getwd() 81 if err != nil { 82 t.Fatal(err) 83 } 84 85 defer func() { 86 if err := os.Chdir(wd); err != nil { 87 t.Fatal(err) 88 } 89 }() 90 91 if err := os.Chdir(dir); err != nil { 92 t.Fatal(err) 93 } 94 95 if out, err := exec.Command("go", "build", "-o", "threadtest1", "github.com/cznic/sqlite/internal/threadtest1").CombinedOutput(); err != nil { 96 t.Fatalf("go build mptest: %s\n%s", err, out) 97 } 98 99 out, err := exec.Command("./threadtest1", "10").CombinedOutput() 100 t.Logf("%s", out) 101 if err != nil { 102 t.Fatal(err) 103 } 104 } 105 106 func TestThread2(t *testing.T) { 107 dir, err := ioutil.TempDir("", "sqlite-test-") 108 if err != nil { 109 t.Fatal(err) 110 } 111 112 defer func() { 113 if err := os.RemoveAll(dir); err != nil { 114 t.Fatal(err) 115 } 116 }() 117 118 wd, err := os.Getwd() 119 if err != nil { 120 t.Fatal(err) 121 } 122 123 defer func() { 124 if err := os.Chdir(wd); err != nil { 125 t.Fatal(err) 126 } 127 }() 128 129 if err := os.Chdir(dir); err != nil { 130 t.Fatal(err) 131 } 132 133 if out, err := exec.Command("go", "build", "-o", "threadtest2", "github.com/cznic/sqlite/internal/threadtest2").CombinedOutput(); err != nil { 134 t.Fatalf("go build mptest: %s\n%s", err, out) 135 } 136 137 out, err := exec.Command("./threadtest2").CombinedOutput() 138 t.Logf("%s", out) 139 if err != nil { 140 t.Fatal(err) 141 } 142 } 143 144 func TestThread3(t *testing.T) { 145 t.Log("TODO") 146 return //TODO- 147 148 //TODO sqlite3.c:142510: sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); -> fatal error: bad pointer in write barrier 149 dir, err := ioutil.TempDir("", "sqlite-test-") 150 if err != nil { 151 t.Fatal(err) 152 } 153 154 defer func() { 155 if err := os.RemoveAll(dir); err != nil { 156 t.Fatal(err) 157 } 158 }() 159 160 wd, err := os.Getwd() 161 if err != nil { 162 t.Fatal(err) 163 } 164 165 defer func() { 166 if err := os.Chdir(wd); err != nil { 167 t.Fatal(err) 168 } 169 }() 170 171 if err := os.Chdir(dir); err != nil { 172 t.Fatal(err) 173 } 174 175 s := []string{"build", "-o", "threadtest3"} 176 if *memTrace { 177 s = append(s, "-tags", "memory.trace", "-race") 178 } 179 if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest3")...).CombinedOutput(); err != nil { 180 t.Fatalf("go build mptest: %s\n%s", err, out) 181 } 182 183 for _, opts := range [][]string{ 184 {"walthread1"}, 185 {"walthread2"}, 186 {"walthread3"}, 187 {"walthread4"}, 188 {"walthread5"}, 189 {"cgt_pager_1"}, 190 {"dynamic_triggers"}, 191 {"checkpoint_starvation_1"}, 192 {"checkpoint_starvation_2"}, 193 {"create_drop_index_1"}, 194 {"lookaside1"}, 195 {"vacuum1"}, 196 {"stress1"}, 197 {"stress2"}, 198 } { 199 out, err := exec.Command("./threadtest3", opts...).CombinedOutput() 200 t.Logf("%v\n%s", opts, out) 201 if err != nil { 202 t.Fatal(err) 203 } 204 205 if bytes.Contains(out, []byte("fault address")) || 206 bytes.Contains(out, []byte("data race")) || 207 bytes.Contains(out, []byte("RACE")) { 208 t.Fatal("fault") 209 } 210 } 211 } 212 213 func TestThread4(t *testing.T) { 214 cases := 0 215 dir, err := ioutil.TempDir("", "sqlite-test-") 216 if err != nil { 217 t.Fatal(err) 218 } 219 220 defer func() { 221 if err := os.RemoveAll(dir); err != nil { 222 t.Fatal(err) 223 } 224 }() 225 226 wd, err := os.Getwd() 227 if err != nil { 228 t.Fatal(err) 229 } 230 231 defer func() { 232 if err := os.Chdir(wd); err != nil { 233 t.Fatal(err) 234 } 235 }() 236 237 if err := os.Chdir(dir); err != nil { 238 t.Fatal(err) 239 } 240 241 s := []string{"build", "-o", "threadtest4"} 242 if *memTrace { 243 s = append(s, "-tags", "memory.trace", "-race") 244 } 245 if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest4")...).CombinedOutput(); err != nil { 246 t.Fatalf("go build mptest: %s\n%s", err, out) 247 } 248 249 for _, opts := range [][]string{ 250 {}, 251 {"-wal"}, 252 {"-serialized"}, 253 {"-serialized", "-wal"}, 254 {"--multithread"}, 255 {"--multithread", "-wal"}, 256 {"--multithread", "-serialized"}, 257 {"--multithread", "-serialized", "-wal"}, 258 } { 259 out, err := exec.Command("./threadtest4", append(opts, "5")...).CombinedOutput() 260 t.Logf("%v\n%s", opts, out) 261 if err != nil { 262 t.Fatal(err) 263 } 264 265 if bytes.Contains(out, []byte("fault address")) || 266 bytes.Contains(out, []byte("data race")) || 267 bytes.Contains(out, []byte("RACE")) { 268 t.Fatalf("case %v: fault", cases) 269 } 270 cases++ 271 } 272 t.Logf("cases: %v", cases) 273 }