Files
oci-portal/internal/oci/logrelay_names_test.go
2026-07-22 16:51:23 +08:00

116 lines
3.2 KiB
Go

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)
}
}
}
}