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(&params)
   120  	if err != nil {
   121  		return nil, err
   122  	}
   123  	now := time.Now()
   124  	envelope, err := message.Wrap(&params, now)
   125  	if err != nil {
   126  		return nil, err
   127  	}
   128  	return gethbridge.NewWakuEnvelope(envelope), nil
   129  }