github.com/status-im/status-go@v1.1.0/mailserver/mailserver_db_postgres_test.go (about) 1 // In order to run these tests, you must run a PostgreSQL database. 2 // 3 // Using Docker: 4 // docker run -e POSTGRES_HOST_AUTH_METHOD=trust -d -p 5432:5432 postgres:9.6-alpine 5 // 6 7 package mailserver 8 9 import ( 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/suite" 14 15 "github.com/ethereum/go-ethereum/rlp" 16 17 gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" 18 "github.com/status-im/status-go/eth-node/crypto" 19 "github.com/status-im/status-go/eth-node/types" 20 "github.com/status-im/status-go/postgres" 21 waku "github.com/status-im/status-go/waku/common" 22 ) 23 24 func TestMailServerPostgresDBSuite(t *testing.T) { 25 suite.Run(t, new(MailServerPostgresDBSuite)) 26 } 27 28 type MailServerPostgresDBSuite struct { 29 suite.Suite 30 } 31 32 func (s *MailServerPostgresDBSuite) SetupSuite() { 33 // ResetDefaultTestPostgresDB Required to completely reset the Postgres DB 34 err := postgres.ResetDefaultTestPostgresDB() 35 s.NoError(err) 36 } 37 38 func (s *MailServerPostgresDBSuite) TestPostgresDB_BuildIteratorWithBloomFilter() { 39 topic := []byte{0xaa, 0xbb, 0xcc, 0xdd} 40 41 db, err := NewPostgresDB(postgres.DefaultTestURI) 42 s.NoError(err) 43 defer db.Close() 44 45 envelope, err := newTestEnvelope(topic) 46 s.NoError(err) 47 err = db.SaveEnvelope(envelope) 48 s.NoError(err) 49 50 iter, err := db.BuildIterator(CursorQuery{ 51 start: NewDBKey(uint32(time.Now().Add(-time.Hour).Unix()), types.BytesToTopic(topic), types.Hash{}).Bytes(), 52 end: NewDBKey(uint32(time.Now().Add(time.Second).Unix()), types.BytesToTopic(topic), types.Hash{}).Bytes(), 53 bloom: types.TopicToBloom(types.BytesToTopic(topic)), 54 limit: 10, 55 }) 56 s.NoError(err) 57 hasNext := iter.Next() 58 s.True(hasNext) 59 rawValue, err := iter.GetEnvelopeByBloomFilter(nil) 60 s.NoError(err) 61 s.NotEmpty(rawValue) 62 var receivedEnvelope waku.Envelope 63 err = rlp.DecodeBytes(rawValue, &receivedEnvelope) 64 s.NoError(err) 65 s.EqualValues(waku.BytesToTopic(topic), receivedEnvelope.Topic) 66 67 err = iter.Release() 68 s.NoError(err) 69 s.NoError(iter.Error()) 70 } 71 72 func (s *MailServerPostgresDBSuite) TestPostgresDB_BuildIteratorWithTopic() { 73 topic := []byte{0x01, 0x02, 0x03, 0x04} 74 75 db, err := NewPostgresDB(postgres.DefaultTestURI) 76 s.NoError(err) 77 defer db.Close() 78 79 envelope, err := newTestEnvelope(topic) 80 s.NoError(err) 81 err = db.SaveEnvelope(envelope) 82 s.NoError(err) 83 84 iter, err := db.BuildIterator(CursorQuery{ 85 start: NewDBKey(uint32(time.Now().Add(-time.Hour).Unix()), types.BytesToTopic(topic), types.Hash{}).Bytes(), 86 end: NewDBKey(uint32(time.Now().Add(time.Second).Unix()), types.BytesToTopic(topic), types.Hash{}).Bytes(), 87 topics: [][]byte{topic}, 88 limit: 10, 89 }) 90 s.NoError(err) 91 hasNext := iter.Next() 92 s.True(hasNext) 93 rawValue, err := iter.GetEnvelopeByBloomFilter(nil) 94 s.NoError(err) 95 s.NotEmpty(rawValue) 96 var receivedEnvelope waku.Envelope 97 err = rlp.DecodeBytes(rawValue, &receivedEnvelope) 98 s.NoError(err) 99 s.EqualValues(waku.BytesToTopic(topic), receivedEnvelope.Topic) 100 101 err = iter.Release() 102 s.NoError(err) 103 s.NoError(iter.Error()) 104 } 105 106 func newTestEnvelope(topic []byte) (types.Envelope, error) { 107 privateKey, err := crypto.GenerateKey() 108 if err != nil { 109 return nil, err 110 } 111 params := waku.MessageParams{ 112 TTL: 10, 113 PoW: 2.0, 114 Payload: []byte("hello world"), 115 WorkTime: 1, 116 Topic: waku.BytesToTopic(topic), 117 Dst: &privateKey.PublicKey, 118 } 119 message, err := waku.NewSentMessage(¶ms) 120 if err != nil { 121 return nil, err 122 } 123 now := time.Now() 124 envelope, err := message.Wrap(¶ms, now) 125 if err != nil { 126 return nil, err 127 } 128 return gethbridge.NewWakuEnvelope(envelope), nil 129 }