mirror of
https://github.com/oneclickvirt/backtrace.git
synced 2026-07-23 11:20:13 +08:00
85 lines
3.0 KiB
Go
85 lines
3.0 KiB
Go
package backtrace
|
|
|
|
import (
|
|
"context"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseASNPrefixLinesNormalizesAndDeduplicates(t *testing.T) {
|
|
values, err := parseASNPrefixLines([]byte("2409:8000\n2409:8000\n2401:db8::/32\n"))
|
|
if err != nil || len(values) != 2 || values[0] != "2401:db8::/32" {
|
|
t.Fatalf("unexpected prefixes: %#v, %v", values, err)
|
|
}
|
|
}
|
|
|
|
func TestLoadASNPrefixRegistryUsesRawAfterCDNFailure(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
|
path := strings.TrimPrefix(request.URL.Path, "/")
|
|
parts := strings.Split(path, "/")
|
|
if len(parts) != 2 {
|
|
http.NotFound(writer, request)
|
|
return
|
|
}
|
|
base, file := parts[0], parts[1]
|
|
snapshot := []byte("2409:8000\n")
|
|
if base == "bad" && file == "as23764.txt.manifest.json" {
|
|
_, _ = writer.Write([]byte(`{}`))
|
|
return
|
|
}
|
|
if strings.HasSuffix(file, ".manifest.json") {
|
|
hash := sha256.Sum256(snapshot)
|
|
manifest, _ := json.Marshal(prefixManifest{Schema: ASNPrefixRegistrySchema, File: strings.TrimSuffix(file, ".manifest.json"), Count: 1, SHA256: hex.EncodeToString(hash[:]), GeneratedAt: "2026-01-01T00:00:00Z"})
|
|
_, _ = writer.Write(manifest)
|
|
return
|
|
}
|
|
_, _ = writer.Write(snapshot)
|
|
}))
|
|
defer server.Close()
|
|
sources := []ASNPrefixRegistrySource{{Name: "cdn", Base: server.URL + "/bad", ValidateManifest: true}, {Name: "raw", Base: server.URL + "/good", ValidateManifest: true}}
|
|
loaded, err := LoadASNPrefixRegistry(context.Background(), server.Client(), sources)
|
|
if err != nil || loaded.Source != "raw" || !loaded.Fallback || len(loaded.Prefixes) != len(knownPrefixASNs) {
|
|
t.Fatalf("unexpected load: %+v, %v", loaded, err)
|
|
}
|
|
}
|
|
|
|
func TestValidatePrefixManifestRejectsHashAndCountMismatch(t *testing.T) {
|
|
snapshot := []byte("2409:8000\n")
|
|
manifest := prefixManifest{Schema: ASNPrefixRegistrySchema, File: "as23764.txt", Count: 2, SHA256: strings.Repeat("0", 64), GeneratedAt: "2026-01-01T00:00:00Z"}
|
|
data, err := json.Marshal(manifest)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := validatePrefixManifest(data, snapshot, "as23764.txt"); err == nil {
|
|
t.Fatal("invalid manifest unexpectedly accepted")
|
|
}
|
|
}
|
|
|
|
func TestValidateEmbeddedPrefixManifests(t *testing.T) {
|
|
if err := validateEmbeddedPrefixManifests(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestEmbeddedManifestFilesArePresent(t *testing.T) {
|
|
for _, asn := range knownPrefixASNs {
|
|
name := strings.ToLower(asn) + ".txt.manifest.json"
|
|
if _, err := embeddedPrefixManifestFS.ReadFile(filepath.Join("prefix", name)); err != nil {
|
|
t.Fatalf("missing embedded manifest %s: %v", name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLoadASNPrefixRegistryEmbeddedFallback(t *testing.T) {
|
|
loaded, err := LoadASNPrefixRegistry(context.Background(), nil, nil)
|
|
if err != nil || loaded.Source != "embedded" || !loaded.Fallback || len(loaded.Prefixes) == 0 {
|
|
t.Fatalf("unexpected embedded load: %+v, %v", loaded, err)
|
|
}
|
|
}
|