diff options
Diffstat (limited to 'db_test.go')
-rw-r--r-- | db_test.go | 90 |
1 files changed, 56 insertions, 34 deletions
@@ -45,7 +45,7 @@ type meta struct { _ uint32 _ [16]byte _ uint64 - _ uint64 + pgid uint64 _ uint64 checksum uint64 } @@ -85,20 +85,15 @@ func TestOpen_ErrNotExists(t *testing.T) { } } -// Ensure that opening a file with wrong checksum returns ErrChecksum. -func TestOpen_ErrChecksum(t *testing.T) { - buf := make([]byte, pageSize) - meta := (*meta)(unsafe.Pointer(&buf[0])) - meta.magic = magic - meta.version = version - meta.checksum = 123 - +// Ensure that opening a file that is not a Bolt database returns ErrInvalid. +func TestOpen_ErrInvalid(t *testing.T) { path := tempfile() + f, err := os.Create(path) if err != nil { t.Fatal(err) } - if _, err := f.WriteAt(buf, pageHeaderSize); err != nil { + if _, err := fmt.Fprintln(f, "this is not a bolt database"); err != nil { t.Fatal(err) } if err := f.Close(); err != nil { @@ -106,54 +101,81 @@ func TestOpen_ErrChecksum(t *testing.T) { } defer os.Remove(path) - if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrChecksum { + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrInvalid { t.Fatalf("unexpected error: %s", err) } } -// Ensure that opening a file that is not a Bolt database returns ErrInvalid. -func TestOpen_ErrInvalid(t *testing.T) { - path := tempfile() +// Ensure that opening a file with two invalid versions returns ErrVersionMismatch. +func TestOpen_ErrVersionMismatch(t *testing.T) { + if pageSize != os.Getpagesize() { + t.Skip("page size mismatch") + } - f, err := os.Create(path) - if err != nil { + // Create empty database. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + // Close database. + if err := db.DB.Close(); err != nil { t.Fatal(err) } - if _, err := fmt.Fprintln(f, "this is not a bolt database"); err != nil { + + // Read data file. + buf, err := ioutil.ReadFile(path) + if err != nil { t.Fatal(err) } - if err := f.Close(); err != nil { + + // Rewrite meta pages. + meta0 := (*meta)(unsafe.Pointer(&buf[pageHeaderSize])) + meta0.version++ + meta1 := (*meta)(unsafe.Pointer(&buf[pageSize+pageHeaderSize])) + meta1.version++ + if err := ioutil.WriteFile(path, buf, 0666); err != nil { t.Fatal(err) } - defer os.Remove(path) - if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrInvalid { + // Reopen data file. + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrVersionMismatch { t.Fatalf("unexpected error: %s", err) } } -// Ensure that opening a file created with a different version of Bolt returns -// ErrVersionMismatch. -func TestOpen_ErrVersionMismatch(t *testing.T) { - buf := make([]byte, pageSize) - meta := (*meta)(unsafe.Pointer(&buf[0])) - meta.magic = magic - meta.version = version + 100 +// Ensure that opening a file with two invalid checksums returns ErrChecksum. +func TestOpen_ErrChecksum(t *testing.T) { + if pageSize != os.Getpagesize() { + t.Skip("page size mismatch") + } - path := tempfile() - f, err := os.Create(path) - if err != nil { + // Create empty database. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + // Close database. + if err := db.DB.Close(); err != nil { t.Fatal(err) } - if _, err := f.WriteAt(buf, pageHeaderSize); err != nil { + + // Read data file. + buf, err := ioutil.ReadFile(path) + if err != nil { t.Fatal(err) } - if err := f.Close(); err != nil { + + // Rewrite meta pages. + meta0 := (*meta)(unsafe.Pointer(&buf[pageHeaderSize])) + meta0.pgid++ + meta1 := (*meta)(unsafe.Pointer(&buf[pageSize+pageHeaderSize])) + meta1.pgid++ + if err := ioutil.WriteFile(path, buf, 0666); err != nil { t.Fatal(err) } - defer os.Remove(path) - if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrVersionMismatch { + // Reopen data file. + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrChecksum { t.Fatalf("unexpected error: %s", err) } } |