package devcode import "testing" func TestProductID(t *testing.T) { // MAC 形态:PID 编在前两字节,带不带冒号都要认 if pid, err := ProductID("B0:23:00:00:00:01"); err != nil || pid != 0xB023 { t.Fatalf("带冒号 MAC: pid=%X err=%v", pid, err) } if pid, err := ProductID("B023000000AB"); err != nil || pid != 0xB023 { t.Fatalf("不带冒号 MAC: pid=%X err=%v", pid, err) } // 已废弃的 license 串形态:必须报错而不是解出个 PID 来。 // 这两种串长度都是 20,若哪天有人把 license 逻辑加回来,这条会先炸。 if _, err := ProductID("71E5E5C3A797C043B5A7"); err == nil { t.Fatal("license 串应当解析失败(授权码已移除)") } if _, err := ProductID("nonsense"); err == nil { t.Fatal("垃圾输入应该报错") } } // 客户端送上来的各种写法都要能规范化成落库形态(大写+冒号), // 这是「后台看到的 MAC == 客户端校验用的 MAC」的前提。 func TestNormalizeMatchesStoredForm(t *testing.T) { const stored = "B0:23:00:00:00:AB" for _, in := range []string{ "B0:23:00:00:00:AB", // Android BluetoothDevice.getAddress() 的原样 "b0:23:00:00:00:ab", // 小写 "B023000000AB", // 无冒号 "b023000000ab", " B0:23:00:00:00:AB ", } { got, ok := NormalizeMac(in) if !ok || got != stored { t.Fatalf("NormalizeMac(%q) = %q,%v;期望 %q", in, got, ok, stored) } } if _, ok := NormalizeMac("ZZ:ZZ"); ok { t.Fatal("非法 MAC 应该 ok=false") } }