From bc0c3caaa91fab5173c4f1073ca5459e43d1fbf3 Mon Sep 17 00:00:00 2001 From: Jake Coffman Date: Fri, 21 Aug 2026 15:01:05 -0500 Subject: [PATCH] add support for experiments --- internal/config/config.go | 10 ++++++++++ internal/config/config_test.go | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/internal/config/config.go b/internal/config/config.go index 0423970..8b92ba4 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -23,6 +23,16 @@ type Config struct { Credentials Credentials `json:"all_credentials"` CA CaDetails `json:"ca"` ProxyAuth BasicAuthCredentials `json:"proxy_auth"` + Experiments Experiments `json:"experiments"` +} + +// Experiments contains job experiments passed to the proxy. +type Experiments map[string]any + +// Enabled reports whether an experiment is explicitly enabled. +func (e Experiments) Enabled(name string) bool { + enabled, ok := e[name].(bool) + return ok && enabled } // Credential is a wrapper around map[string]any, which is the format diff --git a/internal/config/config_test.go b/internal/config/config_test.go index a15b82f..debaef3 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -22,6 +22,26 @@ func TestParse(t *testing.T) { input: "{\"proxy_auth\": { \"username\": \"proxy_user\", \"password\": \"password\" }}", expected: &Config{ProxyAuth: BasicAuthCredentials{Username: "proxy_user", Password: "password"}}, }, + "experiments": { + input: `{ + "experiments": { + "enabled": true, + "disabled": false, + "string": "value", + "number": 42, + "object": {"key": "value"} + } + }`, + expected: &Config{ + Experiments: Experiments{ + "enabled": true, + "disabled": false, + "string": "value", + "number": float64(42), + "object": map[string]any{"key": "value"}, + }, + }, + }, } temp := t.TempDir() @@ -47,6 +67,22 @@ func TestParse(t *testing.T) { } } +func TestExperimentsEnabled(t *testing.T) { + experiments := Experiments{ + "enabled": true, + "disabled": false, + "string_true": "true", + "number": float64(1), + } + + assert.True(t, experiments.Enabled("enabled")) + assert.False(t, experiments.Enabled("disabled")) + assert.False(t, experiments.Enabled("string_true")) + assert.False(t, experiments.Enabled("number")) + assert.False(t, experiments.Enabled("missing")) + assert.False(t, Experiments(nil).Enabled("enabled")) +} + func TestHost(t *testing.T) { cases := map[string]struct { input Credential