SPB Git forge
15commits 1branches 0releases
29.7 MBsize
maindefault branch
10 days agolast push
TypeScript 36.3% Python 31.8% Go 18% JavaScript 9.8% Shell 1.9% SQL 1.4% CSS 0.5%
3.5 KB · 120 lines go
Raw Blame History
1package config23import (4	"os"5	"path/filepath"6	"reflect"7	"strings"8	"testing"9)1011const sample = `# probe config12probe_id: ca-qc-0113key: "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"   # issued by admin14ingest_url: https://www.internetpressure.io/ingest/v1/15data_dir: /tmp/ip-probe-test16listen: 127.0.0.1:938117log_level: debug18allow_self_update: false19resolvers_override:20  - system21  - google=8.8.8.8:5322  - 1.1.1.123max_concurrency: 424`2526func TestLoadFile(t *testing.T) {27	dir := t.TempDir()28	p := filepath.Join(dir, "probe.yaml")29	if err := os.WriteFile(p, []byte(sample), 0o600); err != nil {30		t.Fatal(err)31	}32	cfg, err := Load(p, true)33	if err != nil {34		t.Fatal(err)35	}36	if cfg.ProbeID != "ca-qc-01" || cfg.LogLevel != "debug" || cfg.AllowSelfUpdate || cfg.MaxConcurrency != 4 {37		t.Fatalf("unexpected config: %+v", cfg)38	}39	if cfg.IngestURL != "https://www.internetpressure.io/ingest/v1" {40		t.Fatalf("ingest_url not normalised: %q", cfg.IngestURL)41	}42	want := []string{"system", "google=8.8.8.8:53", "1.1.1.1"}43	if !reflect.DeepEqual(cfg.ResolversOverride, want) {44		t.Fatalf("resolvers = %v", cfg.ResolversOverride)45	}46	id, addr, err := ParseResolver("1.1.1.1")47	if err != nil || id != "1-1-1-1" || addr != "1.1.1.1:53" {48		t.Fatalf("ParseResolver bare ip: %q %q %v", id, addr, err)49	}50}5152func TestEnvOverrides(t *testing.T) {53	t.Setenv("IP_PROBE_PROBE_ID", "eu-fr-02")54	t.Setenv("IP_PROBE_KEY", strings.Repeat("ab", 32))55	t.Setenv("IP_PROBE_RESOLVERS_OVERRIDE", "system, quad9=9.9.9.9:53")56	t.Setenv("IP_PROBE_ALLOW_SELF_UPDATE", "false")57	cfg, err := Load("", true)58	if err != nil {59		t.Fatal(err)60	}61	if cfg.ProbeID != "eu-fr-02" || cfg.AllowSelfUpdate || len(cfg.ResolversOverride) != 2 {62		t.Fatalf("env overrides not applied: %+v", cfg)63	}64	if cfg.DataDir != DefaultDataDir || cfg.Listen != DefaultListen {65		t.Fatalf("defaults lost: %+v", cfg)66	}67}6869func TestValidation(t *testing.T) {70	cases := map[string]string{71		"probe_id: BAD_ID\nkey: " + strings.Repeat("ab", 32):                     "probe_id",72		"probe_id: ok-1\nkey: nothex":                                            "64 hex",73		"probe_id: ok-1\nkey: " + strings.Repeat("ab", 32) + "\nlisten: nope":    "listen",74		"probe_id: ok-1\nkey: " + strings.Repeat("ab", 32) + "\nlog_level: loud": "log_level",75		"probe_id: ok-1\nkey: " + strings.Repeat("ab", 32) + "\nbogus: 1":        "unknown key",76	}77	for src, want := range cases {78		var c = Defaults()79		err := c.applyYAML([]byte(src))80		if err == nil {81			c.normalise()82			err = c.Validate(true)83		}84		if err == nil || !strings.Contains(err.Error(), want) {85			t.Errorf("%q: error %v does not mention %q", src, err, want)86		}87	}88	// Non-strict: missing id/key is fine (used by `once`).89	if _, err := Load("", false); err != nil {90		t.Fatal(err)91	}92}9394func TestYAMLSubset(t *testing.T) {95	doc, err := parseYAML([]byte("a: 'x # not a comment'\nb: [1, \"two\", 3] # c\nc: []\nd:\ne: ~\n"))96	if err != nil {97		t.Fatal(err)98	}99	if doc["a"] != "x # not a comment" {100		t.Errorf("a = %q", doc["a"])101	}102	if !reflect.DeepEqual(doc["b"], []string{"1", "two", "3"}) {103		t.Errorf("b = %v", doc["b"])104	}105	if doc["c"] != "" || doc["d"] != "" || doc["e"] != "" {106		t.Errorf("empty values: %v %v %v", doc["c"], doc["d"], doc["e"])107	}108	if _, err := parseYAML([]byte("a:\n  b: 1\n")); err == nil {109		t.Error("nested mapping accepted")110	}111}112113func TestRedacted(t *testing.T) {114	c := Config{Key: strings.Repeat("ab", 32)}115	r := c.Redacted().Key116	if !strings.HasPrefix(r, "abab") || !strings.HasSuffix(r, "abab") || !strings.Contains(r, "****") {117		t.Fatalf("redacted = %q", r)118	}119}120