@@ -0,0 +1,115 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user