gitlab.com/angaz/sqlite@v1.0.0/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 // import "modernc.org/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", "modernc.org/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", "modernc.org/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", "modernc.org/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, "modernc.org/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, "modernc.org/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  }