You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

123 lines
4.5 KiB

package user
import (
"testing"
"yunyan/pb"
)
// 设备身份的判定口径:**设备就是 MAC**。
//
// 这两个函数决定了「同一台设备」在绑定/接管/解绑三条路径上是否被认出来,
// 认错的后果是静默的:去重失效会让 userdevice 表里堆重复行,接管失效会让
// 原用户的设备列表里一直留着一台已经不属于它的耳机。所以用例守在这里。
func TestAlreadyBound_经典蓝牙耳机_code传空也能去重(t *testing.T) {
// 客户端对经典蓝牙耳机 code 传空;服务端存进 license 的是 model.Code(=MAC)。
// 旧实现比 `v.License == req.Code` 恒为 false,于是每次重绑都插一条新行。
existing := &pb.DBUserDivice{
Devicename: "Echo-one",
Devicemac: "11:11:22:33:33:A4",
License: "11:11:22:33:33:A4",
}
req := &pb.UserBindDeviceReq{
Devicename: "Echo-one",
Devicemac: "11:11:22:33:33:A4",
Code: "",
}
if !alreadyBound(existing, req) {
t.Fatal("同一台耳机重新绑定应判定为已绑定,否则会插入重复行")
}
}
func TestAlreadyBound_设备名变了仍是同一台(t *testing.T) {
// Android 的 getBondedDevices 给的是系统缓存的配对名;固件也改过名
// (DEEPVOICE → Echo-one)。名字参与身份判断会让同一台设备换名就多一行。
existing := &pb.DBUserDivice{
Devicename: "DEEPVOICE",
Devicemac: "11:11:22:33:33:A4",
}
req := &pb.UserBindDeviceReq{
Devicename: "Echo-one",
Devicemac: "11:11:22:33:33:A4",
}
if !alreadyBound(existing, req) {
t.Fatal("MAC 相同即同一台,设备名不参与身份判断")
}
}
func TestAlreadyBound_MAC大小写不敏感(t *testing.T) {
existing := &pb.DBUserDivice{Devicemac: "11:11:22:33:33:a4"}
req := &pb.UserBindDeviceReq{Devicemac: "11:11:22:33:33:A4"}
if !alreadyBound(existing, req) {
t.Fatal("MAC 写法的大小写取决于当初是谁写的,比较必须大小写不敏感")
}
}
func TestAlreadyBound_不同MAC不是同一台(t *testing.T) {
existing := &pb.DBUserDivice{Devicename: "Echo-one", Devicemac: "11:11:22:33:33:A4"}
req := &pb.UserBindDeviceReq{Devicename: "Echo-one", Devicemac: "AA:BB:CC:DD:EE:FF"}
if alreadyBound(existing, req) {
t.Fatal("换了一台耳机必须判为不同设备,否则新设备绑不上")
}
}
func TestAlreadyBound_无MAC的设备回退比设备码(t *testing.T) {
// 早年按设备码导入、未登记 MAC 的设备走这条
existing := &pb.DBUserDivice{License: "ABC123"}
req := &pb.UserBindDeviceReq{Code: "ABC123"}
if !alreadyBound(existing, req) {
t.Fatal("没有 MAC 时应回退按设备码认")
}
req2 := &pb.UserBindDeviceReq{Code: "XYZ789"}
if alreadyBound(existing, req2) {
t.Fatal("设备码不同即不同设备")
}
}
func TestAlreadyBound_空设备码不匹配空License(t *testing.T) {
// 两边都空不能算「同一台」,否则用户名下第一条无 MAC 记录会吞掉所有新绑定
existing := &pb.DBUserDivice{License: ""}
req := &pb.UserBindDeviceReq{Code: ""}
if alreadyBound(existing, req) {
t.Fatal("既无 MAC 又无设备码时不能判为同一台")
}
}
func TestSameUserDevice_MAC对得上就是同一台(t *testing.T) {
// license 与 MAC 不一致(后台重导入过 license)时,旧实现只比 license
// 会判成「不是同一台」,接管时清不掉原用户那条绑定。
v := &pb.DBUserDivice{Devicemac: "11:11:22:33:33:A4", License: "旧的授权码"}
code := &pb.DBAuthCode{Devicemac: "11:11:22:33:33:A4", Code: "11:11:22:33:33:A4"}
if !sameUserDevice(v, code) {
t.Fatal("MAC 相同即同一台,license 写成什么都不影响")
}
}
func TestSameUserDevice_无MAC时回退比授权码(t *testing.T) {
v := &pb.DBUserDivice{License: "ABC123"}
code := &pb.DBAuthCode{Code: "ABC123"}
if !sameUserDevice(v, code) {
t.Fatal("没有 MAC 时应回退按授权码认")
}
}
func TestSameUserDevice_MAC不同且授权码不同则不是同一台(t *testing.T) {
v := &pb.DBUserDivice{Devicemac: "11:11:22:33:33:A4", License: "ABC123"}
code := &pb.DBAuthCode{Devicemac: "AA:BB:CC:DD:EE:FF", Code: "XYZ789"}
if sameUserDevice(v, code) {
t.Fatal("两个维度都对不上必须判为不同设备")
}
}
func TestSameUserDevice_空值不panic(t *testing.T) {
if sameUserDevice(nil, nil) || sameUserDevice(&pb.DBUserDivice{}, nil) ||
sameUserDevice(nil, &pb.DBAuthCode{}) {
t.Fatal("空值应判为不同设备")
}
if alreadyBound(nil, nil) || alreadyBound(&pb.DBUserDivice{}, nil) ||
alreadyBound(nil, &pb.UserBindDeviceReq{}) {
t.Fatal("空值应判为不同设备")
}
}