From 9bbfa1f382c2d661098d5840f744893a1f368877 Mon Sep 17 00:00:00 2001
From: Jake Taylor <jake@elixxir.io>
Date: Wed, 13 Apr 2022 12:23:09 -0500
Subject: [PATCH] fix more group chat tests

---
 e2e/ratchet/partner/utils.go | 113 +++++++++++++++++++++++++++++++++++
 groupChat/makeGroup.go       |   5 --
 groupChat/makeGroup_test.go  |   2 +-
 groupChat/manager_test.go    |   6 +-
 groupChat/utils_test.go      |  55 ++++++++++-------
 5 files changed, 150 insertions(+), 31 deletions(-)
 create mode 100644 e2e/ratchet/partner/utils.go

diff --git a/e2e/ratchet/partner/utils.go b/e2e/ratchet/partner/utils.go
new file mode 100644
index 000000000..55a25ab9b
--- /dev/null
+++ b/e2e/ratchet/partner/utils.go
@@ -0,0 +1,113 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright © 2022 Privategrity Corporation                                   /
+//                                                                             /
+// All rights reserved.                                                        /
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+// Copyright © 2022 Privategrity Corporation                                   /
+//                                                                             /
+// All rights reserved.                                                        /
+////////////////////////////////////////////////////////////////////////////////
+
+package partner
+
+import (
+	"github.com/cloudflare/circl/dh/sidh"
+	"gitlab.com/elixxir/client/cmix/message"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
+	"gitlab.com/elixxir/crypto/contact"
+	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/xx_network/primitives/id"
+	"testing"
+)
+
+// Test implementation of the Manager interface
+type testManager struct {
+	partnerId                *id.ID
+	grp                      *cyclic.Group
+	partnerPubKey, myPrivKey *cyclic.Int
+}
+
+// NewTestManager allows creation of a Manager interface object for testing purposes
+// Backwards compatibility must be maintained if you make changes here
+// Currently used for: Group chat testing
+func NewTestManager(partnerId *id.ID, partnerPubKey, myPrivKey *cyclic.Int, t *testing.T) Manager {
+	return &testManager{partnerId: partnerId, partnerPubKey: partnerPubKey, myPrivKey: myPrivKey}
+}
+
+func (p *testManager) GetPartnerID() *id.ID {
+	return p.partnerId
+}
+
+func (p *testManager) GetMyID() *id.ID {
+	panic("implement me")
+}
+
+func (p *testManager) GetMyOriginPrivateKey() *cyclic.Int {
+	return p.myPrivKey
+}
+
+func (p *testManager) GetPartnerOriginPublicKey() *cyclic.Int {
+	return p.partnerPubKey
+}
+
+func (p *testManager) GetSendRelationshipFingerprint() []byte {
+	panic("implement me")
+}
+
+func (p *testManager) GetReceiveRelationshipFingerprint() []byte {
+	panic("implement me")
+}
+
+func (p *testManager) GetConnectionFingerprintBytes() []byte {
+	panic("implement me")
+}
+
+func (p *testManager) GetConnectionFingerprint() string {
+	panic("implement me")
+}
+
+func (p *testManager) GetContact() contact.Contact {
+	panic("implement me")
+}
+
+func (p *testManager) PopSendCypher() (*session.Cypher, error) {
+	panic("implement me")
+}
+
+func (p *testManager) PopRekeyCypher() (*session.Cypher, error) {
+	panic("implement me")
+}
+
+func (p *testManager) NewReceiveSession(partnerPubKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, e2eParams session.Params, source *session.Session) (*session.Session, bool) {
+	panic("implement me")
+}
+
+func (p *testManager) NewSendSession(myDHPrivKey *cyclic.Int, mySIDHPrivateKey *sidh.PrivateKey, e2eParams session.Params, source *session.Session) *session.Session {
+	panic("implement me")
+}
+
+func (p *testManager) GetSendSession(sid session.SessionID) *session.Session {
+	panic("implement me")
+}
+
+func (p *testManager) GetReceiveSession(sid session.SessionID) *session.Session {
+	panic("implement me")
+}
+
+func (p *testManager) Confirm(sid session.SessionID) error {
+	panic("implement me")
+}
+
+func (p *testManager) TriggerNegotiations() []*session.Session {
+	panic("implement me")
+}
+
+func (p *testManager) MakeService(tag string) message.Service {
+	panic("implement me")
+}
+
+func (p *testManager) Delete() error {
+	panic("implement me")
+}
diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go
index d8f6dd8c3..cc0d22da3 100644
--- a/groupChat/makeGroup.go
+++ b/groupChat/makeGroup.go
@@ -29,7 +29,6 @@ const (
 	makeMembershipErr = "failed to assemble group chat membership: %+v"
 	newIdPreimageErr  = "failed to create group ID preimage: %+v"
 	newKeyPreimageErr = "failed to create group key preimage: %+v"
-	addGroupErr       = "failed to save new group: %+v"
 )
 
 // MaxInitMessageSize is the maximum allowable length of the initial message
