From 32e41778566e2554fa68d51d822aa0c91c69bf84 Mon Sep 17 00:00:00 2001
From: benjamin <ben@elixxir.io>
Date: Tue, 25 Oct 2022 09:52:35 -0700
Subject: [PATCH] fixed interfaces and tests, improved code in prune

---
 channels/joinedChannel_test.go       |  6 ++--
 channels/manager.go                  |  1 +
 channels/sendTracker_test.go         |  2 ++
 cmix/identity/receptionID/store.go   | 48 ++++++++++++++++++----------
 connect/utils_test.go                |  5 +--
 dummy/mockCmix_test.go               |  5 +++
 e2e/fpGenerator_test.go              |  4 ++-
 e2e/rekey/utils_test.go              |  3 ++
 e2e/utils_test.go                    |  4 ++-
 fileTransfer/connect/utils_test.go   |  5 ++-
 fileTransfer/e2e/utils_test.go       |  5 ++-
 fileTransfer/groupChat/utils_test.go |  5 ++-
 fileTransfer/utils_test.go           |  5 ++-
 groupChat/networkManager_test.go     |  5 +++
 ud/networkManager_test.go            |  4 +++
 xxdk/utilsInterfaces_test.go         |  4 +++
 16 files changed, 85 insertions(+), 26 deletions(-)

diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go
index ca0ba9ba8..e2af5aaa6 100644
--- a/channels/joinedChannel_test.go
+++ b/channels/joinedChannel_test.go
@@ -599,8 +599,10 @@ func (m *mockBroadcastClient) SendWithAssembler(*id.ID,
 	return rounds.Round{ID: id.Round(567)}, ephemeral.Id{}, nil
 }
 
-func (m *mockBroadcastClient) IsHealthy() bool                                       { return true }
-func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool)                   {}
+func (m *mockBroadcastClient) IsHealthy() bool                     { return true }
+func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {}
+func (m *mockBroadcastClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (m *mockBroadcastClient) AddService(*id.ID, message.Service, message.Processor) {}
 func (m *mockBroadcastClient) DeleteClientService(*id.ID)                            {}
 func (m *mockBroadcastClient) RemoveIdentity(*id.ID)                                 {}
diff --git a/channels/manager.go b/channels/manager.go
index b6a474e2f..56926aa1a 100644
--- a/channels/manager.go
+++ b/channels/manager.go
@@ -67,6 +67,7 @@ type Client interface {
 		cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error)
 	IsHealthy() bool
 	AddIdentity(id *id.ID, validUntil time.Time, persistent bool)
+	AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool)
 	AddService(clientID *id.ID, newService message.Service,
 		response message.Processor)
 	DeleteClientService(clientID *id.ID)
diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go
index 6948df3be..2f564b88c 100644
--- a/channels/sendTracker_test.go
+++ b/channels/sendTracker_test.go
@@ -31,6 +31,8 @@ func (mc *mockClient) IsHealthy() bool {
 	return true
 }
 func (mc *mockClient) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {}
