mirror of
https://github.com/luxfi/zapdb.git
synced 2026-10-30 15:12:20 +00:00
The module has been github.com/luxfi/zapdb for a while, but the package inside it still declared itself badger, so every consumer had to write zapdb "github.com/luxfi/zapdb" // package badger and the alias existed only to paper over the mismatch. 56 root files and the 134 qualified references inside the repo now say zapdb. Backward compatible in both directions: an existing consumer with the alias keeps compiling (the alias is now merely redundant), and one without it starts compiling instead of failing on an undefined zapdb. Directory badger/ and its cmd package are untouched — that is the CLI, and its binary is named badger. Build and vet clean; suite green except TestZRestore, which wants a /tmp/zb/src benchmark fixture and fails identically without this change. Co-authored-by: Hanzo Dev <[email protected]>
150 lines
4.2 KiB
Go
150 lines
4.2 KiB
Go
/*
|
|
* SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package zapdb
|
|
|
|
import (
|
|
"math/rand"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func getRegistryTestOptions(dir string, key []byte) KeyRegistryOptions {
|
|
return KeyRegistryOptions{
|
|
Dir: dir,
|
|
EncryptionKey: key,
|
|
ReadOnly: false,
|
|
}
|
|
}
|
|
func TestBuildRegistry(t *testing.T) {
|
|
encryptionKey := make([]byte, 32)
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
|
require.NoError(t, err)
|
|
defer removeDir(dir)
|
|
|
|
_, err = rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
opt := getRegistryTestOptions(dir, encryptionKey)
|
|
|
|
kr, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
dk, err := kr.LatestDataKey()
|
|
require.NoError(t, err)
|
|
// We're resetting the last created timestamp. So, it creates
|
|
// new datakey.
|
|
kr.lastCreated = 0
|
|
dk1, err := kr.LatestDataKey()
|
|
// We generated two key. So, checking the length.
|
|
require.Equal(t, 2, len(kr.dataKeys))
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
|
|
kr2, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(kr2.dataKeys))
|
|
// Asserting the correctness of the datakey after opening the registry.
|
|
require.Equal(t, dk.Data, kr.dataKeys[dk.KeyId].Data)
|
|
require.Equal(t, dk1.Data, kr.dataKeys[dk1.KeyId].Data)
|
|
require.NoError(t, kr2.Close())
|
|
}
|
|
|
|
func TestRewriteRegistry(t *testing.T) {
|
|
encryptionKey := make([]byte, 32)
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
|
require.NoError(t, err)
|
|
defer removeDir(dir)
|
|
_, err = rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
opt := getRegistryTestOptions(dir, encryptionKey)
|
|
kr, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
_, err = kr.LatestDataKey()
|
|
require.NoError(t, err)
|
|
// We're resetting the last created timestamp. So, it creates
|
|
// new datakey.
|
|
kr.lastCreated = 0
|
|
_, err = kr.LatestDataKey()
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
delete(kr.dataKeys, 1)
|
|
require.NoError(t, WriteKeyRegistry(kr, opt))
|
|
kr2, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(kr2.dataKeys))
|
|
require.NoError(t, kr2.Close())
|
|
}
|
|
|
|
func TestMismatch(t *testing.T) {
|
|
encryptionKey := make([]byte, 32)
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
|
require.NoError(t, err)
|
|
defer removeDir(dir)
|
|
_, err = rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
opt := getRegistryTestOptions(dir, encryptionKey)
|
|
kr, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
// Opening with the same key and asserting.
|
|
kr, err = OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
// Opening with the invalid key and asserting.
|
|
encryptionKey = make([]byte, 32)
|
|
_, err = rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
opt.EncryptionKey = encryptionKey
|
|
_, err = OpenKeyRegistry(opt)
|
|
require.Error(t, err)
|
|
require.EqualError(t, err, ErrEncryptionKeyMismatch.Error())
|
|
}
|
|
|
|
func TestEncryptionAndDecryption(t *testing.T) {
|
|
encryptionKey := make([]byte, 32)
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
|
require.NoError(t, err)
|
|
defer removeDir(dir)
|
|
_, err = rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
opt := getRegistryTestOptions(dir, encryptionKey)
|
|
kr, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
dk, err := kr.LatestDataKey()
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
// Checking the correctness of the datakey after closing and
|
|
// opening the key registry.
|
|
kr, err = OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
dk1, err := kr.DataKey(dk.GetKeyId())
|
|
require.NoError(t, err)
|
|
require.Equal(t, dk.Data, dk1.Data)
|
|
require.NoError(t, kr.Close())
|
|
}
|
|
|
|
func TestKeyRegistryInMemory(t *testing.T) {
|
|
encryptionKey := make([]byte, 32)
|
|
_, err := rand.Read(encryptionKey)
|
|
require.NoError(t, err)
|
|
|
|
opt := getRegistryTestOptions("", encryptionKey)
|
|
opt.InMemory = true
|
|
|
|
kr, err := OpenKeyRegistry(opt)
|
|
require.NoError(t, err)
|
|
_, err = kr.LatestDataKey()
|
|
require.NoError(t, err)
|
|
// We're resetting the last created timestamp. So, it creates
|
|
// new datakey.
|
|
kr.lastCreated = 0
|
|
_, err = kr.LatestDataKey()
|
|
// We generated two key. So, checking the length.
|
|
require.Equal(t, 2, len(kr.dataKeys))
|
|
require.NoError(t, err)
|
|
require.NoError(t, kr.Close())
|
|
}
|