-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathblobio_test.go
More file actions
85 lines (66 loc) · 1.71 KB
/
blobio_test.go
File metadata and controls
85 lines (66 loc) · 1.71 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
package sqlite
import (
"context"
"encoding/binary"
"sort"
"testing"
"github.com/google/go-cmp/cmp"
)
func TestBlobIO(t *testing.T) {
db, err := Open(t.TempDir() + "/linkedlist")
if err != nil {
t.Fatal(err)
}
// linked list binary format (len & next fixed size big endian u32)
// +---+----+------------------+
// | len | prev | utf8 value |
// +---+----+------------------+
if err := db.Exec(context.Background(), "create table linked_list(id integer primary key, value text)").Err(); err != nil {
t.Fatal(err)
}
values := []string{
"computable numbers", "Entscheidungsproblem",
"axiomatic system", "Vollständigkeitssatz",
}
rnum := 0
for _, v := range values {
blob, err := db.CreateBLOB("main", "linked_list", "value", len(v)+8)
if err != nil {
t.Fatal(err)
}
hsz := make([]byte, 4)
binary.BigEndian.PutUint32(hsz, uint32(len(v)))
blob.WriteAt(hsz, 0)
binary.BigEndian.PutUint32(hsz, uint32(rnum))
blob.WriteAt(hsz, 4)
blob.WriteAt([]byte(v), 8)
rnum = blob.RowNumber
if err := blob.Close(); err != nil {
t.Fatal(err)
}
}
var got []string
for rnum != 0 {
blob, err := db.OpenBLOB("main", "linked_list", "value", rnum)
if err != nil {
t.Fatal(err)
}
hsz := make([]byte, 4)
blob.ReadAt(hsz, 0)
sz := binary.BigEndian.Uint32(hsz)
buf := make([]byte, sz)
blob.ReadAt(buf, 8)
got = append(got, string(buf))
blob.ReadAt(hsz, 4)
rnum = int(binary.BigEndian.Uint32(hsz))
if err := blob.Close(); err != nil {
t.Fatal(err)
}
}
// technically a bit weaker (walking the linked list is reversed), but enough for the test
sort.Strings(values)
sort.Strings(got)
if !cmp.Equal(got, values) {
t.Error(cmp.Diff(got, values))
}
}