backtrace/bgptools/origin_test.go

59 lines
1.9 KiB
Go

package bgptools
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestResolveOriginASNOfflineFixture(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if got := r.URL.Query().Get("resource"); got != "192.0.2.1" {
t.Errorf("resource = %q", got)
}
_, _ = w.Write([]byte(`{"status":"ok","data":{"asns":["AS64500",64501],"prefix":"192.0.2.0/24"}}`))
}))
defer server.Close()
asn, err := ResolveOriginASNWithConfig(context.Background(), "192.0.2.1", OriginASNConfig{
Client: server.Client(), BaseURL: server.URL, Timeout: time.Second,
})
if err != nil || asn != "64500" {
t.Fatalf("ResolveOriginASNWithConfig() = %q, %v", asn, err)
}
}
func TestResolveOriginASNRejectsMissingAndDriftedData(t *testing.T) {
for _, payload := range []string{
`{"status":"ok","data":{"asns":[]}}`,
`{"status":"ok","data":{"asns":"64500"}}`,
`{"status":"ok","data":{"asns":["not-an-asn"]}}`,
`{"status":"error","data":{"asns":[64500]}}`,
} {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write([]byte(payload))
}))
_, err := ResolveOriginASNWithConfig(context.Background(), "2001:db8::1", OriginASNConfig{
Client: server.Client(), BaseURL: server.URL, Timeout: time.Second,
})
server.Close()
if err == nil {
t.Fatalf("payload %s unexpectedly succeeded", payload)
}
}
}
func TestResolveOriginASNReportsRateLimit(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusTooManyRequests)
}))
defer server.Close()
_, err := ResolveOriginASNWithConfig(context.Background(), "192.0.2.1", OriginASNConfig{Client: server.Client(), BaseURL: server.URL})
if !errors.Is(err, ErrOriginASNRateLimited) {
t.Fatalf("rate limit error = %v", err)
}
}