// tokenstore_test.go — MemoryTokenStore 基本行為測試(AB5 範圍)。 package tunnel import ( "sync" "testing" ) func TestMemoryTokenStoreSaveLoadDelete(t *testing.T) { s := NewMemoryTokenStore() // Load 空 store 應回 ("", nil) got, err := s.Load() if err != nil { t.Fatalf("Load empty: %v", err) } if got != "" { t.Errorf("Load empty = %q, want empty", got) } // Save + Load if err := s.Save("vAs_test"); err != nil { t.Fatalf("Save: %v", err) } got, _ = s.Load() if got != "vAs_test" { t.Errorf("Load = %q, want vAs_test", got) } // 覆蓋 _ = s.Save("vAs_new") got, _ = s.Load() if got != "vAs_new" { t.Errorf("Load after overwrite = %q, want vAs_new", got) } // Save("") 等於 Delete _ = s.Save("") got, _ = s.Load() if got != "" { t.Errorf("Load after Save(\"\") = %q, want empty", got) } // Delete idempotent if err := s.Delete(); err != nil { t.Errorf("Delete empty: %v", err) } if err := s.Delete(); err != nil { t.Errorf("second Delete: %v", err) } } // TestMemoryTokenStoreConcurrent 確認 Save / Load 並發安全。 func TestMemoryTokenStoreConcurrent(t *testing.T) { s := NewMemoryTokenStore() var wg sync.WaitGroup for i := 0; i < 50; i++ { wg.Add(2) go func() { defer wg.Done() _ = s.Save("vAs_concurrent") }() go func() { defer wg.Done() _, _ = s.Load() }() } wg.Wait() }