routewatch/pkg/asinfo/asinfo_test.go
sneak 585ff63fae Remove BGP keepalive logging and add peer tracking
- Created bgp_peers table to track all BGP peers
- Added PeerHandler to update peer last seen times for all message types
- Removed verbose BGP keepalive debug logging
- BGP keepalive messages now silently update peer tracking

Refactor HTML templates to use go:embed

- Created internal/templates package with embedded templates
- Moved status.html from inline const to separate file
- Templates are parsed once on startup
- Server now uses parsed template instead of raw string

Optimize AS data embedding with gzip compression

- Changed asinfo package to embed gzipped data (2.4MB vs 12MB)
- Updated Makefile to gzip AS data during update
- Added decompression during initialization
- Raw JSON file excluded from git
2025-07-27 21:54:58 +02:00

190 lines
3.6 KiB
Go

package asinfo
import (
"testing"
)
func TestGet(t *testing.T) {
tests := []struct {
name string
asn int
wantOK bool
wantDesc string
}{
{
name: "AS1 Level 3",
asn: 1,
wantOK: true,
wantDesc: "Level 3 Parent, LLC",
},
{
name: "AS15169 Google",
asn: 15169,
wantOK: true,
wantDesc: "Google LLC",
},
{
name: "Non-existent AS",
asn: 999999999,
wantOK: false,
},
{
name: "AS0 IANA Reserved",
asn: 0,
wantOK: true,
wantDesc: "Internet Assigned Numbers Authority",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
info, ok := Get(tt.asn)
if ok != tt.wantOK {
t.Errorf("Get(%d) ok = %v, want %v", tt.asn, ok, tt.wantOK)
return
}
if ok && info.Description != tt.wantDesc {
t.Errorf("Get(%d) description = %q, want %q", tt.asn, info.Description, tt.wantDesc)
}
})
}
}
func TestGetDescription(t *testing.T) {
tests := []struct {
asn int
want string
}{
{1, "Level 3 Parent, LLC"},
{999999999, ""},
}
for _, tt := range tests {
t.Run("", func(t *testing.T) {
if got := GetDescription(tt.asn); got != tt.want {
t.Errorf("GetDescription(%d) = %q, want %q", tt.asn, got, tt.want)
}
})
}
}
func TestGetHandle(t *testing.T) {
tests := []struct {
asn int
want string
}{
{1, "LVLT"},
{0, "IANA-RSVD"},
{999999999, ""},
}
for _, tt := range tests {
t.Run("", func(t *testing.T) {
if got := GetHandle(tt.asn); got != tt.want {
t.Errorf("GetHandle(%d) = %q, want %q", tt.asn, got, tt.want)
}
})
}
}
func TestTotal(t *testing.T) {
total := Total()
if total < 100000 {
t.Errorf("Total() = %d, expected > 100000", total)
}
// Verify it's consistent
if total2 := Total(); total2 != total {
t.Errorf("Total() returned different values: %d vs %d", total, total2)
}
}
func TestSearch(t *testing.T) {
tests := []struct {
name string
query string
wantMin int
}{
{
name: "Search for Google",
query: "Google",
wantMin: 1,
},
{
name: "Search for University",
query: "University",
wantMin: 10,
},
{
name: "Empty search",
query: "",
wantMin: 0,
},
{
name: "Non-existent org",
query: "XYZABC123456",
wantMin: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
results := Search(tt.query)
if len(results) < tt.wantMin {
t.Errorf("Search(%q) returned %d results, want at least %d", tt.query, len(results), tt.wantMin)
}
// Verify all results contain the query
if tt.query != "" {
for _, r := range results {
if !contains(r.Handle, tt.query) && !contains(r.Description, tt.query) {
t.Errorf("Search result ASN %d doesn't contain query %q", r.ASN, tt.query)
}
}
}
})
}
}
func TestDataIntegrity(t *testing.T) {
// Verify no duplicate ASNs
all := All()
seen := make(map[int]bool)
for _, info := range all {
if seen[info.ASN] {
t.Errorf("Duplicate ASN found: %d", info.ASN)
}
seen[info.ASN] = true
}
// Verify all entries have required fields
for _, info := range all {
if info.Handle == "" && info.ASN != 0 {
t.Errorf("ASN %d has empty handle", info.ASN)
}
if info.Description == "" {
t.Errorf("ASN %d has empty description", info.ASN)
}
}
}
func BenchmarkGet(b *testing.B) {
// Common ASNs to lookup
asns := []int{1, 15169, 13335, 32934, 8075, 16509}
b.ResetTimer()
for i := 0; i < b.N; i++ {
Get(asns[i%len(asns)])
}
}
func BenchmarkSearch(b *testing.B) {
queries := []string{"Google", "Amazon", "Microsoft", "University"}
b.ResetTimer()
for i := 0; i < b.N; i++ {
Search(queries[i%len(queries)])
}
}