@@ -81,16 +80,12 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group,
 	// Create new group and add to manager
 	g := gs.NewGroup(
 		name, groupID, groupKey, idPreimage, keyPreimage, msg, created, mem, dkl)
-	if err = m.gs.Add(g); err != nil {
-		return gs.Group{}, nil, NotSent, errors.Errorf(addGroupErr, err)
-	}
 
 	jww.DEBUG.Printf("Created new group %q with ID %s and %d members %s",
 		g.Name, g.ID, len(g.Members), g.Members)
 
 	// Send all group requests
 	roundIDs, status, err := m.sendRequests(g)
-
 	if err == nil {
 		err = m.JoinGroup(g)
 	}
diff --git a/groupChat/makeGroup_test.go b/groupChat/makeGroup_test.go
index eb0676859..a9541b844 100644
--- a/groupChat/makeGroup_test.go
+++ b/groupChat/makeGroup_test.go
@@ -121,7 +121,7 @@ func TestManager_MakeGroup_AddGroupError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
 	m, _ := newTestManagerWithStore(prng, gs.MaxGroupChats, 0, nil, nil, t)
 	memberIDs, _, _ := addPartners(m, t)
-	expectedErr := strings.SplitN(addGroupErr, "%", 2)[0]
+	expectedErr := strings.SplitN(joinGroupErr, "%", 2)[0]
 
 	_, _, _, err := m.MakeGroup(memberIDs, []byte{}, []byte{})
 	if err == nil || !strings.Contains(err.Error(), expectedErr) {
diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go
index 9cf51c8bc..5a9c30cdc 100644
--- a/groupChat/manager_test.go
+++ b/groupChat/manager_test.go
@@ -31,7 +31,7 @@ func Test_newManager(t *testing.T) {
 	requestFunc := func(g gs.Group) { requestChan <- g }
 	receiveChan := make(chan MessageReceive)
 	receiveFunc := func(msg MessageReceive) { receiveChan <- msg }
-	m, err := NewManager(nil, nil, user.ID, nil, nil, kv, requestFunc, receiveFunc)
+	m, err := NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, requestFunc, receiveFunc)
 	if err != nil {
 		t.Errorf("newManager() returned an error: %+v", err)
 	}
@@ -84,7 +84,7 @@ func Test_newManager_LoadStorage(t *testing.T) {
 		}
 	}
 
-	m, err := NewManager(nil, nil, user.ID, nil, nil, kv, nil, nil)
+	m, err := NewManager(newTestNetworkManager(0, t), newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, nil, nil)
 	if err != nil {
 		t.Errorf("newManager() returned an error: %+v", err)
 	}
