package oci import ( "regexp" "strings" "testing" ) func TestRelayResourceNames_Deterministic(t *testing.T) { tenancy := "ocid1.tenancy.oc1..aaaaexampletenant" a := relayResourceNames(tenancy) b := relayResourceNames(tenancy) if a != b { t.Fatalf("同 tenancy 派生不一致: %+v vs %+v", a, b) } } func TestRelayResourceNames_DistinctTenancies(t *testing.T) { cases := []string{ "ocid1.tenancy.oc1..aaaaaaaaaa", "ocid1.tenancy.oc1..bbbbbbbbbb", "ocid1.tenancy.oc1..cccccccccc", } seen := map[string]string{} for _, tenancy := range cases { n := relayResourceNames(tenancy) if got, ok := seen[n.TopicPrefix]; ok { t.Fatalf("前缀冲突: %s 与 %s 同为 %s", tenancy, got, n.TopicPrefix) } seen[n.TopicPrefix] = tenancy assertNoBrandLeak(t, tenancy, n) } } // assertNoBrandLeak 断言派生结果不含品牌明文,以及格式符合预期。 func assertNoBrandLeak(t *testing.T, tenancy string, n relayNames) { t.Helper() banned := []string{"oci-portal", "ociportal", "logs", "portal"} fields := []struct { name string value string }{ {"TopicPrefix", n.TopicPrefix}, {"PolicyName", n.PolicyName}, {"ConnectorName", n.ConnectorName}, } for _, f := range fields { lower := strings.ToLower(f.value) for _, b := range banned { if strings.Contains(lower, b) { t.Errorf("tenancy %s: %s=%q 含品牌明文 %q", tenancy, f.name, f.value, b) } } if !regexp.MustCompile(`^[0-9a-f]{8}-audit(-p)?$`).MatchString(f.value) { t.Errorf("tenancy %s: %s=%q 不符合 <8hex>-audit(-p)? 格式", tenancy, f.name, f.value) } } } func TestRelayTopicNewName_Suffix(t *testing.T) { tests := []struct { name string prefix string }{ {name: "标准前缀", prefix: "c3f2a1b0-audit"}, {name: "legacy 前缀兼容", prefix: legacyRelayTopicPrefix}, } pat := regexp.MustCompile(`^[0-9a-f]{8}$`) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := relayTopicNewName(tt.prefix) if err != nil { t.Fatalf("生成失败: %v", err) } if !strings.HasPrefix(got, tt.prefix+"-") { t.Errorf("前缀不符: got=%q, prefix=%q", got, tt.prefix) } suffix := strings.TrimPrefix(got, tt.prefix+"-") if !pat.MatchString(suffix) { t.Errorf("后缀非 8 hex: got=%q, suffix=%q", got, suffix) } }) } } func TestLegacyPrefixes_Unchanged(t *testing.T) { cases := []struct { name string got string want string }{ {name: "Topic legacy", got: legacyRelayTopicPrefix, want: "ociportal-logs"}, {name: "Policy legacy", got: legacyRelayPolicyName, want: "ociportal-logs-sch"}, {name: "Connector legacy", got: legacyRelayConnectorName, want: "ociportal-logs"}, } for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { if tt.got != tt.want { t.Errorf("legacy 常量被误改: got=%q, want=%q", tt.got, tt.want) } }) } } func TestRelayDescriptions_Neutral(t *testing.T) { banned := []string{"oci-portal", "ociportal", "日志回传", "面板"} for _, desc := range []string{relayTopicDescNew, relayPolicyDescNew} { lower := strings.ToLower(desc) for _, b := range banned { if strings.Contains(lower, strings.ToLower(b)) { t.Errorf("描述含品牌明文 %q: %q", b, desc) } } } }