aboutsummaryrefslogtreecommitdiff
path: root/buckets_test.go
blob: 0fc628881428ebceb14bda84cffa1b7eb1e74cdd (plain) (blame)
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
package bolt

import (
	"testing"
	"unsafe"

	"github.com/stretchr/testify/assert"
)

// Ensure that a buckets page can set a bucket.
func TestBucketsPut(t *testing.T) {
	b := &buckets{items: make(map[string]*bucket)}
	b.put("foo", &bucket{root: 2})
	b.put("bar", &bucket{root: 3})
	b.put("foo", &bucket{root: 4})
	assert.Equal(t, len(b.items), 2)
	assert.Equal(t, b.get("foo").root, pgid(4))
	assert.Equal(t, b.get("bar").root, pgid(3))
	assert.Nil(t, b.get("no_such_bucket"))
}

// Ensure that a buckets page can deserialize from a page.
func TestBucketsRead(t *testing.T) {
	// Create a page.
	var buf [4096]byte
	page := (*page)(unsafe.Pointer(&buf[0]))
	page.count = 2

	// Insert 2 items at the beginning.
	s := (*[3]bucket)(unsafe.Pointer(&page.ptr))
	s[0] = bucket{root: 3}
	s[1] = bucket{root: 4}

	// Write data for the nodes at the end.
	data := (*[4096]byte)(unsafe.Pointer(&s[2]))
	data[0] = 3
	copy(data[1:], []byte("bar"))
	data[4] = 10
	copy(data[5:], []byte("helloworld"))

	// Deserialize page into a buckets page.
	b := &buckets{items: make(map[string]*bucket)}
	b.read(page)

	// Check that there are two items with correct data.
	assert.Equal(t, len(b.items), 2)
	assert.Equal(t, b.get("bar").root, pgid(3))
	assert.Equal(t, b.get("helloworld").root, pgid(4))
}

// Ensure that a buckets page can serialize itself.
func TestBucketsWrite(t *testing.T) {
	b := &buckets{items: make(map[string]*bucket)}
	b.put("foo", &bucket{root: 2})
	b.put("bar", &bucket{root: 3})

	// Write it to a page.
	var buf [4096]byte
	p := (*page)(unsafe.Pointer(&buf[0]))
	b.write(p)

	// Read the page back in.
	b2 := &buckets{items: make(map[string]*bucket)}
	b2.read(p)

	// Check that the two pages are the same.
	assert.Equal(t, len(b.items), 2)
	assert.Equal(t, b.get("foo").root, pgid(2))
	assert.Equal(t, b.get("bar").root, pgid(3))
}