diff options
| author | James O'Doherty <james@theodohertyfamily.com> | 2026-05-22 10:51:00 -0400 |
|---|---|---|
| committer | James O'Doherty <james@theodohertyfamily.com> | 2026-05-22 10:51:00 -0400 |
| commit | cefff85a054d64f124aa1f3e91b9425695aa210b (patch) | |
| tree | 4ad2df3ba37a52ee246da327c310aabaecb2b896 | |
| parent | 9131b0004e7c640cc028179e1d049a4c62210d94 (diff) | |
Update Makefile and README to standardize build/test process and lauch fuzzer
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | README.md | 15 | ||||
| -rw-r--r-- | tests/e2e/arg_integrity_test.go | 5 | ||||
| -rw-r--r-- | tests/e2e/fuzz_args_test.go | 7 | ||||
| -rw-r--r-- | tests/e2e/test_helpers.go | 42 |
5 files changed, 37 insertions, 43 deletions
@@ -28,13 +28,10 @@ $(LAUNCHER_BIN): $(LAUNCHER_SRC) # Run tests test: all - go test -v ./... - -# Clean up all artifacts -clean: - rm -f $(BINARY) $(LAUNCHER_BIN) - find . -name "*.test" -delete + @echo "Running tests with WG_WRAP_BIN=$(shell pwd)/$(BINARY)" + WG_WRAP_BIN=$(shell pwd)/$(BINARY) go test -v ./... # Run fuzzing tests fuzz: all - go test -v -fuzz=FuzzArgumentIntegrity -parallel $(FUZZ_PARALLEL) -fuzztime=$(FUZZ_TIME) ./tests/e2e/fuzz_args_test.go + @echo "Running fuzzing with WG_WRAP_BIN=$(shell pwd)/$(BINARY)" + WG_WRAP_BIN=$(shell pwd)/$(BINARY) go test -v -fuzz=FuzzArgumentIntegrity -parallel $(FUZZ_PARALLEL) -fuzztime=$(FUZZ_TIME) ./tests/e2e/fuzz_args_test.go @@ -16,6 +16,21 @@ make ``` This will compile the C launcher and embed it into the final `wg-wrap` binary. +**Testing the Project:** +The project uses a `Makefile` to orchestrate building and testing. +- **Standard Tests**: Run the unit and integration tests: + ```bash + make test + ``` +- **Security Fuzzing**: Run the 8-bit clean argument integrity fuzzer: + ```bash + make fuzz + ``` + You can adjust the fuzzer's parallelism and duration: + ```bash + FUZZ_PARALLEL=4 FUZZ_TIME=1h make fuzz + ``` + ## Profile Management To simplify usage, `wg-wrap` implements a profile system for managing WireGuard configurations. - **Storage**: Profiles are stored as standard `.conf` files in `~/.config/wg-wrap/profiles/`. diff --git a/tests/e2e/arg_integrity_test.go b/tests/e2e/arg_integrity_test.go index 7121c2b..497a51d 100644 --- a/tests/e2e/arg_integrity_test.go +++ b/tests/e2e/arg_integrity_test.go @@ -20,7 +20,10 @@ func TestArgumentIntegrity(t *testing.T) { for _, payload := range payloads { t.Run(fmt.Sprintf("Payload_%s", payload), func(t *testing.T) { - binaryPath := GetBinaryPath() + binaryPath, err := GetBinaryPath() + if err != nil { + t.Skip("Skipping E2E test: wg-wrap binary not found (WG_WRAP_BIN not set)") + } cmd := exec.Command(binaryPath, "test-args", payload) out, err := cmd.CombinedOutput() if err != nil { diff --git a/tests/e2e/fuzz_args_test.go b/tests/e2e/fuzz_args_test.go index 0d4a45b..0d71e0e 100644 --- a/tests/e2e/fuzz_args_test.go +++ b/tests/e2e/fuzz_args_test.go @@ -8,8 +8,6 @@ import ( ) func FuzzArgumentIntegrity(f *testing.F) { - binaryPath := GetBinaryPath() - f.Add("; rm -rf /") f.Add("$(whoami)") f.Add(" spaced ") @@ -17,6 +15,11 @@ func FuzzArgumentIntegrity(f *testing.F) { f.Add("\x00null\x00") f.Fuzz(func(t *testing.T, payload string) { + binaryPath, err := GetBinaryPath() + if err != nil { + t.Skip("Skipping E2E fuzz test: wg-wrap binary not found (WG_WRAP_BIN not set)") + } + out, err := exec.Command(binaryPath, "test-args", payload).CombinedOutput() if strings.Contains(payload, "\x00") { diff --git a/tests/e2e/test_helpers.go b/tests/e2e/test_helpers.go index 34aae3f..0ae83aa 100644 --- a/tests/e2e/test_helpers.go +++ b/tests/e2e/test_helpers.go @@ -1,45 +1,21 @@ package e2e import ( + "fmt" "os" - "os/exec" - "path/filepath" - "runtime" ) // GetBinaryPath resolves the path to the wg-wrap binary. -// It checks the current directory, then the project root, then the system PATH. -func GetBinaryPath() string { - binaryName := "wg-wrap" - if runtime.GOOS == "windows" { - binaryName += ".exe" +// It prioritizes the WG_WRAP_BIN environment variable. +func GetBinaryPath() (string, error) { + path := os.Getenv("WG_WRAP_BIN") + if path == "" { + return "", fmt.Errorf("WG_WRAP_BIN environment variable not set") } - // 1. Check current working directory - if _, err := os.Stat(binaryName); err == nil { - abs, _ := filepath.Abs(binaryName) - return abs + if _, err := os.Stat(path); err != nil { + return "", fmt.Errorf("binary not found at path %s: %w", path, err) } - // 2. Check common project root relative paths - // Since go test can be run from root or package dir, we try both. - candidates := []string{ - filepath.Join("..", "..", binaryName), // from tests/e2e - filepath.Join("..", binaryName), // from tests/ - binaryName, // from root - } - for _, c := range candidates { - if _, err := os.Stat(c); err == nil { - abs, _ := filepath.Abs(c) - return abs - } - } - - // 3. Check system PATH - path, err := exec.LookPath(binaryName) - if err == nil { - return path - } - - return binaryName + return path, nil } |
