Skip to content
Snippets Groups Projects
Select Git revision
  • 83e7a531ff70b1124581d36f34694e21398bda65
  • main default protected
  • development
  • integration
  • v1.1.5
  • v1.1.4
  • v1.1.3
  • v1.1.2
  • v1.1.1
  • v1.1.0
  • v1.0.0
11 results

ConfirmRequestFeatureTests.swift

Blame
  • send_test.go 5.29 KiB
    ////////////////////////////////////////////////////////////////////////////////
    // Copyright © 2020 xx network SEZC                                           //
    //                                                                            //
    // Use of this source code is governed by a license that can be found in the  //
    // LICENSE file                                                               //
    ////////////////////////////////////////////////////////////////////////////////
    
    package dummy
    
    import (
    	"bytes"
    	"encoding/base64"
    	"gitlab.com/elixxir/client/stoppable"
    	"gitlab.com/elixxir/primitives/format"
    	"gitlab.com/xx_network/primitives/id"
    	"reflect"
    	"sync/atomic"
    	"testing"
    	"time"
    )
    
    // Tests that Manager.sendThread sends multiple sets of messages.
    func TestManager_sendThread(t *testing.T) {
    	m := newTestManager(10, 50*time.Millisecond, 10*time.Millisecond, false, t)
    
    	stop := stoppable.NewSingle("sendThreadTest")
    	go m.sendThread(stop)
    
    	if stat := atomic.LoadUint32(&m.status); stat != notStarted {
    		t.Errorf("Unexpected thread status.\nexpected: %d\nreceived: %d",
    			notStarted, stat)
    	}
    
    	err := m.SetStatus(true)
    	if err != nil {
    		t.Errorf("Failed to set status to true.")
    	}
    
    	msgChan := make(chan bool, 10)
    	go func() {
    		var numReceived int
    		for i := 0; i < 2; i++ {
    			for m.net.(*testNetworkManager).GetMsgListLen() == numReceived {
    				time.Sleep(5 * time.Millisecond)
    			}
    			numReceived = m.net.(*testNetworkManager).GetMsgListLen()
    			msgChan <- true
    		}
    	}()
    
    	var numReceived int
    	select {
    	case <-time.NewTimer(3 * m.avgSendDelta).C:
    		t.Errorf("Timed out after %s waiting for messages to be sent.",
    			3*m.avgSendDelta)
    	case <-msgChan:
    		numReceived += m.net.(*testNetworkManager).GetMsgListLen()
    	}
    
    	select {
    	case <-time.NewTimer(3 * m.avgSendDelta).C:
    		t.Errorf("Timed out after %s waiting for messages to be sent.",
    			3*m.avgSendDelta)
    	case <-msgChan:
    		if m.net.(*testNetworkManager).GetMsgListLen() <= numReceived {
    			t.Errorf("Failed to receive second send."+
    				"\nmessages on last receive: %d\nmessages on this receive: %d",
    				numReceived, m.net.(*testNetworkManager).GetMsgListLen())
    		}
    	}
    
    	err = stop.Close()
    	if err != nil {
    		t.Errorf("Failed to close stoppable: %+v", err)
    	}
    
    	time.Sleep(10 * time.Millisecond)
    	if !stop.IsStopped() {
    		t.Error("Stoppable never stopped.")
    	}
    
    	if stat := atomic.LoadUint32(&m.status); stat != stopped {
    		t.Errorf("Unexpected thread status.\nexpected: %d\nreceived: %d",
    			stopped, stat)
    	}
    
    }
    
    // Tests that Manager.sendMessages sends all the messages with the correct
    // recipient.
    func TestManager_sendMessages(t *testing.T) {
    	m := newTestManager(100, 0, 0, false, t)
    	prng := NewPrng(42)
    
    	// Generate map of recipients and messages
    	msgs := make(map[id.ID]format.Message, m.maxNumMessages)
    	for i := 0; i < m.maxNumMessages; i++ {
    		recipient, err := id.NewRandomID(prng, id.User)
    		if err != nil {
    			t.Errorf("Failed to generate random recipient ID (%d): %+v", i, err)
    		}
    
    		msg, err := m.newRandomCmixMessage(prng)
    		if err != nil {
    			t.Errorf("Failed to generate random cMix message (%d): %+v", i, err)
    		}
    
    		msgs[*recipient] = msg
    	}
    
    	// Send the messages
    	err := m.sendMessages(msgs)
    	if err != nil {
    		t.Errorf("sendMessages returned an error: %+v", err)
    	}
    
    	// get sent messages
    	receivedMsgs := m.net.(*testNetworkManager).GetMsgList()
    
    	// Test that all messages were received
    	if len(receivedMsgs) != len(msgs) {
    		t.Errorf("Failed to received all sent messages."+
    			"\nexpected: %d\nreceived: %d", len(msgs), len(receivedMsgs))
    	}
    
    	// Test that all messages were received for the correct recipient
    	for recipient, msg := range msgs {
    		receivedMsg, exists := receivedMsgs[recipient]
    		if !exists {
    			t.Errorf("Failed to receive message from %s: %+v", &recipient, msg)
    		} else if !reflect.DeepEqual(msg, receivedMsg) {
    			t.Errorf("Received unexpected message for recipient %s."+
    				"\nexpected: %+v\nreceived: %+v", &recipient, msg, receivedMsg)
    		}
    	}
    }
    
    // Tests that Manager.newRandomMessages creates a non-empty map of messages and
    // that each message is unique.
    func TestManager_newRandomMessages(t *testing.T) {
    	m := newTestManager(10, 0, 0, false, t)
    	prng := NewPrng(42)
    
    	msgMap, err := m.newRandomMessages(prng)
    	if err != nil {
    		t.Errorf("newRandomMessages returned an error: %+v", err)
    	}
    
    	if len(msgMap) == 0 {
    		t.Error("Message map is empty.")
    	}
    
    	marshalledMsgs := make(map[string]format.Message, len(msgMap))
    	for _, msg := range msgMap {
    		msgString := base64.StdEncoding.EncodeToString(msg.Marshal())
    		if _, exists := marshalledMsgs[msgString]; exists {
    			t.Errorf("Message not unique.")
    		} else {
    			marshalledMsgs[msgString] = msg
    		}
    	}
    }
    
    // Tests that Manager.newRandomCmixMessage generates a cMix message with
    // populated contents, fingerprint, and MAC.
    func TestManager_newRandomCmixMessage(t *testing.T) {
    	m := newTestManager(0, 0, 0, false, t)
    	prng := NewPrng(42)
    
    	cMixMsg, err := m.newRandomCmixMessage(prng)
    	if err != nil {
    		t.Errorf("newRandomCmixMessage returned an error: %+v", err)
    	}
    
    	if bytes.Equal(cMixMsg.GetContents(), make([]byte, len(cMixMsg.GetContents()))) {
    		t.Error("cMix message contents not set.")
    	}
    
    	if cMixMsg.GetKeyFP() == (format.Fingerprint{}) {
    		t.Error("cMix message fingerprint not set.")
    	}
    
    	if bytes.Equal(cMixMsg.GetMac(), make([]byte, format.MacLen)) {
    		t.Error("cMix message MAC not set.")
    	}
    }