1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package resource
16
17 import (
18 "context"
19 "fmt"
20 "testing"
21
22 "github.com/stretchr/testify/assert"
23 "github.com/stretchr/testify/require"
24
25 "go.opentelemetry.io/otel/attribute"
26 ottest "go.opentelemetry.io/otel/sdk/internal/internaltest"
27 semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
28 )
29
30 func TestDetectOnePair(t *testing.T) {
31 store, err := ottest.SetEnvVariables(map[string]string{
32 resourceAttrKey: "key=value",
33 })
34 require.NoError(t, err)
35 defer func() { require.NoError(t, store.Restore()) }()
36
37 detector := &fromEnv{}
38 res, err := detector.Detect(context.Background())
39 require.NoError(t, err)
40 assert.Equal(t, NewSchemaless(attribute.String("key", "value")), res)
41 }
42
43 func TestDetectURIEncodingOnePair(t *testing.T) {
44 store, err := ottest.SetEnvVariables(map[string]string{
45 resourceAttrKey: "key=x+y+z?q=123",
46 })
47 require.NoError(t, err)
48 defer func() { require.NoError(t, store.Restore()) }()
49
50 detector := &fromEnv{}
51 res, err := detector.Detect(context.Background())
52 require.NoError(t, err)
53 assert.Equal(t, NewSchemaless(attribute.String("key", "x+y+z?q=123")), res)
54 }
55
56 func TestDetectMultiPairs(t *testing.T) {
57 store, err := ottest.SetEnvVariables(map[string]string{
58 "x": "1",
59 resourceAttrKey: "key=value, k = v , a= x, a=z, b=c%2Fd",
60 })
61 require.NoError(t, err)
62 defer func() { require.NoError(t, store.Restore()) }()
63
64 detector := &fromEnv{}
65 res, err := detector.Detect(context.Background())
66 require.NoError(t, err)
67 assert.Equal(t, NewSchemaless(
68 attribute.String("key", "value"),
69 attribute.String("k", "v"),
70 attribute.String("a", "x"),
71 attribute.String("a", "z"),
72 attribute.String("b", "c/d"),
73 ), res)
74 }
75
76 func TestDetectURIEncodingMultiPairs(t *testing.T) {
77 store, err := ottest.SetEnvVariables(map[string]string{
78 "x": "1",
79 resourceAttrKey: "key=x+y+z,namespace=localhost/test&verify",
80 })
81 require.NoError(t, err)
82 defer func() { require.NoError(t, store.Restore()) }()
83
84 detector := &fromEnv{}
85 res, err := detector.Detect(context.Background())
86 require.NoError(t, err)
87 assert.Equal(t, NewSchemaless(
88 attribute.String("key", "x+y+z"),
89 attribute.String("namespace", "localhost/test&verify"),
90 ), res)
91 }
92
93 func TestEmpty(t *testing.T) {
94 store, err := ottest.SetEnvVariables(map[string]string{
95 resourceAttrKey: " ",
96 })
97 require.NoError(t, err)
98 defer func() { require.NoError(t, store.Restore()) }()
99
100 detector := &fromEnv{}
101 res, err := detector.Detect(context.Background())
102 require.NoError(t, err)
103 assert.Equal(t, Empty(), res)
104 }
105
106 func TestNoResourceAttributesSet(t *testing.T) {
107 store, err := ottest.SetEnvVariables(map[string]string{
108 svcNameKey: "bar",
109 })
110 require.NoError(t, err)
111 defer func() { require.NoError(t, store.Restore()) }()
112 detector := &fromEnv{}
113 res, err := detector.Detect(context.Background())
114 require.NoError(t, err)
115 assert.Equal(t, res, NewSchemaless(
116 semconv.ServiceName("bar"),
117 ))
118 }
119
120 func TestMissingKeyError(t *testing.T) {
121 store, err := ottest.SetEnvVariables(map[string]string{
122 resourceAttrKey: "key=value,key",
123 })
124 require.NoError(t, err)
125 defer func() { require.NoError(t, store.Restore()) }()
126
127 detector := &fromEnv{}
128 res, err := detector.Detect(context.Background())
129 assert.Error(t, err)
130 assert.Equal(t, err, fmt.Errorf("%w: %v", errMissingValue, "[key]"))
131 assert.Equal(t, res, NewSchemaless(
132 attribute.String("key", "value"),
133 ))
134 }
135
136 func TestInvalidPercentDecoding(t *testing.T) {
137 store, err := ottest.SetEnvVariables(map[string]string{
138 resourceAttrKey: "key=%invalid",
139 })
140 require.NoError(t, err)
141 defer func() { require.NoError(t, store.Restore()) }()
142
143 detector := &fromEnv{}
144 res, err := detector.Detect(context.Background())
145 assert.NoError(t, err)
146 assert.Equal(t, NewSchemaless(
147 attribute.String("key", "%invalid"),
148 ), res)
149 }
150
151 func TestDetectServiceNameFromEnv(t *testing.T) {
152 store, err := ottest.SetEnvVariables(map[string]string{
153 resourceAttrKey: "key=value,service.name=foo",
154 svcNameKey: "bar",
155 })
156 require.NoError(t, err)
157 defer func() { require.NoError(t, store.Restore()) }()
158
159 detector := &fromEnv{}
160 res, err := detector.Detect(context.Background())
161 require.NoError(t, err)
162 assert.Equal(t, res, NewSchemaless(
163 attribute.String("key", "value"),
164 semconv.ServiceName("bar"),
165 ))
166 }
167
View as plain text