fix(gateway): close Phase 3C audit gaps
This commit is contained in:
@@ -54,6 +54,14 @@ func TestQualificationProtocolVersionIsExplicitAndImmutable(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationRecordsLinkedToolVersions(t *testing.T) {
|
||||
versions, err := qualificationToolVersions()
|
||||
if err != nil || versions["qualification"] != qualificationToolVersion ||
|
||||
versions["go"] == "" || versions["quic-go"] == "" {
|
||||
t.Fatalf("qualification tool versions = %#v, %v", versions, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationOutputAndStatisticsFailClosed(t *testing.T) {
|
||||
if err := validateQualificationOutputDir("relative/evidence"); err == nil {
|
||||
t.Fatal("relative evidence directory was accepted")
|
||||
@@ -86,15 +94,16 @@ func TestQualificationOutputAndStatisticsFailClosed(t *testing.T) {
|
||||
|
||||
func TestQualificationShortProcessingWritesRawArtifact(t *testing.T) {
|
||||
profile := qualificationMediaProfile{
|
||||
Name: "smoke", Codec: "h264", BitrateKbps: 1000,
|
||||
Duration: 200 * time.Millisecond, Warmup: time.Millisecond, PacketBytes: 100,
|
||||
Name: "smoke", Codec: "h264", BitrateKbps: 20000,
|
||||
Duration: time.Second, Warmup: time.Millisecond, PacketBytes: 1000,
|
||||
}
|
||||
rawPath := filepath.Join(t.TempDir(), "processing.csv.gz")
|
||||
summary, err := runQualificationProcessing(profile, rawPath)
|
||||
summary, err := runQualificationProcessing(t, profile, rawPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if summary.Count < 1 || summary.RawSamplesSHA256 == "" || summary.RawSamplesBytes < 1 {
|
||||
if summary.Count < 1 || summary.RawSamplesSHA256 == "" || summary.RawSamplesBytes < 1 ||
|
||||
summary.ResourceSamples < 2 || summary.RawResourcesSHA256 == "" || summary.RawResourcesBytes < 1 {
|
||||
t.Fatalf("processing summary = %#v", summary)
|
||||
}
|
||||
file, err := os.Open(rawPath)
|
||||
@@ -119,13 +128,14 @@ func TestQualificationShortProcessingWritesRawArtifact(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestQualificationProcessingPreservesPayload(t *testing.T) {
|
||||
payload := qualificationPayload(qualificationMediaProfiles()[0])
|
||||
processed, elapsed, err := processQualificationPayload(7, payload)
|
||||
profile := qualificationMediaProfiles()[0]
|
||||
payload := qualificationPayload(profile)
|
||||
trace, elapsed, err := newQualificationPath(t, profile.BitrateKbps).traverse(t, payload)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(processed, payload) {
|
||||
t.Fatal("encoded payload mutated")
|
||||
if !trace.PayloadPreserved || !trace.ApolloRecovered || !trace.VerseQUIC {
|
||||
t.Fatalf("production path trace = %#v", trace)
|
||||
}
|
||||
if elapsed <= 0 {
|
||||
t.Fatalf("processing duration = %s", elapsed)
|
||||
@@ -134,34 +144,66 @@ func TestQualificationProcessingPreservesPayload(t *testing.T) {
|
||||
|
||||
func TestQualificationImpairmentIsDeterministicAndBounded(t *testing.T) {
|
||||
profile := qualificationImpairmentProfiles()[3]
|
||||
first, err := runQualificationImpairment(profile, qualificationMediaProfiles()[0], 10_000)
|
||||
first, err := runQualificationImpairment(t, profile, qualificationMediaProfiles()[0], 1000, filepath.Join(t.TempDir(), "first.csv.gz"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
second, err := runQualificationImpairment(profile, qualificationMediaProfiles()[0], 10_000)
|
||||
second, err := runQualificationImpairment(t, profile, qualificationMediaProfiles()[0], 1000, filepath.Join(t.TempDir(), "second.csv.gz"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(first, second) {
|
||||
t.Fatalf("impairment run is not deterministic:\n%#v\n%#v", first, second)
|
||||
if first.Dropped != second.Dropped || first.InjectedReordered != second.InjectedReordered {
|
||||
t.Fatalf("deterministic impairment selection differs:\n%#v\n%#v", first, second)
|
||||
}
|
||||
if first.Sent != 10_000 || first.Delivered+first.Dropped != first.Sent ||
|
||||
first.ObservedLossPercent < 4.8 || first.ObservedLossPercent > 5.2 ||
|
||||
first.MaxQueuePackets > qualificationImpairmentQueuePackets {
|
||||
if first.Sent != 1000 || first.Delivered+first.Dropped != first.Sent ||
|
||||
first.ObservedLossPercent < 3.5 || first.ObservedLossPercent > 6.5 ||
|
||||
first.MaxQueuePackets > qualificationImpairmentQueuePackets || first.RawSamplesSHA256 == "" {
|
||||
t.Fatalf("impairment observation = %#v", first)
|
||||
}
|
||||
if _, err := runQualificationImpairment(profile, qualificationMediaProfiles()[0], qualificationImpairmentMaxPackets+1); err == nil {
|
||||
if _, err := runQualificationImpairment(t, profile, qualificationMediaProfiles()[0], qualificationImpairmentMaxPackets+1, filepath.Join(t.TempDir(), "invalid.csv.gz")); err == nil {
|
||||
t.Fatal("unbounded impairment packet count was accepted")
|
||||
}
|
||||
unknown := profile
|
||||
unknown.Name = "private-simulator"
|
||||
if _, err := runQualificationImpairment(t, unknown, qualificationMediaProfiles()[0], 1, filepath.Join(t.TempDir(), "unknown.csv.gz")); err == nil {
|
||||
t.Fatal("unregistered impairment profile was accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationSixImpairmentProfilesTraverseProductionPath(t *testing.T) {
|
||||
profiles := qualificationImpairmentProfiles()
|
||||
if len(profiles) != 6 {
|
||||
t.Fatalf("impairment profile count = %d, want exactly 6", len(profiles))
|
||||
}
|
||||
for _, profile := range profiles {
|
||||
observation, err := runQualificationImpairment(t, profile, qualificationMediaProfiles()[0], 40,
|
||||
filepath.Join(t.TempDir(), profile.Name+".csv.gz"))
|
||||
if err != nil {
|
||||
t.Fatalf("%s: %v", profile.Name, err)
|
||||
}
|
||||
if observation.Profile != profile.Name || observation.Delivered+observation.Dropped != 40 ||
|
||||
observation.RawSamplesSHA256 == "" || observation.MaxQueuePackets > qualificationImpairmentQueuePackets {
|
||||
t.Fatalf("%s observation = %#v", profile.Name, observation)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationUsesPublicQUICAndProductionPacer(t *testing.T) {
|
||||
qualificationTraverseProfiles(t, qualificationMediaProfiles())
|
||||
evidence, err := qualificationPacerEvidence()
|
||||
evidence, err := qualificationPacerEvidence(filepath.Join(t.TempDir(), "fairness.csv.gz"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(evidence.PerFlowBytes) != 8 || len(evidence.CapacitySteps) != 2 || evidence.JainIndex < 0.99 {
|
||||
if len(evidence.PerFlowBytes) != 8 || len(evidence.CapacitySteps) != 2 ||
|
||||
len(evidence.Series) != 80 || evidence.RawSamplesSHA256 == "" || evidence.JainIndex < 0.99 {
|
||||
t.Fatalf("pacer evidence = %#v", evidence)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationSmokeTraversesNativeApolloRecoveryQueuePacerAndQUIC(t *testing.T) {
|
||||
trace := qualificationProductionPathSmoke(t, qualificationMediaProfiles()[0])
|
||||
if !trace.ApolloRecovered || !trace.ProductionQueue || !trace.ProductionPacer ||
|
||||
!trace.VerseQUIC || !trace.PayloadPreserved {
|
||||
t.Fatalf("qualification production-path trace = %#v", trace)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user