influxdb/cmd/influxd/inspect/verify_tsm/verify_tsm_test.go

122 lines
2.7 KiB
Go

package verify_tsm
import (
"bytes"
"encoding/binary"
"io"
"os"
"testing"
"github.com/influxdata/influxdb/v2/tsdb/engine/tsm1"
"github.com/stretchr/testify/require"
)
func TestInvalidChecksum(t *testing.T) {
path := newChecksumTest(t, true)
defer os.RemoveAll(path)
verify := NewTSMVerifyCommand()
b := bytes.NewBufferString("")
verify.SetOut(b)
verify.SetArgs([]string{"--engine-path", path})
require.NoError(t, verify.Execute())
out, err := io.ReadAll(b)
require.NoError(t, err)
require.Contains(t, string(out), "Broken Blocks: 1 / 1")
}
func TestValidChecksum(t *testing.T) {
path := newChecksumTest(t, false)
defer os.RemoveAll(path)
verify := NewTSMVerifyCommand()
b := bytes.NewBufferString("")
verify.SetOut(b)
verify.SetArgs([]string{"--engine-path", path})
require.NoError(t, verify.Execute())
out, err := io.ReadAll(b)
require.NoError(t, err)
require.Contains(t, string(out), "Broken Blocks: 0 / 1")
}
func TestInvalidUTF8(t *testing.T) {
path := newUTFTest(t, true)
defer os.RemoveAll(path)
verify := NewTSMVerifyCommand()
verify.SetOut(bytes.NewBufferString(""))
verify.SetArgs([]string{"--engine-path", path, "--check-utf8"})
require.Error(t, verify.Execute())
}
func TestValidUTF8(t *testing.T) {
path := newUTFTest(t, false)
defer os.RemoveAll(path)
verify := NewTSMVerifyCommand()
b := bytes.NewBufferString("")
verify.SetOut(b)
verify.SetArgs([]string{"--engine-path", path, "--check-utf8"})
require.NoError(t, verify.Execute())
out, err := io.ReadAll(b)
require.NoError(t, err)
require.Contains(t, string(out), "Invalid Keys: 0 / 1")
}
func newUTFTest(t *testing.T, withError bool) string {
t.Helper()
dir := t.TempDir()
f, err := os.CreateTemp(dir, "verifytsmtest*"+"."+tsm1.TSMFileExtension)
require.NoError(t, err)
w, err := tsm1.NewTSMWriter(f)
require.NoError(t, err)
defer w.Close()
values := []tsm1.Value{tsm1.NewValue(0, 1.0)}
require.NoError(t, w.Write([]byte("cpu"), values))
if withError {
require.NoError(t, binary.Write(f, binary.BigEndian, []byte("foobar\n")))
}
require.NoError(t, w.WriteIndex())
return dir
}
func newChecksumTest(t *testing.T, withError bool) string {
t.Helper()
dir := t.TempDir()
f, err := os.CreateTemp(dir, "verifytsmtest*"+"."+tsm1.TSMFileExtension)
require.NoError(t, err)
w, err := tsm1.NewTSMWriter(f)
require.NoError(t, err)
values := []tsm1.Value{tsm1.NewValue(0, "entry")}
require.NoError(t, w.Write([]byte("cpu"), values))
require.NoError(t, w.WriteIndex())
w.Close()
if withError {
fh, err := os.OpenFile(f.Name(), os.O_RDWR, 0)
require.NoError(t, err)
defer fh.Close()
written, err := fh.WriteAt([]byte("foob"), 5)
require.Equal(t, 4, written)
require.NoError(t, err)
}
return dir
}