/ kvdb / postgres / db_test.go
db_test.go
 1  //go:build kvdb_postgres
 2  
 3  package postgres
 4  
 5  import (
 6  	"testing"
 7  	"time"
 8  
 9  	"github.com/btcsuite/btcwallet/walletdb"
10  	"github.com/btcsuite/btcwallet/walletdb/walletdbtest"
11  	"github.com/stretchr/testify/require"
12  )
13  
14  // TestInterface performs all interfaces tests for this database driver.
15  func TestInterface(t *testing.T) {
16  	stop, err := StartEmbeddedPostgres()
17  	require.NoError(t, err)
18  	defer stop()
19  
20  	f, err := NewFixture("")
21  	require.NoError(t, err)
22  
23  	// dbType is the database type name for this driver.
24  	const dbType = "postgres"
25  
26  	ctx := t.Context()
27  	cfg := &Config{
28  		Dsn: f.Dsn,
29  	}
30  
31  	walletdbtest.TestInterface(t, dbType, ctx, cfg, prefix)
32  }
33  
34  // TestPanic tests recovery from panic conditions.
35  func TestPanic(t *testing.T) {
36  	stop, err := StartEmbeddedPostgres()
37  	require.NoError(t, err)
38  	defer stop()
39  
40  	f, err := NewFixture("")
41  	require.NoError(t, err)
42  
43  	err = f.Db.Update(func(tx walletdb.ReadWriteTx) error {
44  		bucket, err := tx.CreateTopLevelBucket([]byte("test"))
45  		require.NoError(t, err)
46  
47  		// Stop database server.
48  		stop()
49  
50  		// Keep trying to get data until Get panics because the
51  		// connection is lost.
52  		for i := 0; i < 50; i++ {
53  			bucket.Get([]byte("key"))
54  			time.Sleep(100 * time.Millisecond)
55  		}
56  
57  		return nil
58  	}, func() {})
59  
60  	require.Contains(t, err.Error(), "terminating connection")
61  }