github.com/instana/go-sensor@v1.62.2-0.20240520081010-4919868049e1/w3ctrace/context_test.go (about)

     1  // (c) Copyright IBM Corp. 2021
     2  // (c) Copyright Instana Inc. 2020
     3  
     4  package w3ctrace_test
     5  
     6  import (
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/instana/go-sensor/w3ctrace"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  const (
    16  	exampleTraceParent = "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01"
    17  	exampleTraceState  = "vendorname1=opaqueValue1 , vendorname2=opaqueValue2"
    18  )
    19  
    20  func TestNew(t *testing.T) {
    21  	p := w3ctrace.Parent{
    22  		Version:  w3ctrace.Version_Max,
    23  		TraceID:  "1234",
    24  		ParentID: "5678",
    25  	}
    26  
    27  	assert.Equal(t, w3ctrace.Context{RawParent: p.String()}, w3ctrace.New(p))
    28  }
    29  
    30  func TestExtract(t *testing.T) {
    31  	examples := map[string]struct {
    32  		ParentHeader string
    33  		StateHeader  string
    34  	}{
    35  		"lower case": {"traceparent", "tracestate"},
    36  		"upper case": {"TRACEPARENT", "TRACESTATE"},
    37  		"mixed case": {"Traceparent", "Tracestate"},
    38  	}
    39  
    40  	for name, example := range examples {
    41  		t.Run(name, func(t *testing.T) {
    42  			headers := http.Header{}
    43  			// set raw headers to preserve header name case
    44  			headers[example.ParentHeader] = []string{exampleTraceParent}
    45  			headers[example.StateHeader] = []string{exampleTraceState}
    46  
    47  			tr, err := w3ctrace.Extract(headers)
    48  			require.NoError(t, err)
    49  
    50  			assert.Equal(t, w3ctrace.Context{
    51  				RawParent: exampleTraceParent,
    52  				RawState:  exampleTraceState,
    53  			}, tr)
    54  		})
    55  	}
    56  }
    57  
    58  func TestExtract_NoContext(t *testing.T) {
    59  	headers := http.Header{}
    60  	headers.Set(w3ctrace.TraceStateHeader, exampleTraceState)
    61  
    62  	_, err := w3ctrace.Extract(headers)
    63  	assert.Equal(t, w3ctrace.ErrContextNotFound, err)
    64  }
    65  
    66  func TestInject(t *testing.T) {
    67  	examples := map[string]http.Header{
    68  		"add": {
    69  			"Authorization": []string{"Basic 123"},
    70  		},
    71  		"update": {
    72  			"Authorization": []string{"Basic 123"},
    73  			"traceparent":   []string{"00-abcdef1-01"},
    74  			"TraceState":    []string{"x=y"},
    75  		},
    76  	}
    77  
    78  	for name, headers := range examples {
    79  		t.Run(name, func(t *testing.T) {
    80  			w3ctrace.Inject(w3ctrace.Context{
    81  				RawParent: exampleTraceParent,
    82  				RawState:  exampleTraceState,
    83  			}, headers)
    84  
    85  			assert.Equal(t, "Basic 123", headers.Get("Authorization"))
    86  			assert.Equal(t, exampleTraceParent, headers.Get(w3ctrace.TraceParentHeader))
    87  			assert.Equal(t, exampleTraceState, headers.Get(w3ctrace.TraceStateHeader))
    88  		})
    89  	}
    90  }
    91  
    92  func TestContext_State(t *testing.T) {
    93  	trCtx := w3ctrace.Context{
    94  		RawParent: exampleTraceParent,
    95  		RawState:  exampleTraceState,
    96  	}
    97  
    98  	assert.Equal(t, w3ctrace.NewState([]string{"vendorname1=opaqueValue1 ", " vendorname2=opaqueValue2"}, ""), trCtx.State())
    99  }
   100  
   101  func TestContext_Parent(t *testing.T) {
   102  	trCtx := w3ctrace.Context{
   103  		RawParent: exampleTraceParent,
   104  		RawState:  exampleTraceState,
   105  	}
   106  
   107  	assert.Equal(t, w3ctrace.Parent{
   108  		Version:  w3ctrace.Version_0,
   109  		TraceID:  "0af7651916cd43dd8448eb211c80319c",
   110  		ParentID: "b7ad6b7169203331",
   111  		Flags: w3ctrace.Flags{
   112  			Sampled: true,
   113  		},
   114  	}, trCtx.Parent())
   115  }
   116  
   117  func TestContext_IsZero(t *testing.T) {
   118  	examples := map[string]struct {
   119  		Context  w3ctrace.Context
   120  		Expected bool
   121  	}{
   122  		"empty": {
   123  			Context:  w3ctrace.Context{},
   124  			Expected: true,
   125  		},
   126  		"non-empty": {
   127  			Context: w3ctrace.Context{
   128  				RawParent: "parent",
   129  				RawState:  "state",
   130  			},
   131  			Expected: false,
   132  		},
   133  		"with empty state": {
   134  			Context: w3ctrace.Context{
   135  				RawParent: "parent",
   136  			},
   137  			Expected: false,
   138  		},
   139  	}
   140  
   141  	for name, example := range examples {
   142  		t.Run(name, func(t *testing.T) {
   143  			assert.Equal(t, example.Expected, example.Context.IsZero())
   144  		})
   145  	}
   146  }