-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathsstable_linux_test.go
More file actions
104 lines (86 loc) · 2.45 KB
/
sstable_linux_test.go
File metadata and controls
104 lines (86 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//go:build linux
package file
import (
"bytes"
"os"
"path/filepath"
"testing"
"time"
"github.com/feichai0017/NoKV/kv"
"github.com/feichai0017/NoKV/pb"
"github.com/feichai0017/NoKV/utils"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
)
func writeTestSSTableLinux(t *testing.T, path string) ([]byte, []byte) {
t.Helper()
dataBlock := []byte("data-block")
key := kv.InternalKey(kv.CFDefault, []byte("a"), 1)
index := &pb.TableIndex{
Offsets: []*pb.BlockOffset{{
Key: key,
Offset: 0,
Len: uint32(len(dataBlock)),
}},
}
indexData, err := proto.Marshal(index)
require.NoError(t, err)
checksum := utils.CalculateChecksum(indexData)
var buf bytes.Buffer
buf.Write(dataBlock)
buf.Write(indexData)
buf.Write(kv.U32ToBytes(uint32(len(indexData))))
buf.Write(kv.U64ToBytes(checksum))
buf.Write(kv.U32ToBytes(uint32(len(kv.U64ToBytes(checksum)))))
require.NoError(t, os.WriteFile(path, buf.Bytes(), 0o644))
return key, dataBlock
}
func TestSSTableInitAndAccessLinux(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "test.sst")
key, dataBlock := writeTestSSTableLinux(t, path)
ss := OpenSStable(&Options{
FileName: path,
Flag: os.O_RDWR,
MaxSz: 0,
})
require.NotNil(t, ss)
defer func() { _ = ss.Close() }()
require.NoError(t, ss.Init())
require.Equal(t, uint64(0), ss.FID())
require.NotNil(t, ss.Indexs())
require.Len(t, ss.Indexs().GetOffsets(), 1)
require.Equal(t, key, ss.MinKey())
require.Equal(t, key, ss.MaxKey())
require.False(t, ss.HasBloomFilter())
newMax := kv.InternalKey(kv.CFDefault, []byte("b"), 1)
ss.SetMaxKey(newMax)
require.Equal(t, newMax, ss.MaxKey())
view, err := ss.View(0, len(dataBlock))
require.NoError(t, err)
require.Equal(t, dataBlock, view)
out, err := ss.Bytes(0, len(dataBlock))
require.NoError(t, err)
require.Equal(t, dataBlock, out)
created := ss.GetCreatedAt()
require.NotNil(t, created)
now := time.Now().Add(-time.Hour)
ss.SetCreatedAt(&now)
require.Equal(t, now, *ss.GetCreatedAt())
require.NoError(t, ss.Advise(utils.AccessPatternSequential))
require.NoError(t, ss.Truncate(int64(len(dataBlock))))
}
func TestSSTableDeleteLinux(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "delete.sst")
_, _ = writeTestSSTableLinux(t, path)
ss := OpenSStable(&Options{
FileName: path,
Flag: os.O_RDWR,
MaxSz: 0,
})
require.NotNil(t, ss)
require.NoError(t, ss.Detele())
_, err := os.Stat(path)
require.Error(t, err)
}