Skip to content

Commit c75411d

Browse files
authored
Merge branch 'v3' into dependabot/go_modules/github.com/go-chi/chi/v5-5.0.14
2 parents 8442acd + b2f6653 commit c75411d

File tree

72 files changed

+3295
-3203
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+3295
-3203
lines changed

codegen/example/example_client_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package example
22

33
import (
44
"bytes"
5+
"path/filepath"
56
"testing"
67

7-
"github.com/stretchr/testify/assert"
88
"github.com/stretchr/testify/require"
99

1010
"goa.design/goa/v3/codegen"
@@ -16,13 +16,12 @@ func TestExampleCLIFiles(t *testing.T) {
1616
cases := []struct {
1717
Name string
1818
DSL func()
19-
Code string
2019
}{
21-
{"no-server", testdata.NoServerDSL, testdata.NoServerCLIMainCode},
22-
{"single-server-single-host", testdata.SingleServerSingleHostDSL, testdata.SingleServerSingleHostCLIMainCode},
23-
{"single-server-single-host-with-variables", testdata.SingleServerSingleHostWithVariablesDSL, testdata.SingleServerSingleHostWithVariablesCLIMainCode},
24-
{"single-server-multiple-hosts", testdata.SingleServerMultipleHostsDSL, testdata.SingleServerMultipleHostsCLIMainCode},
25-
{"single-server-multiple-hosts-with-variables", testdata.SingleServerMultipleHostsWithVariablesDSL, testdata.SingleServerMultipleHostsWithVariablesCLIMainCode},
20+
{"no-server", testdata.NoServerDSL},
21+
{"single-server-single-host", testdata.SingleServerSingleHostDSL},
22+
{"single-server-single-host-with-variables", testdata.SingleServerSingleHostWithVariablesDSL},
23+
{"single-server-multiple-hosts", testdata.SingleServerMultipleHostsDSL},
24+
{"single-server-multiple-hosts-with-variables", testdata.SingleServerMultipleHostsWithVariablesDSL},
2625
}
2726
for _, c := range cases {
2827
t.Run(c.Name, func(t *testing.T) {
@@ -37,7 +36,8 @@ func TestExampleCLIFiles(t *testing.T) {
3736
require.NoError(t, s.Write(&buf))
3837
}
3938
code := codegen.FormatTestCode(t, "package foo\n"+buf.String())
40-
assert.Equal(t, c.Code, code)
39+
golden := filepath.Join("testdata", "client-"+c.Name+".golden")
40+
compareOrUpdateGolden(t, code, golden)
4141
})
4242
}
4343
}

codegen/example/example_server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ func exampleSvrMain(genpkg string, root *expr.RootExpr, svr *expr.ServerExpr) *c
3535
{Path: "context"},
3636
{Path: "flag"},
3737
{Path: "fmt"},
38-
{Path: "log"},
3938
{Path: "net"},
4039
{Path: "net/url"},
4140
{Path: "os"},
@@ -44,7 +43,8 @@ func exampleSvrMain(genpkg string, root *expr.RootExpr, svr *expr.ServerExpr) *c
4443
{Path: "sync"},
4544
{Path: "syscall"},
4645
{Path: "time"},
47-
codegen.GoaImport("middleware"),
46+
{Path: "goa.design/clue/debug"},
47+
{Path: "goa.design/clue/log"},
4848
}
4949

5050
// Iterate through services listed in the server expression.

codegen/example/example_server_test.go

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package example
22

