@@ -2,8 +2,14 @@ package coderd_test
2
2
3
3
import (
4
4
"context"
5
+ "crypto/x509"
6
+ "database/sql"
5
7
"io"
8
+ "net"
6
9
"net/http"
10
+ "net/http/httptest"
11
+ "net/url"
12
+ "os"
7
13
"strconv"
8
14
"strings"
9
15
"testing"
@@ -14,10 +20,23 @@ import (
14
20
"github.com/stretchr/testify/require"
15
21
"go.uber.org/goleak"
16
22
"golang.org/x/xerrors"
23
+ "google.golang.org/api/idtoken"
24
+ "google.golang.org/api/option"
25
+
26
+ "cdr.dev/slog"
27
+ "cdr.dev/slog/sloggers/slogtest"
17
28
18
29
"github.com/coder/coder/buildinfo"
30
+ "github.com/coder/coder/coderd"
31
+ "github.com/coder/coder/coderd/autobuild/executor"
19
32
"github.com/coder/coder/coderd/coderdtest"
33
+ "github.com/coder/coder/coderd/database"
34
+ "github.com/coder/coder/coderd/database/databasefake"
35
+ "github.com/coder/coder/coderd/database/postgres"
36
+ "github.com/coder/coder/coderd/gitsshkey"
20
37
"github.com/coder/coder/coderd/rbac"
38
+ "github.com/coder/coder/coderd/telemetry"
39
+ "github.com/coder/coder/coderd/turnconn"
21
40
"github.com/coder/coder/codersdk"
22
41
"github.com/coder/coder/provisioner/echo"
23
42
"github.com/coder/coder/provisionersdk/proto"
@@ -39,13 +58,96 @@ func TestBuildInfo(t *testing.T) {
39
58
// TestAuthorizeAllEndpoints will check `authorize` is called on every endpoint registered.
40
59
func TestAuthorizeAllEndpoints (t * testing.T ) {
41
60
t .Parallel ()
42
- ctx := context .Background ()
61
+ var (
62
+ ctx = context .Background ()
63
+ authorizer = & fakeAuthorizer {}
64
+ )
43
65
44
- authorizer := & fakeAuthorizer {}
45
- client , api := coderdtest .NewWithAPI (t , & coderdtest.Options {
46
- Authorizer : authorizer ,
47
- IncludeProvisionerD : true ,
48
- })
66
+ // This function was taken from coderdtest.newWithAPI. It is intentionally
67
+ // copied to avoid exposing the API to other tests in coderd. Tests should
68
+ // not need a reference to coderd.API...this test is an exception.
69
+ newClient := func (authorizer rbac.Authorizer ) (* codersdk.Client , * coderd.API ) {
70
+ // This can be hotswapped for a live database instance.
71
+ db := databasefake .New ()
72
+ pubsub := database .NewPubsubInMemory ()
73
+ if os .Getenv ("DB" ) != "" {
74
+ connectionURL , closePg , err := postgres .Open ()
75
+ require .NoError (t , err )
76
+ t .Cleanup (closePg )
77
+ sqlDB , err := sql .Open ("postgres" , connectionURL )
78
+ require .NoError (t , err )
79
+ t .Cleanup (func () {
80
+ _ = sqlDB .Close ()
81
+ })
82
+ err = database .MigrateUp (sqlDB )
83
+ require .NoError (t , err )
84
+ db = database .New (sqlDB )
85
+
86
+ pubsub , err = database .NewPubsub (context .Background (), sqlDB , connectionURL )
87
+ require .NoError (t , err )
88
+ t .Cleanup (func () {
89
+ _ = pubsub .Close ()
90
+ })
91
+ }
92
+
93
+ tickerCh := make (chan time.Time )
94
+ t .Cleanup (func () { close (tickerCh ) })
95
+
96
+ ctx , cancelFunc := context .WithCancel (context .Background ())
97
+ lifecycleExecutor := executor .New (
98
+ ctx ,
99
+ db ,
100
+ slogtest .Make (t , nil ).Named ("autobuild.executor" ).Leveled (slog .LevelDebug ),
101
+ tickerCh ,
102
+ ).WithStatsChannel (nil )
103
+ lifecycleExecutor .Run ()
104
+
105
+ srv := httptest .NewUnstartedServer (nil )
106
+ srv .Config .BaseContext = func (_ net.Listener ) context.Context {
107
+ return ctx
108
+ }
109
+ srv .Start ()
110
+ serverURL , err := url .Parse (srv .URL )
111
+ require .NoError (t , err )
112
+
113
+ turnServer , err := turnconn .New (nil )
114
+ require .NoError (t , err )
115
+
116
+ validator , err := idtoken .NewValidator (ctx , option .WithoutAuthentication ())
117
+ require .NoError (t , err )
118
+
119
+ // We set the handler after server creation for the access URL.
120
+ coderAPI := coderd .New (& coderd.Options {
121
+ AgentConnectionUpdateFrequency : 150 * time .Millisecond ,
122
+ AccessURL : serverURL ,
123
+ Logger : slogtest .Make (t , nil ).Leveled (slog .LevelDebug ),
124
+ Database : db ,
125
+ Pubsub : pubsub ,
126
+
127
+ AWSCertificates : nil ,
128
+ AzureCertificates : x509.VerifyOptions {},
129
+ GithubOAuth2Config : nil ,
130
+ GoogleTokenValidator : validator ,
131
+ SSHKeygenAlgorithm : gitsshkey .AlgorithmEd25519 ,
132
+ TURNServer : turnServer ,
133
+ APIRateLimit : 0 ,
134
+ Authorizer : authorizer ,
135
+ Telemetry : telemetry .NewNoop (),
136
+ })
137
+ srv .Config .Handler = coderAPI .Handler
138
+
139
+ _ = coderdtest .NewProvisionerDaemon (t , coderAPI )
140
+ t .Cleanup (func () {
141
+ cancelFunc ()
142
+ _ = turnServer .Close ()
143
+ srv .Close ()
144
+ _ = coderAPI .Close ()
145
+ })
146
+
147
+ return codersdk .New (serverURL ), coderAPI
148
+ }
149
+
150
+ client , api := newClient (authorizer )
49
151
admin := coderdtest .CreateFirstUser (t , client )
50
152
// The provisioner will call to coderd and register itself. This is async,
51
153
// so we wait for it to occur.
0 commit comments