@@ -118,7 +118,7 @@ func Test_newManager_LoadError(t *testing.T) {
 
 	expectedErr := strings.SplitN(newGroupStoreErr, "%", 2)[0]
 
-	_, err = NewManager(nil, nil, user.ID, nil, nil, kv, nil, nil)
+	_, err = NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, nil, nil)
 	if err == nil || !strings.Contains(err.Error(), expectedErr) {
 		t.Errorf("newManager() did not return the expected error."+
 			"\nexpected: %s\nreceived: %+v", expectedErr, err)
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index 4854e5650..5dfd0c4c9 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -47,15 +47,11 @@ func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) {
 		rng:         fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
 		grp:         getGroup(),
 		services:    newTestNetworkManager(0, t),
-		e2e: &testE2eManager{
-			e2eMessages: []testE2eMessage{},
-			errSkip:     0,
-			sendErr:     0,
-		},
+		e2e:         newTestE2eManager(randCycInt(rng)),
 	}
 	user := group.Member{
 		ID:    m.receptionId,
-		DhKey: randCycInt(rng),
+		DhKey: m.e2e.GetHistoricalDHPubkey(),
 	}
 
 	g := newTestGroupWithUser(m.grp, user.ID, user.DhKey,
@@ -82,16 +78,11 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int,
 		requestFunc: requestFunc,
 		receiveFunc: receiveFunc,
 		services:    newTestNetworkManager(sendErr, t),
-		e2e: &testE2eManager{
-			e2eMessages: []testE2eMessage{},
-			errSkip:     0,
-			sendErr:     sendErr,
-		},
+		e2e:         newTestE2eManager(randCycInt(rng)),
 	}
-
 	user := group.Member{
 		ID:    m.receptionId,
-		DhKey: randCycInt(rng),
+		DhKey: m.e2e.GetHistoricalDHPubkey(),
 	}
 
 	gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user)
@@ -111,6 +102,16 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int,
 	return m, g
 }
 
+func newTestE2eManager(dhPubKey *cyclic.Int) *testE2eManager {
+	return &testE2eManager{
+		e2eMessages: []testE2eMessage{},
+		errSkip:     0,
+		grp:         getGroup(),
+		dhPubKey:    dhPubKey,
+		partners:    make(map[id.ID]partner.Manager),
+	}
+}
+
 // getMembership returns a Membership with random members for testing.
 func getMembership(size int, uid *id.ID, pubKey *cyclic.Int, grp *cyclic.Group,
 	prng *rand.Rand, t *testing.T) group.Membership {
@@ -226,8 +227,11 @@ func newTestNetworkManager(sendErr int, t *testing.T) GroupCmix {
 // testE2eManager is a test implementation of NetworkManager interface.
 type testE2eManager struct {
 	e2eMessages []testE2eMessage
+	partners    map[id.ID]partner.Manager
 	errSkip     int
 	sendErr     int
+	dhPubKey    *cyclic.Int
+	grp         *cyclic.Group
 	sync.RWMutex
 }
 
@@ -237,20 +241,27 @@ type testE2eMessage struct {
 }
 
 func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int,
-	partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params) (partner.Manager, error) {
-	return nil, nil
+	partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey,
+	sendParams, receiveParams session.Params) (partner.Manager, error) {
+
+	testPartner := partner.NewTestManager(partnerID, partnerPubKey, myPrivKey, &testing.T{})
+	tnm.partners[*partnerID] = testPartner
+	return testPartner, nil
 }
 
 func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (partner.Manager, error) {
-	return nil, nil
+	if partner, ok := tnm.partners[*partnerID]; ok {
+		return partner, nil
+	}
+	return nil, errors.New("Unable to find partner")
 }
 
 func (tnm *testE2eManager) GetHistoricalDHPubkey() *cyclic.Int {
-	panic("implement me")
+	return tnm.dhPubKey
 }
 
 func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int {
-	panic("implement me")
+	return tnm.dhPubKey
 }
 
 func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time, error) {
@@ -273,11 +284,11 @@ func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, pay
 }
 
 func (*testE2eManager) RegisterListener(user *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID {
-	panic("implement me")
+	return receive.ListenerID{}
 }
 
 func (*testE2eManager) AddService(tag string, processor message.Processor) error {
-	panic("implement me")
+	return nil
 }
 
 func (*testE2eManager) GetDefaultHistoricalDHPubkey() *cyclic.Int {
@@ -326,11 +337,11 @@ func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p c
 }
 
 func (*testNetworkManager) AddService(clientID *id.ID, newService message.Service, response message.Processor) {
-	panic("implement me")
+	return
 }
 
 func (*testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) {
-	panic("implement me")
+	return
 }
 
 type dummyEventMgr struct{}
-- 
GitLab