]> Sergey Matveev's repositories - btrtrc.git/blob - storage/sqlite/sqlite-storage_test.go
sqlite storage: Provide helpers and reasonable defaults
[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         t.Cleanup(func() { conns.Close() })
21         prov, err := NewProvider(conns, provOpts)
22         require.NoError(t, err)
23         return conns, prov
24 }
25
26 func TestTextBlobSize(t *testing.T) {
27         _, prov := newConnsAndProv(t, NewPoolOpts{})
28         a, _ := prov.NewInstance("a")
29         a.Put(bytes.NewBufferString("\x00hello"))
30         fi, _ := a.Stat()
31         assert.EqualValues(t, 6, fi.Size())
32 }
33
34 func TestSimultaneousIncrementalBlob(t *testing.T) {
35         _, p := newConnsAndProv(t, NewPoolOpts{
36                 NumConns:            2,
37                 ConcurrentBlobReads: true,
38         })
39         a, err := p.NewInstance("a")
40         require.NoError(t, err)
41         const contents = "hello, world"
42         require.NoError(t, a.Put(bytes.NewReader([]byte("hello, world"))))
43         rc1, err := a.Get()
44         require.NoError(t, err)
45         rc2, err := a.Get()
46         require.NoError(t, err)
47         var b1, b2 []byte
48         var e1, e2 error
49         var wg sync.WaitGroup
50         doRead := func(b *[]byte, e *error, rc io.ReadCloser, n int) {
51                 defer wg.Done()
52                 defer rc.Close()
53                 *b, *e = ioutil.ReadAll(rc)
54                 require.NoError(t, *e, n)
55                 assert.EqualValues(t, contents, *b)
56         }
57         wg.Add(2)
58         go doRead(&b2, &e2, rc2, 2)
59         go doRead(&b1, &e1, rc1, 1)
60         wg.Wait()
61 }