33
import (
44
"bytes"
5+
"flag"
6+
"os"
7+
"path/filepath"
8+
"runtime"
59
"testing"
610

711
"github.com/stretchr/testify/assert"
@@ -13,29 +17,49 @@ import (
1317
"goa.design/goa/v3/expr"
1418
)
1519

20+
// updateGolden is true when -w is passed to `go test`, e.g. `go test ./... -w`
21+
var updateGolden = false
22+
23+
func init() {
24+
flag.BoolVar(&updateGolden, "w", false, "update golden files")
25+
}
26+
27+
func compareOrUpdateGolden(t *testing.T, code, golden string) {
28+
t.Helper()
29+
if updateGolden {
30+
require.NoError(t, os.MkdirAll(filepath.Dir(golden), 0750))
31+
require.NoError(t, os.WriteFile(golden, []byte(code), 0640))
32+
return
33+
}
34+
data, err := os.ReadFile(golden)
35+
require.NoError(t, err)
36+
if runtime.GOOS == "windows" {
37+
data = bytes.ReplaceAll(data, []byte("\r\n"), []byte("\n"))
38+
}
39+
assert.Equal(t, string(data), code)
40+
}
41+
1642
func TestExampleServerFiles(t *testing.T) {
1743
cases := []struct {
1844
Name string
1945
DSL func()
20-
Code string
2146
}{
22-
{"no-server", testdata.NoServerDSL, testdata.NoServerServerMainCode},
23-
{"same-api-service-name", testdata.SameAPIServiceNameDSL, testdata.SameAPIServiceNameServerMainCode},
24-
{"single-server-single-host", testdata.SingleServerSingleHostDSL, testdata.SingleServerSingleHostServerMainCode},
25-
{"single-server-single-host-with-variables", testdata.SingleServerSingleHostWithVariablesDSL, testdata.SingleServerSingleHostWithVariablesServerMainCode},
26-
{"server-hosting-service-with-file-server", testdata.ServerHostingServiceWithFileServerDSL, testdata.ServerHostingServiceWithFileServerServerMainCode},
27-
{"server-hosting-service-subset", testdata.ServerHostingServiceSubsetDSL, testdata.ServerHostingServiceSubsetServerMainCode},
28-
{"server-hosting-multiple-services", testdata.ServerHostingMultipleServicesDSL, testdata.ServerHostingMultipleServicesServerMainCode},
29-
{"single-server-multiple-hosts", testdata.SingleServerMultipleHostsDSL, testdata.SingleServerMultipleHostsServerMainCode},
30-
{"single-server-multiple-hosts-with-variables", testdata.SingleServerMultipleHostsWithVariablesDSL, testdata.SingleServerMultipleHostsWithVariablesServerMainCode},
31-
{"service-name-with-spaces", testdata.NamesWithSpacesDSL, testdata.NamesWithSpacesServerMainCode},
32-
{"service-for-only-http", testdata.ServiceForOnlyHTTPDSL, testdata.ServiceForOnlyHTTPServerMainCode},
33-
{"sercice-for-only-grpc", testdata.ServiceForOnlyGRPCDSL, testdata.ServiceForOnlyGRPCServerMainCode},
34-
{"service-for-http-and-part-of-grpc", testdata.ServiceForHTTPAndPartOfGRPCDSL, testdata.ServiceForHTTPAndPartOfGRPCServerMainCode},
47+
{"no-server", testdata.NoServerDSL},
48+
{"same-api-service-name", testdata.SameAPIServiceNameDSL},
49+
{"single-server-single-host", testdata.SingleServerSingleHostDSL},
50+
{"single-server-single-host-with-variables", testdata.SingleServerSingleHostWithVariablesDSL},
51+
{"server-hosting-service-with-file-server", testdata.ServerHostingServiceWithFileServerDSL},
52+
{"server-hosting-service-subset", testdata.ServerHostingServiceSubsetDSL},
53+
{"server-hosting-multiple-services", testdata.ServerHostingMultipleServicesDSL},
54+
{"single-server-multiple-hosts", testdata.SingleServerMultipleHostsDSL},
55+
{"single-server-multiple-hosts-with-variables", testdata.SingleServerMultipleHostsWithVariablesDSL},
56+
{"service-name-with-spaces", testdata.NamesWithSpacesDSL},
57+
{"service-for-only-http", testdata.ServiceForOnlyHTTPDSL},
58+
{"sercice-for-only-grpc", testdata.ServiceForOnlyGRPCDSL},
59+
{"service-for-http-and-part-of-grpc", testdata.ServiceForHTTPAndPartOfGRPCDSL},
3560
}
3661
for _, c := range cases {
3762
t.Run(c.Name, func(t *testing.T) {
38-
// reset global variable
3963
service.Services = make(service.ServicesData)
4064
Servers = make(ServersData)
4165
codegen.RunDSL(t, c.DSL)
@@ -47,7 +71,8 @@ func TestExampleServerFiles(t *testing.T) {
4771
require.NoError(t, s.Write(&buf))
4872
}
4973
code := codegen.FormatTestCode(t, "package foo\n"+buf.String())
50-
assert.Equal(t, c.Code, code)
74+
golden := filepath.Join("testdata", "server-"+c.Name+".golden")
75+
compareOrUpdateGolden(t, code, golden)
5176
})
5277
}
5378
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11

22

33
{{ comment "Wait for signal." }}
4-
logger.Printf("exiting (%v)", <-errc)
4+
log.Printf(ctx, "exiting (%v)", <-errc)
55

66
{{ comment "Send cancellation signal to the goroutines." }}
77
cancel()
88

99
wg.Wait()
10-
logger.Println("exited")
10+
log.Printf(ctx, "exited")
1111
}

codegen/example/templates/server_endpoints.go.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
{{- range .Services }}
1313
{{- if .Methods }}
1414
{{ .VarName }}Endpoints = {{ .PkgName }}.NewEndpoints({{ .VarName }}Svc)
15+
{{ .VarName }}Endpoints.Use(debug.LogPayloads())
16+
{{ .VarName }}Endpoints.Use(log.Endpoint)
1517
{{- end }}
1618
{{- end }}
1719
}

