Skip to content
Snippets Groups Projects
Select Git revision
  • d9c836bbdf61a7668fb68e01a75e8aded55f0f44
  • 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

params.go

Blame
  • manager_test.go 11.87 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 e2e
    
    import (
    	"bytes"
    	"encoding/base64"
    	"fmt"
    	"gitlab.com/elixxir/client/interfaces/params"
    	"gitlab.com/elixxir/client/storage/versioned"
    	"gitlab.com/elixxir/ekv"
    	"gitlab.com/xx_network/primitives/id"
    	"gitlab.com/xx_network/primitives/netTime"
    	"golang.org/x/crypto/blake2b"
    	"math/rand"
    	"reflect"
    	"testing"
    )
    
    // Tests happy path of newManager.
    func Test_newManager(t *testing.T) {
    	// Set up expected and test values
    	s, ctx := makeTestSession()
    	kv := versioned.NewKV(make(ekv.Memstore))
    	partnerID := id.NewIdFromUInt(100, id.User, t)
    	expectedM := &Manager{
    		ctx:                     ctx,
    		kv:                      kv.Prefix(fmt.Sprintf(managerPrefix, partnerID)),
    		partner:                 partnerID,
    		originPartnerPubKey:     s.partnerPubKey,
    		originMyPrivKey:         s.myPrivKey,
    		originPartnerSIDHPubKey: s.partnerSIDHPubKey,
    		originMySIDHPrivKey:     s.mySIDHPrivKey,
    	}
    	expectedM.send = NewRelationship(expectedM, Send,
    		params.GetDefaultE2ESessionParams())
    	expectedM.receive = NewRelationship(expectedM, Receive,
    		params.GetDefaultE2ESessionParams())
    
    	// Create new relationship
    	m := newManager(ctx, kv, partnerID, s.myPrivKey, s.partnerPubKey,
    		s.mySIDHPrivKey, s.partnerSIDHPubKey,
    		s.e2eParams,
    		s.e2eParams)
    
    	// Check if the new relationship matches the expected
    	if !managersEqual(expectedM, m, t) {
    		t.Errorf("newManager() did not produce the expected Manager."+
    			"\n\texpected: %+v\n\treceived: %+v", expectedM, m)
    	}
    }
    
    // Tests happy path of loadManager.
    func TestLoadManager(t *testing.T) {
    	// Set up expected and test values
    	expectedM, kv := newTestManager(t)
    
    	// Attempt to load relationship
    	m, err := loadManager(expectedM.ctx, kv, expectedM.partner)
    	if err != nil {
    		t.Errorf("loadManager() returned an error: %v", err)
    	}
    
    	// Check if the loaded relationship matches the expected
    	if !managersEqual(expectedM, m, t) {
    		t.Errorf("loadManager() did not produce the expected Manager."+
    			"\n\texpected: %+v\n\treceived: %+v", expectedM, m)
    	}
    }
    
    // Unit test for clearManager
    func TestManager_ClearManager(t *testing.T) {
    	defer func() {
    		if r := recover(); r == nil {
    			t.Fatalf("clearManager error: " +
    				"Did not panic when loading deleted manager")
    		}
    	}()
    
    	// Set up expected and test values
    	expectedM, kv := newTestManager(t)
    
    	err := clearManager(expectedM, kv)
    	if err != nil {
    		t.Fatalf("clearManager returned an error: %v", err)
    	}
    
    	// Attempt to load relationship
    	_, err = loadManager(expectedM.ctx, kv, expectedM.partner)
    	if err != nil {
    		t.Errorf("loadManager() returned an error: %v", err)
    	}
    }
    
    // Tests happy path of Manager.NewReceiveSession.
    func TestManager_NewReceiveSession(t *testing.T) {
    	// Set up test values
    	m, _ := newTestManager(t)
    	s, _ := makeTestSession()
    
    	se, exists := m.NewReceiveSession(s.partnerPubKey, s.partnerSIDHPubKey,
    		s.e2eParams, s)
    	if exists {
    		t.Errorf("NewReceiveSession() incorrect return value."+
    			"\n\texpected: %v\n\treceived: %v", false, exists)
    	}
    	if !m.partner.Cmp(se.GetPartner()) || !bytes.Equal(s.GetID().Marshal(),
    		se.GetID().Marshal()) {
    		t.Errorf("NewReceiveSession() incorrect session."+
    			"\n\texpected partner: %v\n\treceived partner: %v"+
    			"\n\texpected ID: %v\n\treceived ID: %v",
    			m.partner, se.GetPartner(), s.GetID(), se.GetID())
    	}
    
    	se, exists = m.NewReceiveSession(s.partnerPubKey, s.partnerSIDHPubKey,
    		s.e2eParams, s)
    	if !exists {
    		t.Errorf("NewReceiveSession() incorrect return value."+
    			"\n\texpected: %v\n\treceived: %v", true, exists)
    	}
    	if !m.partner.Cmp(se.GetPartner()) || !bytes.Equal(s.GetID().Marshal(),
    		se.GetID().Marshal()) {
    		t.Errorf("NewReceiveSession() incorrect session."+
    			"\n\texpected partner: %v\n\treceived partner: %v"+
    			"\n\texpected ID: %v\n\treceived ID: %v",
    			m.partner, se.GetPartner(), s.GetID(), se.GetID())
    	}
    }
    
    // Tests happy path of Manager.NewSendSession.
    func TestManager_NewSendSession(t *testing.T) {
    	// Set up test values
    	m, _ := newTestManager(t)
    	s, _ := makeTestSession()
    
    	se := m.NewSendSession(s.myPrivKey, s.mySIDHPrivKey, s.e2eParams)
    	if !m.partner.Cmp(se.GetPartner()) {
    		t.Errorf("NewSendSession() did not return the correct session."+
    			"\n\texpected partner: %v\n\treceived partner: %v",
    			m.partner, se.GetPartner())
    	}
    
    	se, _ = m.NewReceiveSession(s.partnerPubKey, s.partnerSIDHPubKey,
    		s.e2eParams, s)
    	if !m.partner.Cmp(se.GetPartner()) {
    		t.Errorf("NewSendSession() did not return the correct session."+
    			"\n\texpected partner: %v\n\treceived partner: %v",
    			m.partner, se.GetPartner())
    	}
    }
    
    // Tests happy path of Manager.GetKeyForSending.
    func TestManager_GetKeyForSending(t *testing.T) {
    	// Set up test values
    	m, _ := newTestManager(t)
    	p := params.GetDefaultE2E()
    	expectedKey := &Key{
    		session: m.send.sessions[0],
    	}
    
    	key, err := m.GetKeyForSending(p.Type)
    	if err != nil {
    		t.Errorf("GetKeyForSending() produced an error: %v", err)
    	}
    
    	if !reflect.DeepEqual(expectedKey, key) {
    		t.Errorf("GetKeyForSending() did not return the correct key."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expectedKey, key)
    	}
    
    	p.Type = params.KeyExchange
    	m.send.sessions[0].negotiationStatus = NewSessionTriggered
    	expectedKey.keyNum++
    
    	key, err = m.GetKeyForSending(p.Type)
    	if err != nil {
    		t.Errorf("GetKeyForSending() produced an error: %v", err)
    	}
    
    	if !reflect.DeepEqual(expectedKey, key) {
    		t.Errorf("GetKeyForSending() did not return the correct key."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expectedKey, key)
    	}
    }
    
    // Tests that Manager.GetKeyForSending returns an error for invalid SendType.
    func TestManager_GetKeyForSending_Error(t *testing.T) {
    	// Set up test values
    	m, _ := newTestManager(t)
    	p := params.GetDefaultE2E()
    	p.Type = 2
    
    	key, err := m.GetKeyForSending(p.Type)
    	if err == nil {
    		t.Errorf("GetKeyForSending() did not produce an error for invalid SendType.")
    	}
    
    	if key != nil {
    		t.Errorf("GetKeyForSending() did not return the correct key."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			nil, key)
    	}
    }
    
    // Tests happy path of Manager.GetPartnerID.
    func TestManager_GetPartnerID(t *testing.T) {
    	m, _ := newTestManager(t)
    
    	pid := m.GetPartnerID()
    
    	if !m.partner.Cmp(pid) {
    		t.Errorf("GetPartnerID() returned incorrect partner ID."+
    			"\n\texpected: %s\n\treceived: %s", m.partner, pid)
    	}
    }
    
    // Tests happy path of Manager.GetSendSession.
    func TestManager_GetSendSession(t *testing.T) {
    	m, _ := newTestManager(t)
    
    	s := m.GetSendSession(m.send.sessions[0].GetID())
    
    	if !reflect.DeepEqual(m.send.sessions[0], s) {
    		t.Errorf("GetSendSession() returned incorrect session."+
    			"\n\texpected: %s\n\treceived: %s", m.send.sessions[0], s)
    	}
    }
    
    // Tests happy path of Manager.GetReceiveSession.
    func TestManager_GetReceiveSession(t *testing.T) {
    	m, _ := newTestManager(t)
    
    	s := m.GetReceiveSession(m.receive.sessions[0].GetID())
    
    	if !reflect.DeepEqual(m.receive.sessions[0], s) {
    		t.Errorf("GetReceiveSession() returned incorrect session."+
    			"\n\texpected: %s\n\treceived: %s", m.receive.sessions[0], s)
    	}
    }
    
    // Tests happy path of Manager.Confirm.
    func TestManager_Confirm(t *testing.T) {
    	m, _ := newTestManager(t)
    	m.send.sessions[0].negotiationStatus = Sent
    	err := m.Confirm(m.send.sessions[0].GetID())
    	if err != nil {
    		t.Errorf("Confirm produced an error: %v", err)
    	}
    }
    
    // Tests happy path of Manager.TriggerNegotiations.
    func TestManager_TriggerNegotiations(t *testing.T) {
    	m, _ := newTestManager(t)
    	m.send.sessions[0].negotiationStatus = Unconfirmed
    	sessions := m.TriggerNegotiations()
    	if !reflect.DeepEqual(m.send.sessions, sessions) {
    		t.Errorf("TriggerNegotiations() returned incorrect sessions."+
    			"\n\texpected: %s\n\treceived: %s", m.send.sessions, sessions)
    	}
    }
    
    // newTestManager returns a new relationship for testing.
    func newTestManager(t *testing.T) (*Manager, *versioned.KV) {
    	prng := rand.New(rand.NewSource(netTime.Now().UnixNano()))
    	s, ctx := makeTestSession()
    	kv := versioned.NewKV(make(ekv.Memstore))
    	partnerID := id.NewIdFromUInts([4]uint64{prng.Uint64(), prng.Uint64(),
    		prng.Uint64(), prng.Uint64()}, id.User, t)
    
    	// Create new relationship
    	m := newManager(ctx, kv, partnerID, s.myPrivKey, s.partnerPubKey,
    		s.mySIDHPrivKey, s.partnerSIDHPubKey,
    		s.e2eParams,
    		s.e2eParams)
    
    	return m, kv
    }
    
    func managersEqual(expected, received *Manager, t *testing.T) bool {
    	equal := true
    	if !reflect.DeepEqual(expected.ctx, received.ctx) {
    		t.Errorf("Did not Receive expected Manager.ctx."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expected.ctx, received.ctx)
    		equal = false
    	}
    	if !reflect.DeepEqual(expected.kv, received.kv) {
    		t.Errorf("Did not Receive expected Manager.kv."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expected.kv, received.kv)
    		equal = false
    	}
    	if !expected.partner.Cmp(received.partner) {
    		t.Errorf("Did not Receive expected Manager.partner."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expected.partner, received.partner)
    		equal = false
    	}
    	if !relationshipsEqual(expected.receive, received.receive) {
    		t.Errorf("Did not Receive expected Manager.Receive."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expected.receive, received.receive)
    		equal = false
    	}
    	if !relationshipsEqual(expected.send, received.send) {
    		t.Errorf("Did not Receive expected Manager.Send."+
    			"\n\texpected: %+v\n\treceived: %+v",
    			expected.send, received.send)
    		equal = false
    	}
    
    	return equal
    }
    
    // Unit test of Manager.GetRelationshipFingerprint.
    func TestManager_GetRelationshipFingerprint(t *testing.T) {
    	m, _ := newTestManager(t)
    	m.receive.fingerprint = []byte{5}
    	m.send.fingerprint = []byte{10}
    	h, _ := blake2b.New256(nil)
    	h.Write(append(m.receive.fingerprint, m.send.fingerprint...))
    	expected := base64.StdEncoding.EncodeToString(h.Sum(nil))[:relationshipFpLength]
    
    	fp := m.GetRelationshipFingerprint()
    	if fp != expected {
    		t.Errorf("GetRelationshipFingerprint did not return the expected "+
    			"fingerprint.\nexpected: %s\nreceived: %s", expected, fp)
    	}
    
    	// Flip the order and show that the output is the same.
    	m.receive.fingerprint, m.send.fingerprint = m.send.fingerprint, m.receive.fingerprint
    
    	fp = m.GetRelationshipFingerprint()
    	if fp != expected {
    		t.Errorf("GetRelationshipFingerprint did not return the expected "+
    			"fingerprint.\nexpected: %s\nreceived: %s", expected, fp)
    	}
    }
    
    // Tests the consistency of the output of Manager.GetRelationshipFingerprint.
    func TestManager_GetRelationshipFingerprint_Consistency(t *testing.T) {
    	m, _ := newTestManager(t)
    	prng := rand.New(rand.NewSource(42))
    	expectedFps := []string{
    		"GmeTCfxGOqRqeID", "gbpJjHd3tIe8BKy", "2/ZdG+WNzODJBiF",
    		"+V1ySeDLQfQNSkv", "23OMC+rBmCk+gsu", "qHu5MUVs83oMqy8",
    		"kuXqxsezI0kS9Bc", "SlEhsoZ4BzAMTtr", "yG8m6SPQfV/sbTR",
    		"j01ZSSm762TH7mj", "SKFDbFvsPcohKPw", "6JB5HK8DHGwS4uX",
    		"dU3mS1ujduGD+VY", "BDXAy3trbs8P4mu", "I4HoXW45EwWR0oD",
    		"661YH2l2jfOkHbA", "cSS9ZyTOQKVx67a", "ojfubzDIsMNYc/t",
    		"2WrEw83Yz6Rhq9I", "TQILxBIUWMiQS2j", "rEqdieDTXJfCQ6I",
    	}
    
    	for i, expected := range expectedFps {
    		prng.Read(m.receive.fingerprint)
    		prng.Read(m.send.fingerprint)
    
    		fp := m.GetRelationshipFingerprint()
    		if fp != expected {
    			t.Errorf("GetRelationshipFingerprint did not return the expected "+
    				"fingerprint (%d).\nexpected: %s\nreceived: %s", i, expected, fp)
    		}
    
    		// Flip the order and show that the output is the same.
    		m.receive.fingerprint, m.send.fingerprint = m.send.fingerprint, m.receive.fingerprint
    
    		fp = m.GetRelationshipFingerprint()
    		if fp != expected {
    			t.Errorf("GetRelationshipFingerprint did not return the expected "+
    				"fingerprint (%d).\nexpected: %s\nreceived: %s", i, expected, fp)
    		}
    
    		// fmt.Printf("\"%s\",\n", fp) // Uncomment to reprint expected values
    	}
    }