Skip to content

Commit 6ca551e

Browse files
authored
[chore] Add end to end tests for type casting (#10399)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description <!-- Issue number if applicable --> Adds tests of current type casting behavior when using env and file provider. #### Link to tracking issue Relates to #9854, #8565, #9532
1 parent 05bcfc0 commit 6ca551e

File tree

7 files changed

+230
-0
lines changed

7 files changed

+230
-0
lines changed

confmap/internal/e2e/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include ../../../Makefile.Common

confmap/internal/e2e/go.mod

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module go.opentelemetry.io/collector/confmap/internal/e2e
2+
3+
go 1.21.0
4+
5+
require (
6+
github.com/stretchr/testify v1.9.0
7+
go.opentelemetry.io/collector/confmap v0.102.1
8+
go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1
9+
go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1
10+
)
11+
12+
require (
13+
github.com/davecgh/go-spew v1.1.1 // indirect
14+
github.com/go-viper/mapstructure/v2 v2.0.0 // indirect
15+
github.com/knadh/koanf/maps v0.1.1 // indirect
16+
github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
17+
github.com/knadh/koanf/v2 v2.1.1 // indirect
18+
github.com/mitchellh/copystructure v1.2.0 // indirect
19+
github.com/mitchellh/reflectwalk v1.0.2 // indirect
20+
github.com/pmezard/go-difflib v1.0.0 // indirect
21+
go.uber.org/multierr v1.11.0 // indirect
22+
go.uber.org/zap v1.27.0 // indirect
23+
gopkg.in/yaml.v3 v3.0.1 // indirect
24+
)
25+
26+
replace go.opentelemetry.io/collector/confmap => ../../
27+
28+
replace go.opentelemetry.io/collector/confmap/provider/fileprovider => ../../provider/fileprovider
29+
30+
replace go.opentelemetry.io/collector/confmap/provider/envprovider => ../../provider/envprovider

confmap/internal/e2e/go.sum

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
field: ${env:ENV}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
field: "inline field with ${env:ENV} expansion"

confmap/internal/e2e/types_test.go

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package e2etest
5+
6+
import (
7+
"context"
8+
"path/filepath"
9+
"testing"
10+
11+
"github.com/stretchr/testify/require"
12+
13+
"go.opentelemetry.io/collector/confmap"
14+
"go.opentelemetry.io/collector/confmap/provider/envprovider"
15+
"go.opentelemetry.io/collector/confmap/provider/fileprovider"
16+
)
17+
18+
type TargetField string
19+
20+
const (
21+
TargetFieldInt TargetField = "int_field"
22+
TargetFieldString TargetField = "string_field"
23+
TargetFieldBool TargetField = "bool_field"
24+
TargetFieldInlineString TargetField = "inline_string_field"
25+
)
26+
27+
type Test struct {
28+
value string
29+
targetField TargetField
30+
expected any
31+
expectedErr string
32+
}
33+
34+
type TargetConfig[T any] struct {
35+
Field T `mapstructure:"field"`
36+
}
37+
38+
func AssertExpectedMatch[T any](t *testing.T, tt Test, conf *confmap.Conf, cfg *TargetConfig[T]) {
39+
err := conf.Unmarshal(cfg)
40+
if tt.expectedErr != "" {
41+
require.ErrorContains(t, err, tt.expectedErr)
42+
return
43+
}
44+
require.NoError(t, err)
45+
require.Equal(t, tt.expected, cfg.Field)
46+
}
47+
48+
func TestTypeCasting(t *testing.T) {
49+
values := []Test{
50+
{
51+
value: "123",
52+
targetField: TargetFieldInt,
53+
expected: 123,
54+
},
55+
{
56+
value: "123",
57+
targetField: TargetFieldString,
58+
expected: "123",
59+
},
60+
{
61+
value: "123",
62+
targetField: TargetFieldInlineString,
63+
expected: "inline field with 123 expansion",
64+
},
65+
{
66+
value: "0123",
67+
targetField: TargetFieldInt,
68+
expected: 83,
69+
},
70+
{
71+
value: "0123",
72+
targetField: TargetFieldString,
73+
expected: "83",
74+
},
75+
{
76+
value: "0123",
77+
targetField: TargetFieldInlineString,
78+
expected: "inline field with 83 expansion",
79+
},
80+
{
81+
value: "0xdeadbeef",
82+
targetField: TargetFieldInt,
83+
expected: 3735928559,
84+
},
85+
{
86+
value: "0xdeadbeef",
87+
targetField: TargetFieldString,
88+
expected: "3735928559",
89+
},
90+
{
91+
value: "0xdeadbeef",
92+
targetField: TargetFieldInlineString,
93+
expected: "inline field with 3735928559 expansion",
94+
},
95+
{
96+
value: "\"0123\"",
97+
targetField: TargetFieldString,
98+
expected: "0123",
99+
},
100+
{
101+
value: "\"0123\"",
102+
targetField: TargetFieldInt,
103+
expected: 83,
104+
},
105+
{
106+
value: "\"0123\"",
107+
targetField: TargetFieldInlineString,
108+
expected: "inline field with 0123 expansion",
109+
},
110+
{
111+
value: "!!str 0123",
112+
targetField: TargetFieldString,
113+
expected: "0123",
114+
},
115+
{
116+
value: "!!str 0123",
117+
targetField: TargetFieldInlineString,
118+
expected: "inline field with 0123 expansion",
119+
},
120+
{
121+
value: "t",
122+
targetField: TargetFieldBool,
123+
expected: true,
124+
},
125+
{
126+
value: "23",
127+
targetField: TargetFieldBool,
128+
expected: true,
129+
},
130+
}
131+
132+
for _, tt := range values {
133+
t.Run(tt.value+"/"+string(tt.targetField), func(t *testing.T) {
134+
testFile := "types_expand.yaml"
135+
if tt.targetField == TargetFieldInlineString {
136+
testFile = "types_expand_inline.yaml"
137+
}
138+
139+
resolver, err := confmap.NewResolver(confmap.ResolverSettings{
140+
URIs: []string{filepath.Join("testdata", testFile)},
141+
ProviderFactories: []confmap.ProviderFactory{
142+
fileprovider.NewFactory(),
143+
envprovider.NewFactory(),
144+
},
145+
})
146+
require.NoError(t, err)
147+
t.Setenv("ENV", tt.value)
148+
149+
conf, err := resolver.Resolve(context.Background())
150+
require.NoError(t, err)
151+
152+
switch tt.targetField {
153+
case TargetFieldInt:
154+
var cfg TargetConfig[int]
155+
AssertExpectedMatch(t, tt, conf, &cfg)
156+
case TargetFieldString, TargetFieldInlineString:
157+
var cfg TargetConfig[string]
158+
AssertExpectedMatch(t, tt, conf, &cfg)
159+
case TargetFieldBool:
160+
var cfg TargetConfig[bool]
161+
AssertExpectedMatch(t, tt, conf, &cfg)
162+
default:
163+
t.Fatalf("unexpected target field %q", tt.targetField)
164+
}
165+
166+
})
167+
}
168+
}

versions.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,4 @@ excluded-modules:
6262
- go.opentelemetry.io/collector/cmd/otelcorecol
6363
- go.opentelemetry.io/collector/internal/e2e
6464
- go.opentelemetry.io/collector/internal/tools
65+
- go.opentelemetry.io/collector/confmap/internal/e2e

0 commit comments

Comments
 (0)