Skip to content

Commit

Permalink
add "many" subcommand to test multiple targets and produce a single H…
Browse files Browse the repository at this point in the history
…TML report

previous functionality is available under the "one" subcommand
  • Loading branch information
finn-tbd committed Nov 7, 2023
1 parent a00bb06 commit 44debea
Show file tree
Hide file tree
Showing 11 changed files with 330 additions and 132 deletions.
17 changes: 17 additions & 0 deletions .github/workflows/pages.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
on:
push:
branches: [main]
jobs:
pages:
permissions:
pages: write
id-token: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
- name: run for all SDKs
run: go run ./cmd/web5-spec-test many sdks/*
- uses: actions/upload-pages-artifact@v2
- name: deploy GitHub Pages
uses: actions/deploy-pages@v2
2 changes: 1 addition & 1 deletion .github/workflows/self-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
- name: self test
run: go run ./cmd/web5-spec-test sdks/$SDK
run: go run ./cmd/web5-spec-test one sdks/$SDK
env:
SDK: ${{ matrix.SDK }}
129 changes: 6 additions & 123 deletions cmd/web5-spec-test/main.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
package main

import (
"context"
"flag"
"fmt"
"os"
"os/exec"
"path/filepath"
"time"

"github.com/TBD54566975/web5-spec/openapi"
"github.com/TBD54566975/web5-spec/tests"
"github.com/spf13/cobra"
"golang.org/x/exp/slog"
)

var (
nostart = flag.Bool("no-start", false, "when set, the server is not built and is expected to be already running")
nostop = flag.Bool("no-stop", false, "when set, the server is not asked to shut down")
server = flag.String("server", "http://localhost:8080", "url of the server to connect to")

dir string
root = cobra.Command{
Use: "web5-spec",
}

dockerfiles = []string{
".web5-component/test.Dockerfile",
Expand All @@ -29,119 +21,10 @@ var (
)

func main() {
os.Exit(runTests()) // without this weird wrapper thing, the defers wont get called
}

func runTests() int {
flag.Parse()

dir, _ = os.Getwd()
if len(flag.Args()) > 0 {
dir = flag.Arg(0)
}

logger := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})
slog.SetDefault(slog.New(logger))

if !*nostart {
var dockerfile string
for _, d := range dockerfiles {
candidate := filepath.Join(dir, d)
if _, err := os.Stat(candidate); !os.IsNotExist(err) {
dockerfile = d
}
}

if dockerfile == "" {
slog.Error("no dockerfile found", "paths", dockerfiles)
return 1
}

cmd := docker("build", "-t", "web5-spec:latest", "-f", dockerfile, ".")
if err := cmd.Run(); err != nil {
slog.Error("error building server", "error", err)
return 1
}

cmd = docker("run", "-p", "8080:8080", "--name", "web5-spec", "--rm", "web5-spec:latest")
if err := cmd.Start(); err != nil {
slog.Error("error running server", "error", err)
return 1
}

if !*nostop {
defer func() {
cmd := docker("stop", "web5-spec")
if err := cmd.Run(); err != nil {
slog.Error("error stopping server container", "error", err)
}
}()
}
}

ctx := context.Background()

client, err := openapi.NewClientWithResponses(*server)
if err != nil {
panic(err)
}

var serverID openapi.TestServerID
for {
serverIDResponse, err := client.IdentifySelfWithResponse(ctx)
if err != nil {
slog.Debug("server ID check failed, retrying in 1 second", "err", err)
time.Sleep(time.Second)
continue
}

if serverIDResponse.JSON200 == nil {
slog.Debug("server ID check failed, retrying in 1 second", "status", serverIDResponse.Status(), "body", string(serverIDResponse.Body))
time.Sleep(time.Second)
continue
}

serverID = *serverIDResponse.JSON200
break
}

defer func() {
_, err := client.ServerShutdown(context.Background())
if err != nil {
slog.Error("error shutting down server", "error", err)
}
}()

slog.Debug("server running", "sdk", serverID.Name, "url", serverID.Url)

report := Report{
TestServerID: serverID,
Results: tests.RunTests(*server),
}

fmt.Println()
if txt, err := report.Text(); err != nil {
slog.Error("error generating text report", "error", err)
} else {
fmt.Println(txt)
}
fmt.Println()

stepSummaryFile := os.Getenv("GITHUB_STEP_SUMMARY")
if stepSummaryFile != "" {
if err := report.WriteMarkdown(stepSummaryFile); err != nil {
slog.Error("error writing github step summary", "file", stepSummaryFile, "error", err)
}
}

if !report.IsPassing() {
return 1
}

return 0
root.Execute()
}

func docker(args ...string) *exec.Cmd {
func docker(dir string, args ...string) *exec.Cmd {
cmd := exec.Command("docker", args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
Expand Down
53 changes: 53 additions & 0 deletions cmd/web5-spec-test/test-many.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package main

import (
"fmt"
"os"

"github.com/TBD54566975/web5-spec/reports"
"github.com/spf13/cobra"
"golang.org/x/exp/slog"
)

var (
testManyCmd = &cobra.Command{
Use: "many dir [dir...]",
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
allReports := []reports.Report{}
for _, dir := range args {
report, err := testOne(dir)
if err != nil {
slog.Error("error testing server", "dir", dir, "err", err)
continue
}

allReports = append(allReports, report)
}

for _, report := range allReports {
fmt.Println()
if txt, err := report.Text(); err != nil {
slog.Error("error generating text report", "error", err)
continue
} else {
fmt.Println(txt)
}
fmt.Println()
}

if err := os.MkdirAll("_site", 0755); err != nil && err != os.ErrExist {
slog.Error("error creating _site/ for HTML report")
panic(err)
}
if err := reports.WriteHTML(allReports, "_site/index.html"); err != nil {
slog.Error("error rendering HTML template", "err", err)
os.Exit(1)
}
},
}
)

func init() {
root.AddCommand(testManyCmd)
}
131 changes: 131 additions & 0 deletions cmd/web5-spec-test/test-one.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package main

import (
"context"
"fmt"
"os"
"path/filepath"
"time"

"github.com/TBD54566975/web5-spec/openapi"
"github.com/TBD54566975/web5-spec/reports"
"github.com/TBD54566975/web5-spec/tests"
"github.com/spf13/cobra"
"golang.org/x/exp/slog"
)

var (
testOneCmd = &cobra.Command{
Use: "one [dir]",
Run: func(cmd *cobra.Command, args []string) {
dir, _ := os.Getwd()
if len(args) > 0 {
dir = args[0]
}

report, err := testOne(dir)
if err != nil {
panic(err)
}

fmt.Println()
if txt, err := report.Text(); err != nil {
slog.Error("error generating text report", "error", err)
} else {
fmt.Println(txt)
}
fmt.Println()

stepSummaryFile := os.Getenv("GITHUB_STEP_SUMMARY")
if stepSummaryFile != "" {
if err := reports.WriteMarkdown(report, stepSummaryFile); err != nil {
slog.Error("error writing github step summary", "file", stepSummaryFile, "error", err)
}
}

if !report.IsPassing() {
os.Exit(1)
}

os.Exit(0)
},
}
)

func testOne(dir string) (reports.Report, error) {
logger := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})
slog.SetDefault(slog.New(logger))

var dockerfile string
for _, d := range dockerfiles {
candidate := filepath.Join(dir, d)
if _, err := os.Stat(candidate); !os.IsNotExist(err) {
dockerfile = d
}
}

if dockerfile == "" {
return reports.Report{}, fmt.Errorf("no dockerfile found (paths=%v)", dockerfiles)
}

cmd := docker(dir, "build", "-t", "web5-spec:latest", "-f", dockerfile, ".")
if err := cmd.Run(); err != nil {
return reports.Report{}, fmt.Errorf("error building server: %v", err)
}

cmd = docker(dir, "run", "-p", "8080:8080", "--name", "web5-spec", "--rm", "web5-spec:latest")
if err := cmd.Start(); err != nil {
return reports.Report{}, fmt.Errorf("error running server: %v", err)
}

defer func() {
cmd := docker(dir, "stop", "web5-spec")
if err := cmd.Run(); err != nil {
slog.Error("error stopping server container", "error", err)
}
}()

ctx := context.Background()

client, err := openapi.NewClientWithResponses("http://localhost:8080")
if err != nil {
panic(err)
}

var serverID openapi.TestServerID
for {
serverIDResponse, err := client.IdentifySelfWithResponse(ctx)
if err != nil {
slog.Debug("waiting for server to come up", "err", err)
time.Sleep(time.Second)
continue
}

if serverIDResponse.JSON200 == nil {
slog.Debug("server ID check failed, retrying in 1 second", "status", serverIDResponse.Status(), "body", string(serverIDResponse.Body))
time.Sleep(time.Second)
continue
}

serverID = *serverIDResponse.JSON200
break
}

defer func() {
_, err := client.ServerShutdown(context.Background())
if err != nil {
slog.Error("error shutting down server", "error", err)
}
}()

slog.Debug("server running", "sdk", serverID.Name, "url", serverID.Url)

return reports.Report{
TestServerID: serverID,
Results: tests.RunTests("http://localhost:8080"),
}, nil
}

func init() {
root.AddCommand(testOneCmd)
}
6 changes: 5 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ go 1.20

require (
github.com/mr-tron/base58 v1.2.0
github.com/spf13/cobra v1.7.0
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
gopkg.in/square/go-jose.v2 v2.6.0
)

require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.8.4 // indirect
golang.org/x/crypto v0.14.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
)
Loading

0 comments on commit 44debea

Please sign in to comment.