]> Sergey Matveev's repositories - btrtrc.git/blob - storage/sqlite/sqlite-storage_test.go
sqlite storage: Add batched writes
[btrtrc.git] / storage / sqlite / sqlite-storage_test.go
1 package sqliteStorage
2
3 import (
4         "bytes"
5         "io"
6         "io/ioutil"
7         "path/filepath"
8         "sync"
9         "testing"
10
11         _ "github.com/anacrolix/envpprof"
12         "github.com/stretchr/testify/assert"
13         "github.com/stretchr/testify/require"
14 )
15
16 func newConnsAndProv(t *testing.T, opts NewPoolOpts) (ConnPool, *provider) {
17         opts.Path = filepath.Join(t.TempDir(), "sqlite3.db")
18         conns, provOpts, err := NewPool(opts)
19         require.NoError(t, err)
20         // sqlitex.Pool.Close doesn't like being called more than once. Let it slide for now.
21         //t.Cleanup(func() { conns.Close() })
22         prov, err := NewProvider(conns, provOpts)
23         require.NoError(t, err)
24         t.Cleanup(func() { prov.Close() })
25         return conns, prov
26 }
27
28 func TestTextBlobSize(t *testing.T) {
29         _, prov := newConnsAndProv(t, NewPoolOpts{})
30         a, _ := prov.NewInstance("a")
31         a.Put(bytes.NewBufferString("\x00hello"))
32         fi, _ := a.Stat()
33         assert.EqualValues(t, 6, fi.Size())
34 }
35
36 func TestSimultaneousIncrementalBlob(t *testing.T) {
37         _, p := newConnsAndProv(t, NewPoolOpts{
38                 NumConns:            2,
39                 ConcurrentBlobReads: true,
40         })
41         a, err := p.NewInstance("a")
42         require.NoError(t, err)
43         const contents = "hello, world"
44         require.NoError(t, a.Put(bytes.NewReader([]byte("hello, world"))))
45         rc1, err := a.Get()
46         require.NoError(t, err)
47         rc2, err := a.Get()
48         require.NoError(t, err)
49         var b1, b2 []byte
50         var e1, e2 error
51         var wg sync.WaitGroup
52         doRead := func(b *[]byte, e *error, rc io.ReadCloser, n int) {
53                 defer wg.Done()
54                 defer rc.Close()
55                 *b, *e = ioutil.ReadAll(rc)
56                 require.NoError(t, *e, n)
57                 assert.EqualValues(t, contents, *b)
58         }
59         wg.Add(2)
60         go doRead(&b2, &e2, rc2, 2)
61         go doRead(&b1, &e1, rc1, 1)
62         wg.Wait()
63 }