Skip to content
Snippets Groups Projects
Select Git revision
  • 305d6f6ee5ebe91ac1bec4cf65c70fb7987165e4
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

cmixMessageBuffer_test.go

Blame
  • cmixMessageBuffer_test.go 4.13 KiB
    package utility
    
    import (
    	"bytes"
    	"gitlab.com/elixxir/client/storage/versioned"
    	"gitlab.com/elixxir/ekv"
    	"gitlab.com/elixxir/primitives/format"
    	"math/rand"
    	"reflect"
    	"testing"
    	"time"
    )
    
    // Test happy path of cmixMessageHandler.SaveMessage().
    func TestCmixMessageHandler_SaveMessage(t *testing.T) {
    	// Set up test values
    	cmh := &cmixMessageHandler{}
    	kv := versioned.NewKV(make(ekv.Memstore))
    	testMsgs, _ := makeTestCmixMessages(10)
    
    	for _, msg := range testMsgs {
    		key := makeStoredMessageKey("testKey", cmh.HashMessage(msg))
    
    		// Save message
    		err := cmh.SaveMessage(kv, msg, key)
    		if err != nil {
    			t.Errorf("SaveMessage() returned an error."+
    				"\n\texpected: %v\n\trecieved: %v", nil, err)
    		}
    
    		// Try to get message
    		obj, err := kv.Get(key)
    		if err != nil {
    			t.Errorf("Get() returned an error: %v", err)
    		}
    
    		// Test if message retrieved matches expected
    		if !bytes.Equal(msg.Marshal(), obj.Data) {
    			t.Errorf("SaveMessage() returned versioned object with incorrect data."+
    				"\n\texpected: %v\n\treceived: %v",
    				msg, obj.Data)
    		}
    	}
    }
    
    // Test happy path of cmixMessageHandler.LoadMessage().
    func TestCmixMessageHandler_LoadMessage(t *testing.T) {
    	// Set up test values
    	cmh := &cmixMessageHandler{}
    	kv := versioned.NewKV(make(ekv.Memstore))
    	testMsgs, _ := makeTestCmixMessages(10)
    
    	for _, msg := range testMsgs {
    		key := makeStoredMessageKey("testKey", cmh.HashMessage(msg))
    
    		// Save message
    		if err := cmh.SaveMessage(kv, msg, key); err != nil {
    			t.Errorf("SaveMessage() returned an error: %v", err)
    		}
    
    		// Try to load message
    		testMsg, err := cmh.LoadMessage(kv, key)
    		if err != nil {
    			t.Errorf("LoadMessage() returned an error."+
    				"\n\texpected: %v\n\trecieved: %v", nil, err)
    		}
    
    		// Test if message loaded matches expected
    		if !reflect.DeepEqual(msg, testMsg) {
    			t.Errorf("LoadMessage() returned an unexpected object."+
    				"\n\texpected: %v\n\treceived: %v",
    				msg, testMsg)
    		}
    	}
    }
    
    // Smoke test of cmixMessageHandler.
    func TestCmixMessageBuffer_Smoke(t *testing.T) {
    	// Set up test messages
    	testMsgs, _ := makeTestCmixMessages(2)
    
    	// Create new buffer
    	cmb, err := NewCmixMessageBuffer(versioned.NewKV(make(ekv.Memstore)), "testKey")
    	if err != nil {
    		t.Errorf("NewCmixMessageBuffer() returned an error."+
    			"\n\texpected: %v\n\trecieved: %v", nil, err)
    	}
    
    	// Add two messages
    	cmb.Add(testMsgs[0])
    	cmb.Add(testMsgs[1])
    
    	if len(cmb.mb.messages) != 2 {
    		t.Errorf("Unexpected length of buffer.\n\texpected: %d\n\trecieved: %d",
    			2, len(cmb.mb.messages))
    	}
    
    	msg, exists := cmb.Next()
    	if !exists {
    		t.Error("Next() did not find any messages in buffer.")
    	}
    	cmb.Succeeded(msg)
    
    	if len(cmb.mb.messages) != 1 {
    		t.Errorf("Unexpected length of buffer.\n\texpected: %d\n\trecieved: %d",
    			1, len(cmb.mb.messages))
    	}
    
    	msg, exists = cmb.Next()
    	if !exists {
    		t.Error("Next() did not find any messages in buffer.")
    	}
    	if len(cmb.mb.messages) != 0 {
    		t.Errorf("Unexpected length of buffer.\n\texpected: %d\n\trecieved: %d",
    			0, len(cmb.mb.messages))
    	}
    	cmb.Failed(msg)
    
    	if len(cmb.mb.messages) != 1 {
    		t.Errorf("Unexpected length of buffer.\n\texpected: %d\n\trecieved: %d",
    			1, len(cmb.mb.messages))
    	}
    
    	msg, exists = cmb.Next()
    	if !exists {
    		t.Error("Next() did not find any messages in buffer.")
    	}
    	cmb.Succeeded(msg)
    
    	msg, exists = cmb.Next()
    	if exists {
    		t.Error("Next() found a message in the buffer when it should be empty.")
    	}
    	cmb.Succeeded(msg)
    
    	if len(cmb.mb.messages) != 0 {
    		t.Errorf("Unexpected length of buffer.\n\texpected: %d\n\trecieved: %d",
    			0, len(cmb.mb.messages))
    	}
    
    }
    
    // makeTestCmixMessages creates a list of messages with random data and the
    // expected map after they are added to the buffer.
    func makeTestCmixMessages(n int) ([]format.Message, map[MessageHash]struct{}) {
    	cmh := &cmixMessageHandler{}
    	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
    	mh := map[MessageHash]struct{}{}
    	msgs := make([]format.Message, n)
    	for i := range msgs {
    		msgs[i] = format.NewMessage(128)
    		payload := make([]byte, 128)
    		prng.Read(payload)
    		msgs[i].SetPayloadA(payload)
    		prng.Read(payload)
    		msgs[i].SetPayloadB(payload)
    		mh[cmh.HashMessage(msgs[i])] = struct{}{}
    	}
    
    	return msgs, mh
    }