safing-portmaster/spn/navigator/findnearest_test.go
Daniel Hååvi 80664d1a27
Restructure modules ()
* Move portbase into monorepo

* Add new simple module mgr

* [WIP] Switch to new simple module mgr

* Add StateMgr and more worker variants

* [WIP] Switch more modules

* [WIP] Switch more modules

* [WIP] swtich more modules

* [WIP] switch all SPN modules

* [WIP] switch all service modules

* [WIP] Convert all workers to the new module system

* [WIP] add new task system to module manager

* [WIP] Add second take for scheduling workers

* [WIP] Add FIXME for bugs in new scheduler

* [WIP] Add minor improvements to scheduler

* [WIP] Add new worker scheduler

* [WIP] Fix more bug related to new module system

* [WIP] Fix start handing of the new module system

* [WIP] Improve startup process

* [WIP] Fix minor issues

* [WIP] Fix missing subsystem in settings

* [WIP] Initialize managers in constructor

* [WIP] Move module event initialization to constrictors

* [WIP] Fix setting for enabling and disabling the SPN module

* [WIP] Move API registeration into module construction

* [WIP] Update states mgr for all modules

* [WIP] Add CmdLine operation support

* Add state helper methods to module group and instance

* Add notification and module status handling to status package

* Fix starting issues

* Remove pilot widget and update security lock to new status data

* Remove debug logs

* Improve http server shutdown

* Add workaround for cleanly shutting down firewall+netquery

* Improve logging

* Add syncing states with notifications for new module system

* Improve starting, stopping, shutdown; resolve FIXMEs/TODOs

* [WIP] Fix most unit tests

* Review new module system and fix minor issues

* Push shutdown and restart events again via API

* Set sleep mode via interface

* Update example/template module

* [WIP] Fix spn/cabin unit test

* Remove deprecated UI elements

* Make log output more similar for the logging transition phase

* Switch spn hub and observer cmds to new module system

* Fix log sources

* Make worker mgr less error prone

* Fix tests and minor issues

* Fix observation hub

* Improve shutdown and restart handling

* Split up big connection.go source file

* Move varint and dsd packages to structures repo

* Improve expansion test

* Fix linter warnings

* Fix interception module on windows

* Fix linter errors

---------

Co-authored-by: Vladimir Stoilov <vladimir@safing.io>
2024-08-09 18:15:48 +03:00

124 lines
2.8 KiB
Go

package navigator
import (
"testing"
)
func TestFindNearest(t *testing.T) {
t.Parallel()
// Create map and lock faking in order to guarantee reproducability of faked data.
m := getDefaultTestMap()
fakeLock.Lock()
defer fakeLock.Unlock()
for range 100 {
// Create a random destination address
ip4, loc4 := createGoodIP(true)
nbPins, err := m.findNearestPins(loc4, nil, m.DefaultOptions(), DestinationHub, false)
if err != nil {
t.Error(err)
} else {
t.Logf("Pins near %s: %s", ip4, nbPins)
}
}
for range 100 {
// Create a random destination address
ip6, loc6 := createGoodIP(true)
nbPins, err := m.findNearestPins(nil, loc6, m.DefaultOptions(), DestinationHub, false)
if err != nil {
t.Error(err)
} else {
t.Logf("Pins near %s: %s", ip6, nbPins)
}
}
}
/*
TODO: Find a way to quickly generate good geoip data on the fly, as we don't want to measure IP address generation, but only finding the nearest pins.
func BenchmarkFindNearest(b *testing.B) {
// Create map and lock faking in order to guarantee reproducability of faked data.
m := getDefaultTestMap()
fakeLock.Lock()
defer fakeLock.Unlock()
b.ResetTimer()
for i := 0; i < b.N; i++ {
// Create a random destination address
var dstIP net.IP
if i%2 == 0 {
dstIP = net.ParseIP(gofakeit.IPv4Address())
} else {
dstIP = net.ParseIP(gofakeit.IPv6Address())
}
_, err := m.findNearestPins(dstIP, m.DefaultOptions(),DestinationHub if err != nil {
b.Error(err)
}
}
}
*/
func findFakeHomeHub(m *Map) {
// Create fake IP address.
_, loc4 := createGoodIP(true)
_, loc6 := createGoodIP(false)
nbPins, err := m.findNearestPins(loc4, loc6, m.defaultOptions(), HomeHub, false)
if err != nil {
panic(err)
}
if len(nbPins.pins) == 0 {
panic("could not find a Home Hub")
}
// Set Home.
m.home = nbPins.pins[0].pin
// Recalculate reachability.
if err := m.recalculateReachableHubs(); err != nil {
panic(err)
}
}
func TestNearbyPinsCleaning(t *testing.T) {
t.Parallel()
testCleaning(t, []float32{10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, 3)
testCleaning(t, []float32{10, 11, 12, 13, 50, 60, 70, 80, 90, 100}, 4)
testCleaning(t, []float32{10, 11, 12, 40, 50, 60, 70, 80, 90, 100}, 3)
testCleaning(t, []float32{10, 11, 30, 40, 50, 60, 70, 80, 90, 100}, 3)
}
func testCleaning(t *testing.T, costs []float32, expectedLeftOver int) {
t.Helper()
nb := &nearbyPins{
minPins: 3,
maxPins: 5,
cutOffLimit: 10,
}
// Simulate usage.
for _, cost := range costs {
// Add to list.
nb.add(nil, cost)
// Clean once in a while.
if len(nb.pins) > nb.maxPins {
nb.clean()
}
}
// Final clean.
nb.clean()
// Check results.
t.Logf("result: %+v", nb.pins)
if len(nb.pins) != expectedLeftOver {
t.Errorf("unexpected amount of left over pins: %+v", nb.pins)
}
}