12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // Copyright (C) 2019 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package backend
- import "testing"
- // testBackendBehavior is the generic test suite that must be fulfilled by
- // every backend implementation. It should be called by each implementation
- // as (part of) their test suite.
- func testBackendBehavior(t *testing.T, open func() Backend) {
- t.Run("WriteIsolation", func(t *testing.T) { testWriteIsolation(t, open) })
- t.Run("DeleteNonexisten", func(t *testing.T) { testDeleteNonexistent(t, open) })
- t.Run("IteratorClosedDB", func(t *testing.T) { testIteratorClosedDB(t, open) })
- }
- func testWriteIsolation(t *testing.T, open func() Backend) {
- // Values written during a transaction should not be read back, our
- // updateGlobal depends on this.
- db := open()
- defer db.Close()
- // Sanity check
- _ = db.Put([]byte("a"), []byte("a"))
- v, _ := db.Get([]byte("a"))
- if string(v) != "a" {
- t.Fatal("read back should work")
- }
- // Now in a transaction we should still see the old value
- tx, _ := db.NewWriteTransaction()
- defer tx.Release()
- _ = tx.Put([]byte("a"), []byte("b"))
- v, _ = tx.Get([]byte("a"))
- if string(v) != "a" {
- t.Fatal("read in transaction should read the old value")
- }
- }
- func testDeleteNonexistent(t *testing.T, open func() Backend) {
- // Deleting a non-existent key is not an error
- db := open()
- defer db.Close()
- err := db.Delete([]byte("a"))
- if err != nil {
- t.Error(err)
- }
- }
- // Either creating the iterator or the .Error() method of the returned iterator
- // should return an error and IsClosed(err) == true.
- func testIteratorClosedDB(t *testing.T, open func() Backend) {
- db := open()
- _ = db.Put([]byte("a"), []byte("a"))
- db.Close()
- it, err := db.NewPrefixIterator(nil)
- if err != nil {
- if !IsClosed(err) {
- t.Error("NewPrefixIterator: IsClosed(err) == false:", err)
- }
- return
- }
- it.Next()
- if err := it.Error(); !IsClosed(err) {
- t.Error("Next: IsClosed(err) == false:", err)
- }
- }
|