codegen/example/templates/server_handler.go.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@
2020
}
2121
}
2222
if !{{ .VarName }}Seen {
23-
logger.Fatalf("invalid value for URL '{{ .Name }}' variable: %q (valid values: {{ join .Values "," }})\n", *{{ .VarName }}F)
23+
log.Fatalf(ctx, "invalid value for URL '{{ .Name }}' variable: %q (valid values: {{ join .Values "," }})\n", *{{ .VarName }}F)
2424
}
2525
{{- end }}
2626
addr = strings.Replace(addr, "{{ printf "{%s}" .Name }}", *{{ .VarName }}F, -1)
2727
{{- end }}
2828
u, err := url.Parse(addr)
2929
if err != nil {
30-
logger.Fatalf("invalid URL %#v: %s\n", addr, err)
30+
log.Fatalf(ctx, "invalid URL %#v: %s\n", addr, err)
3131
}
3232
if *secureF {
3333
u.Scheme = "{{ $u.Transport.Type }}s"
@@ -38,17 +38,17 @@
3838
if *{{ $u.Transport.Type }}PortF != "" {
3939
h, _, err := net.SplitHostPort(u.Host)
4040
if err != nil {
41-
logger.Fatalf("invalid URL %#v: %s\n", u.Host, err)
41+
log.Fatalf(ctx, "invalid URL %#v: %s\n", u.Host, err)
4242
}
4343
u.Host = net.JoinHostPort(h, *{{ $u.Transport.Type }}PortF)
4444
} else if u.Port() == "" {
4545
u.Host = net.JoinHostPort(u.Host, "{{ $u.Port }}")
4646
}
47-
handle{{ toUpper $u.Transport.Name }}Server(ctx, u, {{ range $t := $.Server.Transports }}{{ if eq $t.Type $u.Transport.Type }}{{ range $s := $t.Services }}{{ range $.Services }}{{ if eq $s .Name }}{{ if .Methods }}{{ .VarName }}Endpoints, {{ end }}{{ end }}{{ end }}{{ end }}{{ end }}{{ end }}&wg, errc, logger, *dbgF)
47+
handle{{ toUpper $u.Transport.Name }}Server(ctx, u, {{ range $t := $.Server.Transports }}{{ if eq $t.Type $u.Transport.Type }}{{ range $s := $t.Services }}{{ range $.Services }}{{ if eq $s .Name }}{{ if .Methods }}{{ .VarName }}Endpoints, {{ end }}{{ end }}{{ end }}{{ end }}{{ end }}{{ end }}&wg, errc, *dbgF)
4848
}
4949
{{- end }}
5050
{{ end }}
5151
{{- end }}
5252
default:
53-
logger.Fatalf("invalid host argument: %q (valid hosts: {{ join .Server.AvailableHosts "|" }})\n", *hostF)
53+
log.Fatalf(ctx, "invalid host argument: %q (valid hosts: {{ join .Server.AvailableHosts "|" }})\n", *hostF)
5454
}

codegen/example/templates/server_interrupts.go.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
}()
1414

1515
var wg sync.WaitGroup
16-
ctx, cancel := context.WithCancel(context.Background())
16+
ctx, cancel := context.WithCancel(ctx)
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11

22

33
{{ comment "Setup logger. Replace logger with your own log package of choice." }}
4-
var (
5-
logger *log.Logger
6-
)
7-
{
8-
logger = log.New(os.Stderr, "[{{ .APIPkg }}] ", log.Ltime)
9-
}
4+
format := log.FormatJSON
5+
if log.IsTerminal() {
6+
format = log.FormatTerminal
7+
}
8+
ctx := log.Context(context.Background(), log.WithFormat(format))
9+
if *dbgF {
10+
ctx = log.Context(ctx, log.WithDebug())
11+
log.Debugf(ctx, "debug logs enabled")
12+
}
13+
log.Print(ctx, log.KV{K: "http-port", V: *httpPortF})

codegen/example/templates/server_services.go.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
{
1212
{{- range .Services }}
1313
{{- if .Methods }}
14-
{{ .VarName }}Svc = {{ $.APIPkg }}.New{{ .StructName }}(logger)
14+
{{ .VarName }}Svc = {{ $.APIPkg }}.New{{ .StructName }}()
1515
{{- end }}
1616
{{- end }}
1717
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
func main() {
2+
var (
3+
hostF = flag.String("host", "localhost", "Server host (valid values: localhost)")
4+
addrF = flag.String("url", "", "URL to service host")
5+
6+
verboseF = flag.Bool("verbose", false, "Print request and response details")
7+
vF = flag.Bool("v", false, "Print request and response details")
8+
timeoutF = flag.Int("timeout", 30, "Maximum number of seconds to wait for response")
9+
)
10+
flag.Usage = usage
11+
flag.Parse()
12+
var (
13+
addr string
14+
timeout int
15+
debug bool
16+
)
17+
{
18+
addr = *addrF
19+
if addr == "" {
20+
switch *hostF {
21+
case "localhost":
22+
addr = "http://localhost:80"
23+
default:
24+
fmt.Fprintf(os.Stderr, "invalid host argument: %q (valid hosts: localhost)\n", *hostF)
25+
os.Exit(1)
26+
}
27+
}
28+
timeout = *timeoutF
29+
debug = *verboseF || *vF
30+
}
31+
32+
var (
33+
scheme string
34+
host string
35+
)
36+
{
37+
u, err := url.Parse(addr)
38+
if err != nil {
39+
fmt.Fprintf(os.Stderr, "invalid URL %#v: %s\n", addr, err)
40+
os.Exit(1)
41+
}
42+
scheme = u.Scheme
43+
host = u.Host
44+
}
45+
var (
46+
endpoint goa.Endpoint
47+
payload any
48+
err error
49+
)
50+
{
51+
switch scheme {
52+
case "http", "https":
53+
endpoint, payload, err = doHTTP(scheme, host, timeout, debug)
54+
case "grpc", "grpcs":
55+
endpoint, payload, err = doGRPC(scheme, host, timeout, debug)
56+
default:
57+
fmt.Fprintf(os.Stderr, "invalid scheme: %q (valid schemes: grpc|http)\n", scheme)
58+
os.Exit(1)
59+
}
60+
}
61+
if err != nil {
62+
if err == flag.ErrHelp {
63+
os.Exit(0)
64+
}
65+
fmt.Fprintln(os.Stderr, err.Error())
66+
fmt.Fprintln(os.Stderr, "run '"+os.Args[0]+" --help' for detailed usage.")
67+
os.Exit(1)
68+
}
69+
70+
data, err := endpoint(context.Background(), payload)
71+
if err != nil {
72+
fmt.Fprintln(os.Stderr, err.Error())
73+
os.Exit(1)
74+
}
75+
76+
if data != nil {
77+
m, _ := json.MarshalIndent(data, "", " ")
78+
fmt.Println(string(m))
79+
}
80+
}
81+
82+
func usage() {
83+
fmt.Fprintf(os.Stderr, `%s is a command line client for the test api API.
84+
85+
Usage:
86+
%s [-host HOST][-url URL][-timeout SECONDS][-verbose|-v] SERVICE ENDPOINT [flags]
87+
88+
-host HOST: server host (localhost). valid values: localhost
89+
-url URL: specify service URL overriding host URL (http://localhost:8080)
90+
-timeout: maximum number of seconds to wait for response (30)
91+
-verbose|-v: print request and response details (false)
92+
93+
Commands:
94+
%s
95+
Additional help:
96+
%s SERVICE [ENDPOINT] --help
97+
98+
Example:
99+
%s
100+
`, os.Args[0], os.Args[0], indent(httpUsageCommands()), os.Args[0], indent(httpUsageExamples()))
101+
}
102+
103+
func indent(s string) string {
104+
if s == "" {
105+
return ""
106+
}
107+
return " " + strings.Replace(s, "\n", "\n ", -1)
108+
}

0 commit comments

Comments
 (0)