From 29621ecbd1e77e6e1a70b6b3ea8fbe3a56e47df3 Mon Sep 17 00:00:00 2001 From: James O'Doherty Date: Sat, 13 Jun 2026 11:51:04 -0400 Subject: refactor: implement dependency injection and enable parallel testing This commit refactors the core system operations to use a manager-based dependency injection pattern, eliminating global state and resolving data races in the test suite. Architecture: - Introduced NetworkManager and NetworkOps interface in internal/network to abstract netlink calls. - Introduced MountOps and FileSystem interfaces in internal/namespace to abstract mount and filesystem operations. - Introduced TunnelManager in internal/wireguard to coordinate tunnel lifecycle using the new abstractions. - Updated internal/cli and internal/manager to use these managers. Testing: - Restored t.Parallel() to unit tests in internal/network and internal/wireguard. - Implemented setupParallelEnv and an enhanced mockFS in wireguard_unit_test.go to ensure complete test isolation. - Added bootstrap_test.go to verify launcher preparation logic in internal/namespace without requiring syscall.Exec. - Resolved data races in internal/network tests. CLI: - Added support for -h, --help, and -help flags for the main command. Verification: - Passed all tests (unit, integration, E2E). - Verified zero data races with 'go test -race'. - Passed golangci-lint and go vet. --- internal/manager/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'internal/manager') diff --git a/internal/manager/manager.go b/internal/manager/manager.go index ffb02c0..270b99e 100644 --- a/internal/manager/manager.go +++ b/internal/manager/manager.go @@ -185,11 +185,11 @@ func (m *Manager) Execute(cfg *config.Config, verbose bool) error { } } - tunnel, err := wireguard.StartTunnel(m.PM, cfg.Profile, wgCfg, dnsServer) + tunnel, err := wireguard.NewTunnelManager().StartTunnel(m.PM, cfg.Profile, wgCfg, dnsServer) if err != nil { return fmt.Errorf("failed to start WireGuard tunnel: %w", err) } - defer tunnel.Close() + defer tunnel.Close(wireguard.NewTunnelManager()) if err := m.NS.PinNamespace(m.PM, cfg.Profile); err != nil { fmt.Fprintf(os.Stderr, "warning: failed to pin namespace: %v\n", err) -- cgit v1.2.3