94 lines
1.8 KiB
Go
94 lines
1.8 KiB
Go
package storage
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"net"
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
)
|
|
|
|
type mock struct {
|
|
m map[string][]byte
|
|
}
|
|
|
|
func (mock *mock) Get(key string) ([]byte, error) {
|
|
v, ok := mock.m[key]
|
|
if ok {
|
|
return v, nil
|
|
}
|
|
return nil, ErrNotFound
|
|
}
|
|
|
|
func (mock *mock) Set(key string, value []byte) error {
|
|
mock.m[key] = value
|
|
return nil
|
|
}
|
|
|
|
func (mock *mock) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func TestImplementations(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "storage_tests_")
|
|
if err != nil {
|
|
t.Fatalf("cannot create temp dir: %v", err)
|
|
return
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
cases := make([]DB, 0)
|
|
cases = append(cases, &mock{m: make(map[string][]byte)})
|
|
cases = append(cases, NewMap())
|
|
|
|
if bolt, err := NewBolt(path.Join(dir, "bolt")); err != nil {
|
|
t.Errorf("cannot make bolt: %v", err)
|
|
} else {
|
|
cases = append(cases, bolt)
|
|
}
|
|
|
|
if leveldb, err := NewLevelDB(path.Join(dir, "leveldb")); err != nil {
|
|
t.Errorf("cannot make leveldb: %v", err)
|
|
} else {
|
|
cases = append(cases, leveldb)
|
|
}
|
|
|
|
riakLN, err := net.Listen("tcp", "localhost:8087")
|
|
if err == nil {
|
|
defer riakLN.Close()
|
|
go func() {
|
|
for {
|
|
conn, err := riakLN.Accept()
|
|
if err == nil {
|
|
conn.Close()
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
if riak, err := NewRiak("localhost:8087"); err != nil {
|
|
t.Errorf("cannot make riak: %v", err)
|
|
} else {
|
|
cases = append(cases, riak)
|
|
}
|
|
|
|
validKey := "key"
|
|
validValue := []byte("value")
|
|
|
|
for _, db := range cases {
|
|
if err := db.Set(validKey, validValue); err != nil {
|
|
t.Errorf("cannot set %T: %v", db, err)
|
|
}
|
|
if v, err := db.Get(validKey); err != nil {
|
|
t.Errorf("cannot get %T: %v", db, err)
|
|
} else if !bytes.Equal(v, validValue) {
|
|
t.Errorf("wrong get %T: %q vs %q", db, v, validValue)
|
|
} else {
|
|
t.Logf("%18T GET: %s", db, v)
|
|
}
|
|
if err := db.Close(); err != nil {
|
|
t.Errorf("cannot close %T: %v", db, err)
|
|
}
|
|
}
|
|
}
|