| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- package device
- import (
- "context"
- "errors"
- "strings"
- "testing"
- )
- // injectSnapshot stores a snapshot on the managed device so region guards observe
- // its IMSI without replaying the full readSnapshot AT transcript.
- func injectSnapshot(t *testing.T, manager *Manager, id string, snapshot *Snapshot) {
- t.Helper()
- state, err := manager.lookup(id)
- if err != nil {
- t.Fatalf("lookup: %v", err)
- }
- manager.setResult(id, state, snapshot, nil)
- }
- func TestCardMCCMNC(t *testing.T) {
- t.Parallel()
- if mcc, _ := CardMCCMNC("460001234567890"); mcc != "460" {
- t.Fatalf("CardMCCMNC mcc = %q, want 460", mcc)
- }
- for _, bad := range []string{"", "4600", "4600X1234"} {
- if mcc, _ := CardMCCMNC(bad); mcc != "" {
- t.Fatalf("CardMCCMNC(%q) mcc = %q, want empty", bad, mcc)
- }
- }
- }
- func TestRegionBlockReason(t *testing.T) {
- t.Parallel()
- for _, imsi := range []string{"460001234567890", "461001234567890"} {
- reason := RegionBlockReason(imsi)
- if reason == "" {
- t.Fatalf("RegionBlockReason(%q) did not block", imsi)
- }
- if !strings.Contains(reason, "中国") {
- t.Fatalf("RegionBlockReason(%q) = %q, want it to name 中国", imsi, reason)
- }
- }
- for _, imsi := range []string{"310260123456789", "001011234567890", ""} {
- if reason := RegionBlockReason(imsi); reason != "" {
- t.Fatalf("RegionBlockReason(%q) = %q, want empty (fail-open)", imsi, reason)
- }
- }
- }
- func TestSetNetworkBlockedForRestrictedRegionSIM(t *testing.T) {
- client := &transcriptClient{}
- manager, id := newStartedTestManager(t, client)
- injectSnapshot(t, manager, id, &Snapshot{DeviceID: id, IMSI: "460001234567890"})
- _, err := manager.SetNetwork(context.Background(), id, NetworkRequest{
- Enabled: true, APN: "internet", IPVersion: "IPV4V6",
- })
- if !errors.Is(err, ErrRegionBlocked) {
- t.Fatalf("error = %v, want ErrRegionBlocked", err)
- }
- client.assertDone(t)
- }
- func TestSetNetworkAllowedForServedRegionSIM(t *testing.T) {
- client := &transcriptClient{steps: []clientStep{
- {command: `AT+CGDCONT=1,"IPV4V6","internet"`, response: okResponse()},
- {command: "AT+CGATT=1", response: okResponse()},
- {command: "AT+CGACT=1,1", response: okResponse()},
- }}
- manager, id := newStartedTestManager(t, client)
- injectSnapshot(t, manager, id, &Snapshot{DeviceID: id, IMSI: "310260123456789"})
- result, err := manager.SetNetwork(context.Background(), id, NetworkRequest{
- Enabled: true, APN: "internet", IPVersion: "IPV4V6",
- })
- if err != nil {
- t.Fatalf("enable network: %v", err)
- }
- if !result.Enabled {
- t.Fatalf("enable result = %#v", result)
- }
- client.assertDone(t)
- }
- // A device whose SIM region is not yet known (no snapshot) must not be denied:
- // only a confirmed blocked MCC blocks service (fail-open).
- func TestSetNetworkAllowedWhenSIMRegionUnknown(t *testing.T) {
- client := &transcriptClient{steps: []clientStep{
- {command: `AT+CGDCONT=1,"IPV4V6","internet"`, response: okResponse()},
- {command: "AT+CGATT=1", response: okResponse()},
- {command: "AT+CGACT=1,1", response: okResponse()},
- }}
- manager, id := newStartedTestManager(t, client)
- if _, err := manager.SetNetwork(context.Background(), id, NetworkRequest{
- Enabled: true, APN: "internet", IPVersion: "IPV4V6",
- }); err != nil {
- t.Fatalf("enable network with unknown region: %v", err)
- }
- client.assertDone(t)
- }
- func TestSendSMSBlockedForRestrictedRegionSIM(t *testing.T) {
- client := &transcriptClient{}
- manager, id := newStartedTestManager(t, client)
- injectSnapshot(t, manager, id, &Snapshot{DeviceID: id, IMSI: "460001234567890"})
- result, err := manager.SendSMS(context.Background(), id, "+15551234567", "hello")
- if !errors.Is(err, ErrRegionBlocked) {
- t.Fatalf("error = %v, want ErrRegionBlocked", err)
- }
- if result.PartsAttempted != 0 {
- t.Fatalf("PartsAttempted = %d, want 0 for a blocked region", result.PartsAttempted)
- }
- if result.SubmissionStatus != "region_blocked" {
- t.Fatalf("SubmissionStatus = %q, want region_blocked", result.SubmissionStatus)
- }
- client.assertDone(t)
- }
|