1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package httptrace
6
7import (
8	"context"
9	"strings"
10	"testing"
11)
12
13func TestWithClientTrace(t *testing.T) {
14	var buf strings.Builder
15	connectStart := func(b byte) func(network, addr string) {
16		return func(network, addr string) {
17			buf.WriteByte(b)
18		}
19	}
20
21	ctx := context.Background()
22	oldtrace := &ClientTrace{
23		ConnectStart: connectStart('O'),
24	}
25	ctx = WithClientTrace(ctx, oldtrace)
26	newtrace := &ClientTrace{
27		ConnectStart: connectStart('N'),
28	}
29	ctx = WithClientTrace(ctx, newtrace)
30	trace := ContextClientTrace(ctx)
31
32	buf.Reset()
33	trace.ConnectStart("net", "addr")
34	if got, want := buf.String(), "NO"; got != want {
35		t.Errorf("got %q; want %q", got, want)
36	}
37}
38
39func TestCompose(t *testing.T) {
40	var buf strings.Builder
41	var testNum int
42
43	connectStart := func(b byte) func(network, addr string) {
44		return func(network, addr string) {
45			if addr != "addr" {
46				t.Errorf(`%d. args for %q case = %q, %q; want addr of "addr"`, testNum, b, network, addr)
47			}
48			buf.WriteByte(b)
49		}
50	}
51
52	tests := [...]struct {
53		trace, old *ClientTrace
54		want       string
55	}{
56		0: {
57			want: "T",
58			trace: &ClientTrace{
59				ConnectStart: connectStart('T'),
60			},
61		},
62		1: {
63			want: "TO",
64			trace: &ClientTrace{
65				ConnectStart: connectStart('T'),
66			},
67			old: &ClientTrace{ConnectStart: connectStart('O')},
68		},
69		2: {
70			want:  "O",
71			trace: &ClientTrace{},
72			old:   &ClientTrace{ConnectStart: connectStart('O')},
73		},
74	}
75	for i, tt := range tests {
76		testNum = i
77		buf.Reset()
78
79		tr := *tt.trace
80		tr.compose(tt.old)
81		if tr.ConnectStart != nil {
82			tr.ConnectStart("net", "addr")
83		}
84		if got := buf.String(); got != tt.want {
85			t.Errorf("%d. got = %q; want %q", i, got, tt.want)
86		}
87	}
88
89}
90