Ctrl K
ComunidadGuías…

internal/tracectx/tracectx_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package tracectx

import "testing"

// Governing: SPEC-0024 REQ "Trace Context on Create", REQ "Input Handling";
// ADR-0030.

const valid = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"

func TestParseValid(t *testing.T) {
	ctx, ok := Parse(valid)
	if !ok {
		t.Fatalf("Parse(%q) rejected a valid traceparent", valid)
	}
	if got, want := ctx.TraceHex(), "4bf92f3577b34da6a3ce929d0e0e4736"; got != want {
		t.Errorf("TraceHex = %q, want %q", got, want)
	}
	if got, want := ctx.SpanHex(), "00f067aa0ba902b7"; got != want {
		t.Errorf("SpanHex = %q, want %q", got, want)
	}
}

// The SPEC-0024 round-trip scenario, in both directions.
func TestTraceIDRoundTripsAsHex(t *testing.T) {
	ctx, ok := Parse(valid)
	if !ok {
		t.Fatal("valid traceparent rejected")
	}
	store, ok := From(ctx.TraceID[:], ctx.SpanID[:])
	if !ok {
		t.Fatal("a context's own bytes must rebuild it")
	}
	if store.TraceHex() != ctx.TraceHex() || store.SpanHex() != ctx.SpanHex() {
		t.Fatal("From did not round-trip the identifiers")
	}
}

func TestParseRejects(t *testing.T) {
	cases := []struct{ name, in string }{
		{"empty", ""},
		{"version 01", "01-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"},
		{"version ff", "ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"},
		{"uppercase trace", "00-4BF92F3577B34DA6A3CE929D0E0E4736-00f067aa0ba902b7-01"},
		{"uppercase span", "00-4bf92f3577b34da6a3ce929d0e0e4736-00F067AA0BA902B7-01"},
		{"uppercase flags", "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0F"},
		{"non hex", "00-zbf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"},
		{"zero trace", "00-00000000000000000000000000000000-00f067aa0ba902b7-01"},
		{"zero span", "00-4bf92f3577b34da6a3ce929d0e0e4736-0000000000000000-01"},
		{"short trace", "00-4bf92f3577b34da6a3ce929d0e0e473-00f067aa0ba902b7-01"},
		{"long trace", "00-4bf92f3577b34da6a3ce929d0e0e47366-00f067aa0ba902b7-01"},
		{"short span", "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b-01"},
		{"missing flags", "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7"},
		{"trailing junk", valid + "-x"},
		{"leading space", " " + valid},
		{"no separators", "004bf92f3577b34da6a3ce929d0e0e473600f067aa0ba902b701"},
		{"tracestate appended", valid + ", foo=bar"},
	}
	for _, tc := range cases {
		if _, ok := Parse(tc.in); ok {
			t.Errorf("%s: Parse(%q) accepted a value it must ignore", tc.name, tc.in)
		}
	}
}

// A traceparent that is 56 bytes or 54 must be ignored, never truncated to fit:
// SPEC-0024 bounds the header at 55 bytes and says a longer one is ignored.
func TestParseLengthBoundary(t *testing.T) {
	if Length != 55 {
		t.Fatalf("Length = %d, the wire form is 55 bytes", Length)
	}
	for _, in := range []string{valid[:54], valid + "0"} {
		if _, ok := Parse(in); ok {
			t.Errorf("Parse accepted a %d-byte value", len(in))
		}
	}
}

func TestFromRequiresExactWidths(t *testing.T) {
	if _, ok := From(make([]byte, 15), make([]byte, 8)); ok {
		t.Error("From accepted a 15-byte trace id")
	}
	if _, ok := From(make([]byte, 16), make([]byte, 9)); ok {
		t.Error("From accepted a 9-byte span id")
	}
	if _, ok := From(nil, nil); ok {
		t.Error("From accepted no bytes at all")
	}
}