You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.4 KiB
160 lines
3.4 KiB
package main |
|
|
|
import ( |
|
"flag" |
|
"fmt" |
|
"os" |
|
"strings" |
|
|
|
"lol.mleku.dev/log" |
|
relaytester "next.orly.dev/relay-tester" |
|
) |
|
|
|
func main() { |
|
var ( |
|
relayURL = flag.String("url", "", "relay websocket URL (required, e.g., ws://127.0.0.1:3334)") |
|
testName = flag.String("test", "", "run specific test by name (default: run all tests)") |
|
jsonOut = flag.Bool("json", false, "output results in JSON format") |
|
verbose = flag.Bool("v", false, "verbose output") |
|
listTests = flag.Bool("list", false, "list all available tests and exit") |
|
) |
|
flag.Parse() |
|
|
|
if *listTests { |
|
listAllTests() |
|
return |
|
} |
|
|
|
if *relayURL == "" { |
|
log.E.F("required flag: -url (relay websocket URL)") |
|
flag.Usage() |
|
os.Exit(1) |
|
} |
|
|
|
// Validate URL format |
|
if !strings.HasPrefix(*relayURL, "ws://") && !strings.HasPrefix(*relayURL, "wss://") { |
|
log.E.F("URL must start with ws:// or wss://") |
|
os.Exit(1) |
|
} |
|
|
|
// Create test suite |
|
if *verbose { |
|
log.I.F("Creating test suite for %s...", *relayURL) |
|
} |
|
suite, err := relaytester.NewTestSuite(*relayURL) |
|
if err != nil { |
|
log.E.F("failed to create test suite: %v", err) |
|
os.Exit(1) |
|
} |
|
|
|
// Run tests |
|
var results []relaytester.TestResult |
|
if *testName != "" { |
|
if *verbose { |
|
log.I.F("Running test: %s", *testName) |
|
} |
|
result, err := suite.RunTest(*testName) |
|
if err != nil { |
|
log.E.F("failed to run test %s: %v", *testName, err) |
|
os.Exit(1) |
|
} |
|
results = []relaytester.TestResult{result} |
|
} else { |
|
if *verbose { |
|
log.I.F("Running all tests...") |
|
} |
|
if results, err = suite.Run(); err != nil { |
|
log.E.F("failed to run tests: %v", err) |
|
os.Exit(1) |
|
} |
|
} |
|
|
|
// Output results |
|
if *jsonOut { |
|
jsonOutput, err := relaytester.FormatJSON(results) |
|
if err != nil { |
|
log.E.F("failed to format JSON: %v", err) |
|
os.Exit(1) |
|
} |
|
fmt.Println(jsonOutput) |
|
} else { |
|
outputResults(results, *verbose) |
|
} |
|
|
|
// Check exit code |
|
hasRequiredFailures := false |
|
for _, result := range results { |
|
if result.Required && !result.Pass { |
|
hasRequiredFailures = true |
|
break |
|
} |
|
} |
|
|
|
if hasRequiredFailures { |
|
os.Exit(1) |
|
} |
|
} |
|
|
|
func outputResults(results []relaytester.TestResult, verbose bool) { |
|
passed := 0 |
|
failed := 0 |
|
requiredFailed := 0 |
|
|
|
for _, result := range results { |
|
if result.Pass { |
|
passed++ |
|
if verbose { |
|
fmt.Printf("PASS: %s", result.Name) |
|
if result.Info != "" { |
|
fmt.Printf(" - %s", result.Info) |
|
} |
|
fmt.Println() |
|
} else { |
|
fmt.Printf("PASS: %s\n", result.Name) |
|
} |
|
} else { |
|
failed++ |
|
if result.Required { |
|
requiredFailed++ |
|
fmt.Printf("FAIL (required): %s", result.Name) |
|
} else { |
|
fmt.Printf("FAIL (optional): %s", result.Name) |
|
} |
|
if result.Info != "" { |
|
fmt.Printf(" - %s", result.Info) |
|
} |
|
fmt.Println() |
|
} |
|
} |
|
|
|
fmt.Println() |
|
fmt.Println("Test Summary:") |
|
fmt.Printf(" Total: %d\n", len(results)) |
|
fmt.Printf(" Passed: %d\n", passed) |
|
fmt.Printf(" Failed: %d\n", failed) |
|
fmt.Printf(" Required Failed: %d\n", requiredFailed) |
|
} |
|
|
|
func listAllTests() { |
|
// Create a dummy test suite to get the list of tests |
|
suite, err := relaytester.NewTestSuite("ws://127.0.0.1:0") |
|
if err != nil { |
|
log.E.F("failed to create test suite: %v", err) |
|
os.Exit(1) |
|
} |
|
|
|
fmt.Println("Available tests:") |
|
fmt.Println() |
|
|
|
testNames := suite.ListTests() |
|
testInfo := suite.GetTestNames() |
|
|
|
for _, name := range testNames { |
|
required := "" |
|
if testInfo[name] { |
|
required = " (required)" |
|
} |
|
fmt.Printf(" - %s%s\n", name, required) |
|
} |
|
} |
|
|
|
|