package main import ( "os" "path/filepath" "testing" "time" ) func TestLoadConfig_Defaults(t *testing.T) { // Ensure env vars don't leak in from the host. for _, k := range []string{"ECS_GATEWAY_URL", "ECS_GATEWAY_CA", "ECS_REGION", "ECS_CLUSTER", "ECS_ACCESS_KEY", "ECS_SECRET_KEY", "ECS_IMDS_BASE", "ECS_CONTAINERD_SOCKET", "ECS_HEARTBEAT_INTERVAL", "ECS_POLL_INTERVAL"} { t.Setenv(k, "") } cfg := loadConfig(filepath.Join(t.TempDir(), "absent.env")) if cfg.GatewayCA != defaultGatewayCA { t.Errorf("GatewayCA = %q, want default", cfg.GatewayCA) } if cfg.IMDSBase != defaultIMDSBase { t.Errorf("IMDSBase = %q, want default", cfg.IMDSBase) } if cfg.ContainerdSocket != defaultContainerdSocket { t.Errorf("ContainerdSocket = %q, want default", cfg.ContainerdSocket) } if cfg.ClusterName != "default" { t.Errorf("ClusterName = %q, want default", cfg.ClusterName) } if cfg.Heartbeat != defaultHeartbeat { t.Errorf("Heartbeat = %v, want %v", cfg.Heartbeat, defaultHeartbeat) } if cfg.PollInterval != defaultPollInterval { t.Errorf("PollInterval = %v, want %v", cfg.PollInterval, defaultPollInterval) } } func TestLoadConfig_FileThenEnvOverride(t *testing.T) { dir := t.TempDir() envFile := filepath.Join(dir, "agent.env") body := "# comment\nECS_GATEWAY_URL=https://gw.file\nECS_REGION=us-west-2\nECS_CLUSTER=prod\n" if err := os.WriteFile(envFile, []byte(body), 0o600); err != nil { t.Fatal(err) } t.Setenv("ECS_GATEWAY_URL", "https://gw.env") t.Setenv("ECS_ACCESS_KEY", "AKIAENV") cfg := loadConfig(envFile) if cfg.GatewayURL != "https://gw.env" { t.Errorf("GatewayURL = %q, want env override", cfg.GatewayURL) } if cfg.Region != "us-west-2" { t.Errorf("Region = %q, want from file", cfg.Region) } if cfg.ClusterName != "prod" { t.Errorf("ClusterName = %q, want from file", cfg.ClusterName) } if cfg.AccessKey != "AKIAENV" { t.Errorf("AccessKey = %q, want env", cfg.AccessKey) } } func TestLoadConfig_HeartbeatOverride(t *testing.T) { t.Setenv("ECS_HEARTBEAT_INTERVAL", "5s") if cfg := loadConfig(filepath.Join(t.TempDir(), "absent.env")); cfg.Heartbeat != 5*time.Second { t.Errorf("Heartbeat = %v, want 5s", cfg.Heartbeat) } // Garbage value falls back to the default, not zero. t.Setenv("ECS_HEARTBEAT_INTERVAL", "not-a-duration") if cfg := loadConfig(filepath.Join(t.TempDir(), "absent.env")); cfg.Heartbeat != defaultHeartbeat { t.Errorf("Heartbeat = %v, want default on bad value", cfg.Heartbeat) } }