0
0
mirror of https://gitlab.com/cznic/sqlite.git synced 2025-05-17 23:26:41 +00:00
Files
2018-11-06 18:03:25 +01:00

274 lines
5.4 KiB
Go

// 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 "modernc.org/sqlite"
import (
"bytes"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"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", "modernc.org/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", "modernc.org/sqlite/internal/threadtest1").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
out, err := exec.Command("./threadtest1", "10").CombinedOutput()
t.Logf("%s", out)
if err != nil {
t.Fatal(err)
}
}
func TestThread2(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", "threadtest2", "modernc.org/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, "modernc.org/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()
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) {
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, "modernc.org/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"},
} {
out, err := exec.Command("./threadtest4", append(opts, "5")...).CombinedOutput()
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.Fatalf("case %v: fault", cases)
}
cases++
}
t.Logf("cases: %v", cases)
}