| 240 | } |
| 241 | |
| 242 | func NewOptions(t testing.TB, options *Options) (func(http.Handler), context.CancelFunc, *url.URL, *coderd.Options) { |
| 243 | t.Helper() |
| 244 | |
| 245 | if options == nil { |
| 246 | options = &Options{} |
| 247 | } |
| 248 | if options.Logger == nil { |
| 249 | logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug).Named("coderd") |
| 250 | options.Logger = &logger |
| 251 | } |
| 252 | if options.GoogleTokenValidator == nil { |
| 253 | ctx, cancelFunc := context.WithCancel(context.Background()) |
| 254 | t.Cleanup(cancelFunc) |
| 255 | var err error |
| 256 | options.GoogleTokenValidator, err = idtoken.NewValidator(ctx, option.WithoutAuthentication()) |
| 257 | require.NoError(t, err) |
| 258 | } |
| 259 | if options.AutobuildTicker == nil { |
| 260 | ticker := make(chan time.Time) |
| 261 | options.AutobuildTicker = ticker |
| 262 | t.Cleanup(func() { close(ticker) }) |
| 263 | } |
| 264 | if options.AutobuildStats != nil { |
| 265 | t.Cleanup(func() { |
| 266 | close(options.AutobuildStats) |
| 267 | }) |
| 268 | } |
| 269 | |
| 270 | if options.Authorizer == nil { |
| 271 | defAuth := rbac.NewStrictCachingAuthorizer(prometheus.NewRegistry()) |
| 272 | if _, ok := t.(*testing.T); ok { |
| 273 | options.Authorizer = &RecordingAuthorizer{ |
| 274 | Wrapped: defAuth, |
| 275 | } |
| 276 | } else { |
| 277 | // In benchmarks, the recording authorizer greatly skews results. |
| 278 | options.Authorizer = defAuth |
| 279 | } |
| 280 | } |
| 281 | |
| 282 | var usageInserter *atomic.Pointer[usage.Inserter] |
| 283 | if options.UsageInserter != nil { |
| 284 | usageInserter = &atomic.Pointer[usage.Inserter]{} |
| 285 | usageInserter.Store(&options.UsageInserter) |
| 286 | } |
| 287 | if options.Database == nil { |
| 288 | options.Database, options.Pubsub = dbtestutil.NewDB(t) |
| 289 | } |
| 290 | if options.CoordinatorResumeTokenProvider == nil { |
| 291 | options.CoordinatorResumeTokenProvider = tailnet.NewInsecureTestResumeTokenProvider() |
| 292 | } |
| 293 | |
| 294 | if options.NotificationsEnqueuer == nil { |
| 295 | options.NotificationsEnqueuer = ¬ificationstest.FakeEnqueuer{} |
| 296 | } |
| 297 | |
| 298 | accessControlStore := &atomic.Pointer[dbauthz.AccessControlStore]{} |
| 299 | var acs dbauthz.AccessControlStore = dbauthz.AGPLTemplateAccessControlStore{} |