spb/internetpressure
Public
TypeScript 36.3%
Python 31.8%
Go 18%
JavaScript 9.8%
Shell 1.9%
SQL 1.4%
CSS 0.5%
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