+func (mc *mockClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (mc *mockClient) AddService(clientID *id.ID, newService message.Service,
 	response message.Processor) {
 }
diff --git a/cmix/identity/receptionID/store.go b/cmix/identity/receptionID/store.go
index 35efbb226..bfd11eece 100644
--- a/cmix/identity/receptionID/store.go
+++ b/cmix/identity/receptionID/store.go
@@ -210,6 +210,21 @@ func (s *Store) AddIdentity(identity Identity) error {
 }
 
 func (s *Store) addIdentity(identity Identity) error {
+	err := s.addIdentityNoSave(identity)
+	if err != nil {
+		return err
+	}
+	if !identity.Ephemeral {
+		if err = s.save(); err != nil {
+			jww.FATAL.Panicf("Failed to save reception store after identity "+
+				"addition: %+v", err)
+		}
+	}
+
+	return nil
+}
+
+func (s *Store) addIdentityNoSave(identity Identity) error {
 	idH := makeIdHash(identity.EphId, identity.Source)
 
 	// Do not make duplicates of IDs
@@ -233,13 +248,6 @@ func (s *Store) addIdentity(identity Identity) error {
 
 	s.active = append(s.active, reg)
 	s.present[idH] = struct{}{}
-	if !identity.Ephemeral {
-		if err = s.save(); err != nil {
-			jww.FATAL.Panicf("Failed to save reception store after identity "+
-				"addition: %+v", err)
-		}
-	}
-
 	return nil
 }
 
@@ -318,18 +326,17 @@ func (s *Store) SetToExpire(addressSize uint8) {
 }
 
 func (s *Store) prune(now time.Time) {
-	lengthBefore := len(s.active)
-	var pruned []int64
+	pruned := make([]int64, 0, len(s.active))
+	added := make([]int64, 0, len(s.active))
 	// Prune the list
+	toAdd := make([]Identity, 0, len(s.active))
 	for i := 0; i < len(s.active); i++ {
 		inQuestion := s.active[i]
 		if now.After(inQuestion.End) && inQuestion.ExtraChecks == 0 {
 			if inQuestion.ProcessNext != nil {
-				if err := s.AddIdentity(*inQuestion.ProcessNext); err != nil {
-					jww.ERROR.Printf("Failed to add identity to process next "+
-						"for %d(%s). The identity chain may be lost",
-						inQuestion.EphId.Int64(), inQuestion.Source)
-				}
+				toAdd = append(toAdd, *inQuestion.ProcessNext)
+				added = append(added, inQuestion.ProcessNext.EphId.Int64())
+
 			}
 			if err := inQuestion.Delete(); err != nil {
 				jww.ERROR.Printf("Failed to delete Identity for %s: %+v",
@@ -343,11 +350,20 @@ func (s *Store) prune(now time.Time) {
 			i--
 		}
 	}
+	for i := range toAdd {
+		next := toAdd[i]
+		if err := s.addIdentityNoSave(next); err != nil {
+			jww.ERROR.Printf("Failed to add identity to process next "+
+				"for %d(%s). The identity chain may be lost",
+				next.EphId.Int64(), next.Source)
+		}
+	}
 
 	// Save the list if it changed
-	if lengthBefore != len(s.active) {
+	if len(added) > 0 || len(pruned) > 0 {
 		jww.INFO.Printf(
-			"Pruned %d identities [%+v]", lengthBefore-len(s.active), pruned)
+			"Pruned %d identities [%+v], added %d [%+v]", len(pruned), pruned,
+			len(added), added)
 		if err := s.save(); err != nil {
 			jww.FATAL.Panicf("Failed to store reception storage: %+v", err)
 		}
diff --git a/connect/utils_test.go b/connect/utils_test.go
index 86f190808..3aab375cc 100644
--- a/connect/utils_test.go
+++ b/connect/utils_test.go
@@ -172,8 +172,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss
 func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) {
 	return rounds.Round{}, []ephemeral.Id{}, nil
 }
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {}
-func (m *mockCmix) RemoveIdentity(*id.ID)               {}
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)                       {}
+func (m *mockCmix) AddIdentityWithHistory(*id.ID, time.Time, time.Time, bool) {}
+func (m *mockCmix) RemoveIdentity(*id.ID)                                     {}
 
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) {
 	return identity.TrackedID{Creation: netTime.Now().Add(-time.Minute)}, nil
diff --git a/dummy/mockCmix_test.go b/dummy/mockCmix_test.go
index 2aca679d0..75cdee581 100644
--- a/dummy/mockCmix_test.go
+++ b/dummy/mockCmix_test.go
@@ -86,6 +86,11 @@ func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXPara
 	panic("implement me")
 }
 
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	//TODO implement me
+	panic("implement me")
+}
+
 func (m *mockCmix) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {
 	//TODO implement me
 	panic("implement me")
diff --git a/e2e/fpGenerator_test.go b/e2e/fpGenerator_test.go
index 249dc5bba..657fc1646 100644
--- a/e2e/fpGenerator_test.go
+++ b/e2e/fpGenerator_test.go
@@ -129,7 +129,9 @@ func (m *mockFpgCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rou
 	return rounds.Round{}, nil, nil
 }
 func (m *mockFpgCmix) AddIdentity(*id.ID, time.Time, bool) {}
-func (m *mockFpgCmix) RemoveIdentity(*id.ID)               {}
+func (m *mockFpgCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
+func (m *mockFpgCmix) RemoveIdentity(*id.ID) {}
 func (m *mockFpgCmix) GetIdentity(*id.ID) (identity.TrackedID, error) {
 	return identity.TrackedID{}, nil
 }
diff --git a/e2e/rekey/utils_test.go b/e2e/rekey/utils_test.go
index 0b9fd3886..aeccacbe3 100644
--- a/e2e/rekey/utils_test.go
+++ b/e2e/rekey/utils_test.go
@@ -252,6 +252,9 @@ func (m *mockNetManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CM
 
 func (m *mockNetManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {}
 
+func (m *mockNetManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
+
 func (m *mockNetManager) RemoveIdentity(id *id.ID) {}
 
 func (m *mockNetManager) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint,
diff --git a/e2e/utils_test.go b/e2e/utils_test.go
index 6d8835b8c..78a0eaa7c 100644
--- a/e2e/utils_test.go
+++ b/e2e/utils_test.go
@@ -214,7 +214,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss
 func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) {
 	return rounds.Round{}, nil, nil
 }
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            {}
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {}
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          {}
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { return identity.TrackedID{}, nil }
 
diff --git a/fileTransfer/connect/utils_test.go b/fileTransfer/connect/utils_test.go
index 6c9de504f..5910ac657 100644
--- a/fileTransfer/connect/utils_test.go
+++ b/fileTransfer/connect/utils_test.go
@@ -140,7 +140,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/e2e/utils_test.go b/fileTransfer/e2e/utils_test.go
index 7de4bba2c..1c33203a1 100644
--- a/fileTransfer/e2e/utils_test.go
+++ b/fileTransfer/e2e/utils_test.go
@@ -142,7 +142,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/groupChat/utils_test.go b/fileTransfer/groupChat/utils_test.go
index 61dd18006..b1f5f18d4 100644
--- a/fileTransfer/groupChat/utils_test.go
+++ b/fileTransfer/groupChat/utils_test.go
@@ -137,7 +137,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/utils_test.go b/fileTransfer/utils_test.go
index ff7750fcb..a885e4d82 100644
--- a/fileTransfer/utils_test.go
+++ b/fileTransfer/utils_test.go
@@ -193,7 +193,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/groupChat/networkManager_test.go b/groupChat/networkManager_test.go
index e87b3f655..934744be0 100644
--- a/groupChat/networkManager_test.go
+++ b/groupChat/networkManager_test.go
@@ -95,6 +95,11 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers
 	panic("implement me")
 }
 
+func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	//TODO implement me
+	panic("implement me")
+}
+
 func (tnm *testNetworkManager) RemoveIdentity(id *id.ID) {
 	//TODO implement me
 	panic("implement me")
diff --git a/ud/networkManager_test.go b/ud/networkManager_test.go
index bd3630ebf..e58b3cf1f 100644
--- a/ud/networkManager_test.go
+++ b/ud/networkManager_test.go
@@ -127,6 +127,10 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers
 	return
 }
 
+func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	return
+}
+
 func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) {
 	return
 }
diff --git a/xxdk/utilsInterfaces_test.go b/xxdk/utilsInterfaces_test.go
index 4fbf38523..a6be0ca8d 100644
--- a/xxdk/utilsInterfaces_test.go
+++ b/xxdk/utilsInterfaces_test.go
@@ -160,6 +160,10 @@ func (t *testNetworkManagerGeneric) AddHealthCallback(f func(bool)) uint64 {
 func (t *testNetworkManagerGeneric) AddIdentity(id *id.ID,
 	validUntil time.Time, persistent bool) {
 }
+func (t *testNetworkManagerGeneric) AddIdentityWithHistory(id *id.ID, validUntil,
+	beginning time.Time, persistent bool) {
+}
+
 func (t *testNetworkManagerGeneric) RemoveIdentity(id *id.ID) {}
 func (t *testNetworkManagerGeneric) AddService(clientID *id.ID,
 	newService message.Service, response message.Processor) {
-- 
GitLab