Something went wrong on our end
-
Josh Brooks authoredJosh Brooks authored
fpGenerator_test.go 7.32 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 (
"gitlab.com/elixxir/client/cmix"
"gitlab.com/elixxir/client/cmix/gateway"
"gitlab.com/elixxir/client/cmix/identity"
"gitlab.com/elixxir/client/cmix/message"
"gitlab.com/elixxir/client/cmix/rounds"
"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
"gitlab.com/elixxir/client/stoppable"
"gitlab.com/elixxir/comms/network"
"gitlab.com/elixxir/crypto/e2e"
"gitlab.com/elixxir/primitives/format"
"gitlab.com/xx_network/comms/connect"
"gitlab.com/xx_network/primitives/id"
"gitlab.com/xx_network/primitives/id/ephemeral"
"math/rand"
"sync"
"testing"
"time"
)
// Adds a list of cyphers with different fingerprints with fpGenerator.AddKey
// and then checks that they were added to the mock cMix fingerprint tracker.
func Test_fpGenerator_AddKey(t *testing.T) {
prng := rand.New(rand.NewSource(42))
net := newMockFpgCmix()
fpg := &fpGenerator{&manager{
net: net,
myID: id.NewIdFromString("myID", id.User, t),
}}
fps := make([]format.Fingerprint, 20)
for i := range fps {
prng.Read(fps[i][:])
fpg.AddKey(mockSessionCypher{fps[i]})
}
for i, fp := range fps {
if _, exists := net.processors[*fpg.m.myID][fp]; !exists {
t.Errorf("Fingerprint #%d does not exist.", i)
} else {
delete(net.processors[*fpg.m.myID], fp)
}
}
if len(net.processors[*fpg.m.myID]) != 0 {
t.Errorf("%d extra fingerprints found: %+v",
len(net.processors[*fpg.m.myID]), net.processors[*fpg.m.myID])
}
}
// Adds a list of cyphers with different fingerprints and then deletes all of
// them with fpGenerator.DeleteKey and checks that all keys were deleted.
func Test_fpGenerator_DeleteKey(t *testing.T) {
prng := rand.New(rand.NewSource(42))
net := newMockFpgCmix()
fpg := &fpGenerator{&manager{
net: net,
myID: id.NewIdFromString("myID", id.User, t),
}}
fps := make([]format.Fingerprint, 20)
for i := range fps {
prng.Read(fps[i][:])
fpg.AddKey(mockSessionCypher{fps[i]})
}
for _, fp := range fps {
fpg.DeleteKey(mockSessionCypher{fp})
}
if len(net.processors[*fpg.m.myID]) != 0 {
t.Errorf("%d extra fingerprints found: %+v",
len(net.processors[*fpg.m.myID]), net.processors[*fpg.m.myID])
}
}
////////////////////////////////////////////////////////////////////////////////
// Mock Session Cypher //
////////////////////////////////////////////////////////////////////////////////
type mockSessionCypher struct {
fp format.Fingerprint
}
func (m mockSessionCypher) GetSession() *session.Session { return nil }
func (m mockSessionCypher) Fingerprint() format.Fingerprint { return m.fp }
func (m mockSessionCypher) Encrypt([]byte) (ecrContents, mac []byte, residue e2e.KeyResidue) {
return nil, nil, e2e.KeyResidue{}
}
func (m mockSessionCypher) Decrypt(format.Message) ([]byte, e2e.KeyResidue, error) {
return nil, e2e.KeyResidue{}, nil
}
func (m mockSessionCypher) Use() {}
////////////////////////////////////////////////////////////////////////////////
// Mock cMix //
////////////////////////////////////////////////////////////////////////////////
type mockFpgCmix struct {
processors map[id.ID]map[format.Fingerprint]message.Processor
sync.Mutex
}
func newMockFpgCmix() *mockFpgCmix {
return &mockFpgCmix{
processors: make(map[id.ID]map[format.Fingerprint]message.Processor),
}
}
func (m *mockFpgCmix) Follow(cmix.ClientErrorReport) (stoppable.Stoppable, error) { return nil, nil }
func (m *mockFpgCmix) GetMaxMessageLength() int { return 0 }
func (m *mockFpgCmix) Send(*id.ID, format.Fingerprint, message.Service, []byte, []byte, cmix.CMIXParams) (id.Round, ephemeral.Id, error) {
return 0, ephemeral.Id{}, nil
}
func (m *mockFpgCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (id.Round, []ephemeral.Id, error) {
return 0, nil, nil
}
func (m *mockFpgCmix) AddIdentity(*id.ID, time.Time, bool) {}
func (m *mockFpgCmix) RemoveIdentity(*id.ID) {}
func (m *mockFpgCmix) GetIdentity(*id.ID) (identity.TrackedID, error) {
return identity.TrackedID{}, nil
}
func (m *mockFpgCmix) AddFingerprint(uid *id.ID, fp format.Fingerprint, mp message.Processor) error {
m.Lock()
defer m.Unlock()
if _, exists := m.processors[*uid]; !exists {
m.processors[*uid] =
map[format.Fingerprint]message.Processor{fp: mp}
} else if _, exists = m.processors[*uid][fp]; !exists {
m.processors[*uid][fp] = mp
}
return nil
}
func (m *mockFpgCmix) DeleteFingerprint(uid *id.ID, fp format.Fingerprint) {
m.Lock()
defer m.Unlock()
if _, exists := m.processors[*uid]; exists {
delete(m.processors[*uid], fp)
}
}
func (m *mockFpgCmix) DeleteClientFingerprints(*id.ID) {}
func (m *mockFpgCmix) AddService(*id.ID, message.Service, message.Processor) {}
func (m *mockFpgCmix) DeleteService(*id.ID, message.Service, message.Processor) {}
func (m *mockFpgCmix) DeleteClientService(*id.ID) {}
func (m *mockFpgCmix) TrackServices(message.ServicesTracker) {}
func (m *mockFpgCmix) CheckInProgressMessages() {}
func (m *mockFpgCmix) IsHealthy() bool { return false }
func (m *mockFpgCmix) WasHealthy() bool { return false }
func (m *mockFpgCmix) AddHealthCallback(func(bool)) uint64 { return 0 }
func (m *mockFpgCmix) RemoveHealthCallback(uint64) {}
func (m *mockFpgCmix) HasNode(*id.ID) bool { return false }
func (m *mockFpgCmix) NumRegisteredNodes() int { return 0 }
func (m *mockFpgCmix) TriggerNodeRegistration(*id.ID) {}
func (m *mockFpgCmix) GetRoundResults(time.Duration, cmix.RoundEventCallback, ...id.Round) error {
return nil
}
func (m *mockFpgCmix) LookupHistoricalRound(id.Round, rounds.RoundResultCallback) error { return nil }
func (m *mockFpgCmix) SendToAny(func(host *connect.Host) (interface{}, error), *stoppable.Single) (interface{}, error) {
return nil, nil
}
func (m *mockFpgCmix) SendToPreferred([]*id.ID, gateway.SendToPreferredFunc, *stoppable.Single, time.Duration) (interface{}, error) {
return nil, nil
}
func (m *mockFpgCmix) SetGatewayFilter(gateway.Filter) {}
func (m *mockFpgCmix) GetHostParams() connect.HostParams { return connect.HostParams{} }
func (m *mockFpgCmix) GetAddressSpace() uint8 { return 0 }
func (m *mockFpgCmix) RegisterAddressSpaceNotification(string) (chan uint8, error) { return nil, nil }
func (m *mockFpgCmix) UnregisterAddressSpaceNotification(string) {}
func (m *mockFpgCmix) GetInstance() *network.Instance { return nil }
func (m *mockFpgCmix) GetVerboseRounds() string { return "" }