package utils import ( "testing" "time" ) func TestOfflineLicenseSignAndVerify(t *testing.T) { kp, err := DeriveOfflineKeyPair("319de107090c6fd0aae9b7db343376dd5a22ccfb24b631ee67144141b1d32000") if err != nil { t.Fatal(err) } now := time.Now().Unix() claims := OfflineLicenseClaims{ ProductCode: "opsxshell", DeviceID: "dev-1", Email: "a@b.com", PlanType: "yearly", IssuedAt: now, ExpiresAt: now + 86400*30, MaxDevices: 1, } serial, err := SignOfflineLicense(kp, claims) if err != nil { t.Fatal(err) } if !IsOfflineLicenseKey(serial) { t.Fatalf("prefix: %s", serial) } got, err := VerifyOfflineLicense(kp.Public, serial) if err != nil { t.Fatal(err) } if got.DeviceID != "dev-1" || got.PlanType != "yearly" { t.Fatalf("claims mismatch: %+v", got) } } func TestOfflineLicenseRejectsPerpetual(t *testing.T) { kp, err := DeriveOfflineKeyPair("319de107090c6fd0aae9b7db343376dd5a22ccfb24b631ee67144141b1d32000") if err != nil { t.Fatal(err) } now := time.Now().Unix() _, err = SignOfflineLicense(kp, OfflineLicenseClaims{ ProductCode: "opsxshell", DeviceID: "dev-1", PlanType: "perpetual", IssuedAt: now, ExpiresAt: now + 86400, MaxDevices: 1, }) if err == nil { t.Fatal("expected perpetual reject") } } func TestOfflineLicenseRejectsOver365(t *testing.T) { kp, err := DeriveOfflineKeyPair("319de107090c6fd0aae9b7db343376dd5a22ccfb24b631ee67144141b1d32000") if err != nil { t.Fatal(err) } now := time.Now().Unix() _, err = SignOfflineLicense(kp, OfflineLicenseClaims{ ProductCode: "opsxshell", DeviceID: "dev-1", PlanType: "yearly", IssuedAt: now, ExpiresAt: now + 86400*400, MaxDevices: 1, }) if err == nil { t.Fatal("expected over-365 reject") } }