aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/db/db_test.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-06-01 18:54:42 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-06-03 10:41:09 +0200
commitea2295f3e29c59b4493e98aaafc28f9083d5e570 (patch)
treea9c3b1f3c2cf40a9a6aa98afd4e5ad75442c249c /pkg/db/db_test.go
parent23b94422d32946ab68a4f1423274bf4daa33cef9 (diff)
pkg/db: move from db
Diffstat (limited to 'pkg/db/db_test.go')
-rw-r--r--pkg/db/db_test.go151
1 files changed, 151 insertions, 0 deletions
diff --git a/pkg/db/db_test.go b/pkg/db/db_test.go
new file mode 100644
index 000000000..ccddb806a
--- /dev/null
+++ b/pkg/db/db_test.go
@@ -0,0 +1,151 @@
+// Copyright 2017 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+package db
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "math/rand"
+ "os"
+ "testing"
+)
+
+func TestBasic(t *testing.T) {
+ fn := tempFile(t)
+ defer os.Remove(fn)
+ db, err := Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ if len(db.Records) != 0 {
+ t.Fatalf("empty db contains records")
+ }
+ db.Save("", nil, 0)
+ db.Save("1", []byte("ab"), 1)
+ db.Save("23", []byte("abcd"), 2)
+ checkContents := func(where string) {
+ if len(db.Records) != 3 {
+ t.Fatalf("bad record count %v %v, want 3", where, len(db.Records))
+ }
+ for key, rec := range db.Records {
+ switch key {
+ case "":
+ if len(rec.Val) == 0 && rec.Seq == 0 {
+ return
+ }
+ case "1":
+ if bytes.Equal(rec.Val, []byte("ab")) && rec.Seq == 1 {
+ return
+ }
+ case "23":
+ if bytes.Equal(rec.Val, []byte("abcd")) && rec.Seq == 2 {
+ return
+ }
+ default:
+ t.Fatalf("unknown key: %v", key)
+ }
+ t.Fatalf("bad record for key %v: %+v", key, rec)
+ }
+ }
+ checkContents("after save")
+ if err := db.Flush(); err != nil {
+ t.Fatalf("failed to flush db: %v", err)
+ }
+ checkContents("after flush")
+ db, err = Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ checkContents("after reopen")
+}
+
+func TestModify(t *testing.T) {
+ fn := tempFile(t)
+ defer os.Remove(fn)
+ db, err := Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ db.Save("1", []byte("ab"), 0)
+ db.Save("23", nil, 1)
+ db.Save("456", []byte("abcd"), 1)
+ db.Save("7890", []byte("a"), 0)
+ db.Delete("23")
+ db.Save("1", nil, 5)
+ db.Save("456", []byte("ef"), 6)
+ db.Delete("7890")
+ db.Save("456", []byte("efg"), 0)
+ db.Save("7890", []byte("bc"), 0)
+ checkContents := func(where string) {
+ if len(db.Records) != 3 {
+ t.Fatalf("bad record count %v %v, want 3", where, len(db.Records))
+ }
+ for key, rec := range db.Records {
+ switch key {
+ case "1":
+ if len(rec.Val) == 0 && rec.Seq == 5 {
+ return
+ }
+ case "456":
+ if bytes.Equal(rec.Val, []byte("efg")) && rec.Seq == 0 {
+ return
+ }
+ case "7890":
+ if bytes.Equal(rec.Val, []byte("bc")) && rec.Seq == 0 {
+ return
+ }
+ default:
+ t.Fatalf("unknown key: %v", key)
+ }
+ t.Fatalf("bad record for key %v: %+v", key, rec)
+ }
+ }
+ checkContents("after modification")
+ if err := db.Flush(); err != nil {
+ t.Fatalf("failed to flush db: %v", err)
+ }
+ checkContents("after flush")
+ db, err = Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ checkContents("after reopen")
+}
+
+func TestLarge(t *testing.T) {
+ fn := tempFile(t)
+ defer os.Remove(fn)
+ db, err := Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ const nrec = 1000
+ val := make([]byte, 1000)
+ for i := range val {
+ val[i] = byte(rand.Intn(256))
+ }
+ for i := 0; i < nrec; i++ {
+ db.Save(fmt.Sprintf("%v", i), val, 0)
+ }
+ if err := db.Flush(); err != nil {
+ t.Fatalf("failed to flush db: %v", err)
+ }
+ db, err = Open(fn)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ if len(db.Records) != nrec {
+ t.Fatalf("wrong record count: %v, want %v", len(db.Records), nrec)
+ }
+}
+
+func tempFile(t *testing.T) string {
+ f, err := ioutil.TempFile("", "syzkaller.test.db")
+ if err != nil {
+ t.Fatalf("failed to create temp file: %v", err)
+ }
+ f.Close()
+ return f.Name()
+}