Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
client
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
elixxir
client
Commits
e472274f
Commit
e472274f
authored
Apr 20, 2021
by
Josh Brooks
Browse files
Options
Downloads
Patches
Plain Diff
Add testing for new functions
parent
d1109e45
No related branches found
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
network/gateway/hostpool_test.go
+149
-4
149 additions, 4 deletions
network/gateway/hostpool_test.go
network/gateway/sender_test.go
+251
-0
251 additions, 0 deletions
network/gateway/sender_test.go
network/gateway/utils_test.go
+42
-0
42 additions, 0 deletions
network/gateway/utils_test.go
with
442 additions
and
4 deletions
network/gateway/hostpool_test.go
+
149
−
4
View file @
e472274f
...
@@ -8,6 +8,7 @@
...
@@ -8,6 +8,7 @@
package
gateway
package
gateway
import
(
import
(
"fmt"
jww
"github.com/spf13/jwalterweatherman"
jww
"github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/client/storage"
"gitlab.com/elixxir/client/storage"
"gitlab.com/elixxir/comms/network"
"gitlab.com/elixxir/comms/network"
...
@@ -250,8 +251,152 @@ func TestHostPool_ReplaceHost_Error(t *testing.T) {
...
@@ -250,8 +251,152 @@ func TestHostPool_ReplaceHost_Error(t *testing.T) {
}
}
// Unit test
func
TestHostPool_ForceReplace
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
// Construct custom params
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
// Pull all gateways from ndf into host manager
for
_
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
gw
.
Address
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
// Call the constructor
testPool
,
err
:=
newHostPool
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock host pool: %v"
,
err
)
}
// Add all gateways to hostPool's map
for
index
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
err
=
testPool
.
replaceHost
(
gwId
,
uint32
(
index
))
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to replace host in set-up: %v"
,
err
)
}
}
oldGatewayIndex
:=
0
oldHost
:=
testPool
.
hostList
[
oldGatewayIndex
]
// Force replace the gateway at a given index
err
=
testPool
.
forceReplace
(
uint32
(
oldGatewayIndex
))
if
err
!=
nil
{
t
.
Errorf
(
"Failed to force replace: %v"
,
err
)
}
// Ensure that old gateway has been removed from the map
if
_
,
ok
:=
testPool
.
hostMap
[
*
oldHost
.
GetId
()];
ok
{
t
.
Errorf
(
"Expected old host to be removed from map"
)
}
// Ensure we are disconnected from the old host
if
isConnected
,
_
:=
oldHost
.
Connected
();
isConnected
{
t
.
Errorf
(
"Failed to disconnect from old host %s"
,
oldHost
)
}
}
// Unit test
func
TestHostPool_CheckReplace
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
// Construct custom params
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
-
5
// Pull all gateways from ndf into host manager
for
_
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
gw
.
Address
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
// Call the constructor
testPool
,
err
:=
newHostPool
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock host pool: %v"
,
err
)
}
// Call check replace
oldGatewayIndex
:=
0
oldHost
:=
testPool
.
hostList
[
oldGatewayIndex
]
expectedError
:=
fmt
.
Errorf
(
errorsList
[
0
])
err
=
testPool
.
checkReplace
(
oldHost
.
GetId
(),
expectedError
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to check replace: %v"
,
err
)
}
// Ensure that old gateway has been removed from the map
if
_
,
ok
:=
testPool
.
hostMap
[
*
oldHost
.
GetId
()];
ok
{
t
.
Errorf
(
"Expected old host to be removed from map"
)
}
// Ensure we are disconnected from the old host
if
isConnected
,
_
:=
oldHost
.
Connected
();
isConnected
{
t
.
Errorf
(
"Failed to disconnect from old host %s"
,
oldHost
)
}
// Check that an error not in the global list results in a no-op
goodGatewayIndex
:=
0
goodGateway
:=
testPool
.
hostList
[
goodGatewayIndex
]
unexpectedErr
:=
fmt
.
Errorf
(
"Not in global error list"
)
err
=
testPool
.
checkReplace
(
oldHost
.
GetId
(),
unexpectedErr
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to check replace: %v"
,
err
)
}
// Ensure that gateway with an unexpected error was not modified
if
_
,
ok
:=
testPool
.
hostMap
[
*
goodGateway
.
GetId
()];
!
ok
{
t
.
Errorf
(
"Expected gateway with non-expected error to not be modified"
)
}
// Ensure gateway host has not been disconnected
if
isConnected
,
_
:=
oldHost
.
Connected
();
isConnected
{
t
.
Errorf
(
"Should not disconnect from %s"
,
oldHost
)
}
}
// TODO: Adapt to new methods
// TODO: Adapt to new methods
//
// Happy path
// Happy path
//func TestHostPool_PruneHostPool(t *testing.T) {
//func TestHostPool_PruneHostPool(t *testing.T) {
// manager := newMockManager()
// manager := newMockManager()
// testNdf := getTestNdf(t)
// testNdf := getTestNdf(t)
...
@@ -544,7 +689,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
...
@@ -544,7 +689,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
testPool
,
err
:=
newHostPool
(
params
,
rng
,
testNdf
,
manager
,
testPool
,
err
:=
newHostPool
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
testStorage
,
addGwChan
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Error
f
(
"Failed to create mock host pool: %v"
,
err
)
t
.
Fatal
f
(
"Failed to create mock host pool: %v"
,
err
)
}
}
// Construct a list of new gateways to add
// Construct a list of new gateways to add
...
@@ -555,8 +700,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
...
@@ -555,8 +700,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
// Add mock gateway to manager
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
""
,
nil
,
connect
.
GetDefaultHostParams
())
_
,
err
=
manager
.
AddHost
(
gwId
,
""
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
Fatalf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
newGateways
[
i
]
=
gwId
newGateways
[
i
]
=
gwId
}
}
...
@@ -567,6 +711,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
...
@@ -567,6 +711,7 @@ func TestHostPool_ForceAdd(t *testing.T) {
t
.
Errorf
(
"Could not add gateways: %v"
,
err
)
t
.
Errorf
(
"Could not add gateways: %v"
,
err
)
}
}
// check that gateways have been added to the map
for
_
,
gw
:=
range
newGateways
{
for
_
,
gw
:=
range
newGateways
{
if
_
,
ok
:=
testPool
.
hostMap
[
*
gw
];
!
ok
{
if
_
,
ok
:=
testPool
.
hostMap
[
*
gw
];
!
ok
{
t
.
Errorf
(
"Failed to forcefully add new gateway ID: %v"
,
gw
)
t
.
Errorf
(
"Failed to forcefully add new gateway ID: %v"
,
gw
)
...
...
This diff is collapsed.
Click to expand it.
network/gateway/sender_test.go
0 → 100644
+
251
−
0
View file @
e472274f
///////////////////////////////////////////////////////////////////////////////
// Copyright © 2020 xx network SEZC //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file //
///////////////////////////////////////////////////////////////////////////////
package
gateway
import
(
"gitlab.com/elixxir/client/storage"
"gitlab.com/elixxir/comms/network"
"gitlab.com/xx_network/comms/connect"
"gitlab.com/xx_network/crypto/csprng"
"gitlab.com/xx_network/primitives/id"
"reflect"
"testing"
)
// Unit test
func
TestNewSender
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
_
,
err
:=
NewSender
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock sender: %v"
,
err
)
}
}
// Unit test
func
TestSender_SendToAny
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
// Pull all gateways from ndf into host manager
for
_
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
gw
.
Address
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
sender
,
err
:=
NewSender
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock sender: %v"
,
err
)
}
// Add all gateways to hostPool's map
for
index
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
err
=
sender
.
replaceHost
(
gwId
,
uint32
(
index
))
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to replace host in set-up: %v"
,
err
)
}
}
// Test sendToAny with test interfaces
result
,
err
:=
sender
.
SendToAny
(
SendToAny_HappyPath
)
if
err
!=
nil
{
t
.
Errorf
(
"Should not error in SendToAny happy path: %v"
,
err
)
}
if
!
reflect
.
DeepEqual
(
result
,
happyPathReturn
)
{
t
.
Errorf
(
"Expected result not returnev via SendToAny interface."
+
"
\n\t
Expected: %v"
+
"
\n\t
Received: %v"
,
happyPathReturn
,
result
)
}
_
,
err
=
sender
.
SendToAny
(
SendToAny_KnownError
)
if
err
==
nil
{
t
.
Fatalf
(
"Expected error path did not receive error"
)
}
_
,
err
=
sender
.
SendToAny
(
SendToAny_UnknownError
)
if
err
==
nil
{
t
.
Fatalf
(
"Expected error path did not receive error"
)
}
}
// Unit test
func
TestSender_SendToPreferred
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
-
5
// Do not test proxy attempts code in this test
// (self contain to code specific in sendPreferred)
params
.
ProxyAttempts
=
0
// Pull all gateways from ndf into host manager
for
_
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
gw
.
Address
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
sender
,
err
:=
NewSender
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock sender: %v"
,
err
)
}
preferredIndex
:=
0
preferredHost
:=
sender
.
hostList
[
preferredIndex
]
// Happy path
result
,
err
:=
sender
.
SendToPreferred
([]
*
id
.
ID
{
preferredHost
.
GetId
()},
SendToPreferred_HappyPath
)
if
err
!=
nil
{
t
.
Errorf
(
"Should not error in SendToPreferred happy path: %v"
,
err
)
}
if
!
reflect
.
DeepEqual
(
result
,
happyPathReturn
)
{
t
.
Errorf
(
"Expected result not returnev via SendToPreferred interface."
+
"
\n\t
Expected: %v"
+
"
\n\t
Received: %v"
,
happyPathReturn
,
result
)
}
// Call a send which returns an error which triggers replacement
_
,
err
=
sender
.
SendToPreferred
([]
*
id
.
ID
{
preferredHost
.
GetId
()},
SendToPreferred_KnownError
)
if
err
==
nil
{
t
.
Fatalf
(
"Expected error path did not receive error"
)
}
// Check the host has been replaced
if
_
,
ok
:=
sender
.
hostMap
[
*
preferredHost
.
GetId
()];
ok
{
t
.
Errorf
(
"Expected host %s to be removed due to error"
,
preferredHost
)
}
// Ensure we are disconnected from the old host
if
isConnected
,
_
:=
preferredHost
.
Connected
();
isConnected
{
t
.
Errorf
(
"ForceReplace error: Failed to disconnect from old host %s"
,
preferredHost
)
}
// Get a new host to test on
preferredIndex
=
4
preferredHost
=
sender
.
hostList
[
preferredIndex
]
// Unknown error return will not trigger replacement
_
,
err
=
sender
.
SendToPreferred
([]
*
id
.
ID
{
preferredHost
.
GetId
()},
SendToPreferred_UnknownError
)
if
err
==
nil
{
t
.
Fatalf
(
"Expected error path did not receive error"
)
}
// Check the host has not been replaced
if
_
,
ok
:=
sender
.
hostMap
[
*
preferredHost
.
GetId
()];
!
ok
{
t
.
Errorf
(
"Host %s should not have been removed due on an unknown error"
,
preferredHost
)
}
// Ensure we are disconnected from the old host
if
isConnected
,
_
:=
preferredHost
.
Connected
();
isConnected
{
t
.
Errorf
(
"Should not disconnect from %s"
,
preferredHost
)
}
}
func
TestSender_SendToSpecific
(
t
*
testing
.
T
)
{
manager
:=
newMockManager
()
rng
:=
csprng
.
NewSystemRNG
()
testNdf
:=
getTestNdf
(
t
)
testStorage
:=
storage
.
InitTestingSession
(
t
)
addGwChan
:=
make
(
chan
network
.
NodeGateway
)
params
:=
DefaultPoolParams
()
params
.
PoolSize
=
uint32
(
len
(
testNdf
.
Gateways
))
-
5
// Do not test proxy attempts code in this test
// (self contain to code specific in sendPreferred)
params
.
ProxyAttempts
=
0
// Pull all gateways from ndf into host manager
for
_
,
gw
:=
range
testNdf
.
Gateways
{
gwId
,
err
:=
id
.
Unmarshal
(
gw
.
ID
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed to unmarshal ID in mock ndf: %v"
,
err
)
}
// Add mock gateway to manager
_
,
err
=
manager
.
AddHost
(
gwId
,
gw
.
Address
,
nil
,
connect
.
GetDefaultHostParams
())
if
err
!=
nil
{
t
.
Errorf
(
"Could not add mock host to manager: %v"
,
err
)
t
.
FailNow
()
}
}
sender
,
err
:=
NewSender
(
params
,
rng
,
testNdf
,
manager
,
testStorage
,
addGwChan
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to create mock sender: %v"
,
err
)
}
preferredIndex
:=
0
preferredHost
:=
sender
.
hostList
[
preferredIndex
]
// Happy path
result
,
err
:=
sender
.
SendToSpecific
(
preferredHost
.
GetId
(),
SendToSpecific_HappyPath
)
if
err
!=
nil
{
t
.
Errorf
(
"Should not error in SendToSpecific happy path: %v"
,
err
)
}
if
!
reflect
.
DeepEqual
(
result
,
happyPathReturn
)
{
t
.
Errorf
(
"Expected result not returnev via SendToSpecific interface."
+
"
\n\t
Expected: %v"
+
"
\n\t
Received: %v"
,
happyPathReturn
,
result
)
}
// Ensure host is now in map
if
_
,
ok
:=
sender
.
hostMap
[
*
preferredHost
.
GetId
()];
!
ok
{
t
.
Errorf
(
"Failed to forcefully add new gateway ID: %v"
,
preferredHost
.
GetId
())
}
_
,
err
=
sender
.
SendToSpecific
(
preferredHost
.
GetId
(),
SendToSpecific_Abort
)
if
err
==
nil
{
t
.
Errorf
(
"Expected sendSpecific to return an abort"
)
}
}
This diff is collapsed.
Click to expand it.
network/gateway/utils_test.go
+
42
−
0
View file @
e472274f
///////////////////////////////////////////////////////////////////////////////
// Copyright © 2020 xx network SEZC //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file //
///////////////////////////////////////////////////////////////////////////////
package
gateway
package
gateway
import
(
import
(
"fmt"
"gitlab.com/xx_network/comms/connect"
"gitlab.com/xx_network/comms/connect"
"gitlab.com/xx_network/primitives/id"
"gitlab.com/xx_network/primitives/id"
"gitlab.com/xx_network/primitives/ndf"
"gitlab.com/xx_network/primitives/ndf"
...
@@ -118,3 +126,37 @@ func getTestNdf(face interface{}) *ndf.NetworkDefinition {
...
@@ -118,3 +126,37 @@ func getTestNdf(face interface{}) *ndf.NetworkDefinition {
}},
}},
}
}
}
}
const
happyPathReturn
=
"happyPathReturn"
func
SendToPreferred_HappyPath
(
host
*
connect
.
Host
,
target
*
id
.
ID
)
(
interface
{},
error
)
{
return
happyPathReturn
,
nil
}
func
SendToPreferred_KnownError
(
host
*
connect
.
Host
,
target
*
id
.
ID
)
(
interface
{},
error
)
{
return
nil
,
fmt
.
Errorf
(
errorsList
[
0
])
}
func
SendToPreferred_UnknownError
(
host
*
connect
.
Host
,
target
*
id
.
ID
)
(
interface
{},
error
)
{
return
nil
,
fmt
.
Errorf
(
"Unexpected error: Oopsie"
)
}
func
SendToAny_HappyPath
(
host
*
connect
.
Host
)
(
interface
{},
error
)
{
return
happyPathReturn
,
nil
}
func
SendToAny_KnownError
(
host
*
connect
.
Host
)
(
interface
{},
error
)
{
return
nil
,
fmt
.
Errorf
(
errorsList
[
0
])
}
func
SendToAny_UnknownError
(
host
*
connect
.
Host
)
(
interface
{},
error
)
{
return
nil
,
fmt
.
Errorf
(
"Unexpected error: Oopsie"
)
}
func
SendToSpecific_HappyPath
(
host
*
connect
.
Host
,
target
*
id
.
ID
)
(
interface
{},
bool
,
error
)
{
return
happyPathReturn
,
false
,
nil
}
func
SendToSpecific_Abort
(
host
*
connect
.
Host
,
target
*
id
.
ID
)
(
interface
{},
bool
,
error
)
{
return
nil
,
true
,
fmt
.
Errorf
(
errorsList
[
0
])
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment