Skip to content

Commit 806d3b4

Browse files
authored
feat(router): enable starting the router without subgraphs (#1533)
1 parent 38df3ee commit 806d3b4

File tree

11 files changed

+309
-51
lines changed

11 files changed

+309
-51
lines changed

demo/go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ module github.com/wundergraph/cosmo/demo
22

33
go 1.23
44

5-
toolchain go1.23.4
6-
75
require (
86
github.com/99designs/gqlgen v0.17.63
97
github.com/google/uuid v1.6.0

router-tests/fuzzquery/fuzzquery_test.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,10 @@ import (
55
"fmt"
66
"github.com/stretchr/testify/require"
77
"github.com/wundergraph/cosmo/router-tests/testenv"
8-
"math/rand"
98
"net/http"
109
"testing"
1110
)
1211

13-
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
14-
15-
func randString(n int) string {
16-
b := make([]byte, n)
17-
for i := range b {
18-
b[i] = letterBytes[rand.Intn(len(letterBytes))]
19-
}
20-
return string(b)
21-
}
22-
2312
type testQuery struct {
2413
Name string
2514
Body string
@@ -29,7 +18,7 @@ type testQuery struct {
2918
func (t *testQuery) Data() []byte {
3019
name := t.Name
3120
if name == "" {
32-
name = randString(10)
21+
name = testenv.RandString(10)
3322
}
3423
values := map[string]interface{}{
3524
"query": fmt.Sprintf("query %s %s", name, t.Body),

router-tests/go.mod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ require (
4343
dario.cat/mergo v1.0.0 // indirect
4444
github.com/99designs/gqlgen v0.17.63 // indirect
4545
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
46+
github.com/KimMachineGun/automemlimit v0.6.1 // indirect
4647
github.com/MicahParks/keyfunc/v3 v3.3.5 // indirect
4748
github.com/Microsoft/go-winio v0.6.1 // indirect
4849
github.com/Microsoft/hcsshim v0.11.4 // indirect
@@ -54,9 +55,12 @@ require (
5455
github.com/caarlos0/env/v11 v11.1.0 // indirect
5556
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
5657
github.com/cespare/xxhash/v2 v2.3.0 // indirect
58+
github.com/cilium/ebpf v0.9.1 // indirect
5759
github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a // indirect
60+
github.com/containerd/cgroups/v3 v3.0.2 // indirect
5861
github.com/containerd/containerd v1.7.12 // indirect
5962
github.com/containerd/log v0.1.0 // indirect
63+
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
6064
github.com/cpuguy83/dockercfg v0.3.1 // indirect
6165
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
6266
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -84,6 +88,7 @@ require (
8488
github.com/gobwas/ws v1.4.0 // indirect
8589
github.com/goccy/go-json v0.10.3 // indirect
8690
github.com/goccy/go-yaml v1.13.4 // indirect
91+
github.com/godbus/dbus/v5 v5.1.0 // indirect
8792
github.com/gogo/protobuf v1.3.2 // indirect
8893
github.com/golang/protobuf v1.5.3 // indirect
8994
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
@@ -116,6 +121,8 @@ require (
116121
github.com/nats-io/nuid v1.0.1 // indirect
117122
github.com/opencontainers/go-digest v1.0.0 // indirect
118123
github.com/opencontainers/image-spec v1.1.0 // indirect
124+
github.com/opencontainers/runtime-spec v1.1.0 // indirect
125+
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
119126
github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d // indirect
120127
github.com/pierrec/lz4/v4 v4.1.21 // indirect
121128
github.com/pkg/errors v0.9.1 // indirect
@@ -156,6 +163,7 @@ require (
156163
go.opentelemetry.io/otel/exporters/prometheus v0.50.0 // indirect
157164
go.opentelemetry.io/otel/metric v1.28.0 // indirect
158165
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
166+
go.uber.org/automaxprocs v1.5.3 // indirect
159167
go.uber.org/multierr v1.11.0 // indirect
160168
go.uber.org/ratelimit v0.3.1 // indirect
161169
go.withmatt.com/connect-brotli v0.4.0 // indirect

router-tests/go.sum

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg6
1111
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
1212
github.com/IBM/sarama v1.42.1 h1:wugyWa15TDEHh2kvq2gAy1IHLjEjuYOYgXz/ruC/OSQ=
1313
github.com/IBM/sarama v1.42.1/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ=
14+
github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8=
15+
github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY=
1416
github.com/MicahParks/jwkset v0.5.19 h1:XZCsgJv05DBCvxEHYEHlSafqiuVn5ESG0VRB331Fxhw=
1517
github.com/MicahParks/jwkset v0.5.19/go.mod h1:q8ptTGn/Z9c4MwbcfeCDssADeVQb3Pk7PnVxrvi+2QY=
1618
github.com/MicahParks/keyfunc/v3 v3.3.5 h1:7ceAJLUAldnoueHDNzF8Bx06oVcQ5CfJnYwNt1U3YYo=
@@ -49,14 +51,20 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy
4951
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
5052
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
5153
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
54+
github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4=
55+
github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY=
5256
github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a h1:8d1CEOF1xldesKds5tRG3tExBsMOgWYownMHNCsev54=
5357
github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a/go.mod h1:rzgs2ZOiguV6/NpiDgADjRLPNyZlApIWxKpkT+X8SdY=
5458
github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo=
5559
github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs=
60+
github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0=
61+
github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE=
5662
github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0=
5763
github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk=
5864
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
5965
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
66+
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
67+
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6068
github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E=
6169
github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc=
6270
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
@@ -101,6 +109,8 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
101109
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
102110
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
103111
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
112+
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
113+
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
104114
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
105115
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
106116
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
@@ -136,6 +146,9 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
136146
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
137147
github.com/goccy/go-yaml v1.13.4 h1:XOnLX9GqT+kH/gB7YzCMUiDBFU9B7pm3HZz6kyeDPkk=
138148
github.com/goccy/go-yaml v1.13.4/go.mod h1:IjYwxUiJDoqpx2RmbdjMUceGHZwYLon3sfOGl5Hi9lc=
149+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
150+
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
151+
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
139152
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
140153
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
141154
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
@@ -262,6 +275,10 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
262275
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
263276
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
264277
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
278+
github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg=
279+
github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
280+
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
281+
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
265282
github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g=
266283
github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8=
267284
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
@@ -276,6 +293,8 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF
276293
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
277294
github.com/pquerna/cachecontrol v0.2.0 h1:vBXSNuE5MYP9IJ5kjsdo8uq+w41jSPgvba2DEnkRx9k=
278295
github.com/pquerna/cachecontrol v0.2.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
296+
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
297+
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
279298
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
280299
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
281300
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
@@ -404,6 +423,8 @@ go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7e
404423
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
405424
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
406425
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
426+
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
427+
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
407428
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
408429
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
409430
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=

router-tests/integration_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ func TestSimpleQuery(t *testing.T) {
4949
})
5050
}
5151

52+
func TestNoSubgraphConfig(t *testing.T) {
53+
t.Parallel()
54+
55+
testenv.RunRouterBinary(t, &testenv.Config{}, func(t *testing.T, xEnv *testenv.Environment) {
56+
res := xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{
57+
Query: `query { hello }`,
58+
})
59+
require.JSONEq(t, `{"data":{"hello":"Cosmo Router is ready! Follow this guide to deploy your first Supergraph: https://cosmo-docs.wundergraph.com/tutorial/from-zero-to-federation-in-5-steps-using-cosmo"}}`, res.Body)
60+
})
61+
}
62+
5263
func TestContentTypes(t *testing.T) {
5364
t.Parallel()
5465

router-tests/testenv/testenv.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"net/http/httptest"
1919
"net/url"
2020
"os"
21+
"os/exec"
2122
"path"
2223
"path/filepath"
2324
"regexp"
@@ -138,6 +139,16 @@ func Bench(b *testing.B, cfg *Config, f func(b *testing.B, xEnv *Environment)) {
138139

139140
}
140141

142+
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
143+
144+
func RandString(n int) string {
145+
b := make([]byte, n)
146+
for i := range b {
147+
b[i] = letterBytes[rand.Intn(len(letterBytes))]
148+
}
149+
return string(b)
150+
}
151+
141152
func assertCacheMetrics(t testing.TB, env *Environment, expected CacheMetricsAssertion, featureFlag string) {
142153
t.Helper()
143154
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100)
@@ -716,6 +727,12 @@ func createTestEnv(t testing.TB, cfg *Config) (*Environment, error) {
716727
return e, waitErr
717728
}
718729

730+
func generateJwtToken() (string, error) {
731+
jwtToken := jwt.New(jwt.SigningMethodHS256)
732+
jwtToken.Claims = testTokenClaims()
733+
return jwtToken.SignedString([]byte("hunter2"))
734+
}
735+
719736
func configureRouter(listenerAddr string, testConfig *Config, routerConfig *nodev1.RouterConfig, cdn *httptest.Server, natsData *NatsData) (*core.Router, error) {
720737
cfg := config.Config{
721738
Graph: config.Graph{},
@@ -740,9 +757,7 @@ func configureRouter(listenerAddr string, testConfig *Config, routerConfig *node
740757
testConfig.ModifyCDNConfig(&cfg.CDN)
741758
}
742759

743-
jwtToken := jwt.New(jwt.SigningMethodHS256)
744-
jwtToken.Claims = testTokenClaims()
745-
graphApiToken, err := jwtToken.SignedString([]byte("hunter2"))
760+
graphApiToken, err := generateJwtToken()
746761
if err != nil {
747762
return nil, err
748763
}
@@ -1062,6 +1077,7 @@ type Environment struct {
10621077
routerConfigVersionMyFF string
10631078

10641079
metricReader metric.Reader
1080+
routerCmd *exec.Cmd
10651081
}
10661082

10671083
func GetPubSubNameFn(prefix string) func(name string) string {
@@ -1109,9 +1125,11 @@ func (e *Environment) Shutdown() {
11091125
defer cancel()
11101126

11111127
// Gracefully shutdown router
1112-
err := e.Router.Shutdown(ctx)
1113-
if err != nil && !errors.Is(err, context.DeadlineExceeded) {
1114-
e.t.Errorf("could not shutdown router: %s", err)
1128+
if e.Router != nil {
1129+
err := e.Router.Shutdown(ctx)
1130+
if err != nil && !errors.Is(err, context.DeadlineExceeded) {
1131+
e.t.Errorf("could not shutdown router: %s", err)
1132+
}
11151133
}
11161134

11171135
// Close all test servers
@@ -1152,6 +1170,12 @@ func (e *Environment) Shutdown() {
11521170
if e.cfg.EnableKafka && e.KafkaClient != nil {
11531171
e.KafkaClient.Flush(ctx)
11541172
}
1173+
1174+
if e.routerCmd != nil {
1175+
if err := e.routerCmd.Process.Signal(os.Interrupt); err != nil {
1176+
e.t.Logf("could not interrupt router process: %s", err)
1177+
}
1178+
}
11551179
}
11561180

11571181
type SubgraphRequestCount struct {

0 commit comments

Comments
 (0)