|
Packit Service |
4d2de5 |
package jsondb_test
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
import (
|
|
Packit Service |
4d2de5 |
"io/ioutil"
|
|
Packit Service |
4d2de5 |
"os"
|
|
Packit Service |
4d2de5 |
"path"
|
|
Packit Service |
4d2de5 |
"testing"
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
"github.com/stretchr/testify/assert"
|
|
Packit Service |
4d2de5 |
"github.com/stretchr/testify/require"
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
"github.com/osbuild/osbuild-composer/internal/jsondb"
|
|
Packit Service |
4d2de5 |
)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
type document struct {
|
|
Packit Service |
4d2de5 |
Animal string `json:"animal"`
|
|
Packit Service |
4d2de5 |
CanSwim bool `json:"can-swim"`
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func cleanupTempDir(t *testing.T, dir string) {
|
|
Packit Service |
4d2de5 |
err := os.RemoveAll(dir)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// If the passed directory is not readable (writable), we should notice on the
|
|
Packit Service |
4d2de5 |
// first read (write).
|
|
Packit Service |
4d2de5 |
func TestDegenerate(t *testing.T) {
|
|
Packit Service |
4d2de5 |
t.Run("no-exist", func(t *testing.T) {
|
|
Packit Service |
4d2de5 |
db := jsondb.New("/non-existant-directory", 0755)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
var d document
|
|
Packit Service |
4d2de5 |
exist, err := db.Read("one", &d)
|
|
Packit Service |
4d2de5 |
assert.False(t, exist)
|
|
Packit Service |
4d2de5 |
assert.NoError(t, err)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
err = db.Write("one", &d)
|
|
Packit Service |
4d2de5 |
assert.Error(t, err)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
l, err := db.List()
|
|
Packit Service |
4d2de5 |
assert.Error(t, err)
|
|
Packit Service |
4d2de5 |
assert.Nil(t, l)
|
|
Packit Service |
4d2de5 |
})
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
t.Run("invalid-json", func(t *testing.T) {
|
|
Packit Service |
4d2de5 |
dir, err := ioutil.TempDir("", "jsondb-test-")
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
defer cleanupTempDir(t, dir)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
db := jsondb.New(dir, 0755)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// write-only file
|
|
Packit Service |
4d2de5 |
err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0644)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
var d document
|
|
Packit Service |
4d2de5 |
_, err = db.Read("one", &d)
|
|
Packit Service |
4d2de5 |
assert.Error(t, err)
|
|
Packit Service |
4d2de5 |
})
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func TestCorrupt(t *testing.T) {
|
|
Packit Service |
4d2de5 |
dir, err := ioutil.TempDir("", "jsondb-test-")
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
defer cleanupTempDir(t, dir)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0755)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
db := jsondb.New(dir, 0755)
|
|
Packit Service |
4d2de5 |
var d document
|
|
Packit Service |
4d2de5 |
_, err = db.Read("one", &d)
|
|
Packit Service |
4d2de5 |
require.Error(t, err)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func TestRead(t *testing.T) {
|
|
Packit Service |
4d2de5 |
dir, err := ioutil.TempDir("", "jsondb-test-")
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
defer cleanupTempDir(t, dir)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("true"), 0755)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
db := jsondb.New(dir, 0755)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
var b bool
|
|
Packit Service |
4d2de5 |
exists, err := db.Read("one", &b)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.True(t, exists)
|
|
Packit Service |
4d2de5 |
require.True(t, b)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// nil means don't deserialize
|
|
Packit Service |
4d2de5 |
exists, err = db.Read("one", nil)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.True(t, exists)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
b = false
|
|
Packit Service |
4d2de5 |
exists, err = db.Read("two", &b)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.False(t, exists)
|
|
Packit Service |
4d2de5 |
require.False(t, b)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// nil means don't deserialize
|
|
Packit Service |
4d2de5 |
exists, err = db.Read("two", nil)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.False(t, exists)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func TestMultiple(t *testing.T) {
|
|
Packit Service |
4d2de5 |
dir, err := ioutil.TempDir("", "jsondb-test-")
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
defer cleanupTempDir(t, dir)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
perm := os.FileMode(0600)
|
|
Packit Service |
4d2de5 |
documents := map[string]document{
|
|
Packit Service |
4d2de5 |
"one": document{"octopus", true},
|
|
Packit Service |
4d2de5 |
"two": document{"zebra", false},
|
|
Packit Service |
4d2de5 |
"three": document{"clownfish", true},
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
db := jsondb.New(dir, perm)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
for name, doc := range documents {
|
|
Packit Service |
4d2de5 |
err = db.Write(name, doc)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
names, err := db.List()
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.ElementsMatch(t, []string{"one", "two", "three"}, names)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
for name, doc := range documents {
|
|
Packit Service |
4d2de5 |
var d document
|
|
Packit Service |
4d2de5 |
exist, err := db.Read(name, &d)
|
|
Packit Service |
4d2de5 |
require.NoError(t, err)
|
|
Packit Service |
4d2de5 |
require.True(t, exist)
|
|
Packit Service |
4d2de5 |
require.Equalf(t, doc, d, "error retrieving document '%s'", name)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
}
|