package filestorage
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
crypto "github.com/tendermint/go-crypto"
|
|
keys "github.com/tendermint/go-crypto/keys"
|
|
)
|
|
|
|
func TestBasicCRUD(t *testing.T) {
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
dir, err := ioutil.TempDir("", "filestorage-test")
|
|
assert.Nil(err)
|
|
defer os.RemoveAll(dir)
|
|
store := New(dir)
|
|
|
|
name := "bar"
|
|
key := []byte("secret-key-here")
|
|
salt := []byte("salt-here")
|
|
pubkey := crypto.GenPrivKeyEd25519().PubKey()
|
|
info := keys.Info{
|
|
Name: name,
|
|
PubKey: pubkey.Wrap(),
|
|
}
|
|
|
|
// No data: Get and Delete return nothing
|
|
_, _, _, err = store.Get(name)
|
|
assert.NotNil(err)
|
|
err = store.Delete(name)
|
|
assert.NotNil(err)
|
|
// List returns empty list
|
|
l, err := store.List()
|
|
assert.Nil(err)
|
|
assert.Empty(l)
|
|
|
|
// Putting the key in the store must work
|
|
err = store.Put(name, salt, key, info)
|
|
assert.Nil(err)
|
|
// But a second time is a failure
|
|
err = store.Put(name, salt, key, info)
|
|
assert.NotNil(err)
|
|
|
|
// Now, we can get and list properly
|
|
_, k, i, err := store.Get(name)
|
|
require.Nil(err, "%+v", err)
|
|
assert.Equal(key, k)
|
|
assert.Equal(info.Name, i.Name)
|
|
assert.Equal(info.PubKey, i.PubKey)
|
|
assert.NotEmpty(i.Address)
|
|
l, err = store.List()
|
|
require.Nil(err, "%+v", err)
|
|
assert.Equal(1, len(l))
|
|
assert.Equal(i, l[0])
|
|
|
|
// querying a non-existent key fails
|
|
_, _, _, err = store.Get("badname")
|
|
assert.NotNil(err)
|
|
|
|
// We can only delete once
|
|
err = store.Delete(name)
|
|
assert.Nil(err)
|
|
err = store.Delete(name)
|
|
assert.NotNil(err)
|
|
|
|
// and then Get and List don't work
|
|
_, _, _, err = store.Get(name)
|
|
assert.NotNil(err)
|
|
// List returns empty list
|
|
l, err = store.List()
|
|
assert.Nil(err)
|
|
assert.Empty(l)
|
|
}
|
|
|
|
func TestDirectoryHandling(t *testing.T) {
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
// prepare a temp dir and make sure it is not there
|
|
newDir := path.Join(os.TempDir(), "file-test-dir")
|
|
_, err := os.Open(newDir)
|
|
assert.True(os.IsNotExist(err))
|
|
defer os.RemoveAll(newDir)
|
|
|
|
// now, check with two levels deep....
|
|
parentDir := path.Join(os.TempDir(), "missing-dir")
|
|
nestedDir := path.Join(parentDir, "lots", "of", "levels", "here")
|
|
_, err = os.Open(parentDir)
|
|
assert.True(os.IsNotExist(err))
|
|
defer os.RemoveAll(parentDir)
|
|
|
|
// create a new storage, and verify it creates the directory with good permissions
|
|
for _, dir := range []string{newDir, nestedDir, newDir} {
|
|
New(dir)
|
|
d, err := os.Open(dir)
|
|
require.Nil(err)
|
|
defer d.Close()
|
|
|
|
stat, err := d.Stat()
|
|
require.Nil(err)
|
|
assert.Equal(dirPerm, stat.Mode()&os.ModePerm)
|
|
}
|
|
}
|