161 lines
3.4 KiB
Go
161 lines
3.4 KiB
Go
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)
|
|
}
|
|
}
|
|
|