package hub import ( "fmt" "net" "os" "testing" "github.com/stretchr/testify/assert" "github.com/safing/portmaster/base/database/dbmodule" "github.com/safing/portmaster/service/core/base" ) type testInstance struct { db *dbmodule.DBModule base *base.Base } func (stub *testInstance) SetCmdLineOperation(f func() error) {} func (stub *testInstance) DataDir() string { return _dataDir } var _dataDir string func runTest(m *testing.M) error { var err error // Create a temporary directory for testing _dataDir, err = os.MkdirTemp("", "") if err != nil { return fmt.Errorf("failed to create temporary data directory: %w", err) } defer func() { _ = os.RemoveAll(_dataDir) }() // Initialize the instance with the necessary components stub := &testInstance{} // Init stub.db, err = dbmodule.New(stub) if err != nil { return fmt.Errorf("failed to create database: %w", err) } stub.base, err = base.New(stub) if err != nil { return fmt.Errorf("failed to base updates: %w", err) } // Start err = stub.db.Start() if err != nil { return fmt.Errorf("failed to start database: %w", err) } err = stub.base.Start() if err != nil { return fmt.Errorf("failed to start base: %w", err) } m.Run() return nil } func TestMain(m *testing.M) { if err := runTest(m); err != nil { fmt.Printf("%s", err) os.Exit(1) } } func TestEquality(t *testing.T) { t.Parallel() // empty match a := &Announcement{} assert.True(t, a.Equal(a), "should match itself") //nolint:gocritic // This is a test. // full match a = &Announcement{ ID: "a", Timestamp: 1, Name: "a", ContactAddress: "a", ContactService: "a", Hosters: []string{"a", "b"}, Datacenter: "a", IPv4: net.IPv4(1, 2, 3, 4), IPv6: net.ParseIP("::1"), Transports: []string{"a", "b"}, Entry: []string{"a", "b"}, Exit: []string{"a", "b"}, } assert.True(t, a.Equal(a), "should match itself") //nolint:gocritic // This is a test. // no match b := &Announcement{ID: "b"} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Timestamp: 2} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Name: "b"} assert.False(t, a.Equal(b), "should not match") b = &Announcement{ContactAddress: "b"} assert.False(t, a.Equal(b), "should not match") b = &Announcement{ContactService: "b"} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Hosters: []string{"b", "c"}} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Datacenter: "b"} assert.False(t, a.Equal(b), "should not match") b = &Announcement{IPv4: net.IPv4(1, 2, 3, 5)} assert.False(t, a.Equal(b), "should not match") b = &Announcement{IPv6: net.ParseIP("::2")} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Transports: []string{"b", "c"}} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Entry: []string{"b", "c"}} assert.False(t, a.Equal(b), "should not match") b = &Announcement{Exit: []string{"b", "c"}} assert.False(t, a.Equal(b), "should not match") } func TestStringify(t *testing.T) { t.Parallel() assert.Equal(t, "", (&Hub{ID: "abcdefg", Info: &Announcement{}}).String()) assert.Equal(t, "", (&Hub{ID: "abcdefgh", Info: &Announcement{}}).String()) assert.Equal(t, "", (&Hub{ID: "abcdefghi", Info: &Announcement{}}).String()) assert.Equal(t, "", (&Hub{ID: "abcdefghi", Info: &Announcement{Name: "Franz"}}).String()) assert.Equal(t, "", (&Hub{ID: "abcdefghi", Info: &Announcement{Name: "AProbablyAutoGeneratedName"}}).String()) }