1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package resource_test
16
17 import (
18 "context"
19 "fmt"
20 "os"
21 "os/user"
22 "runtime"
23 "testing"
24
25 "github.com/stretchr/testify/require"
26
27 "go.opentelemetry.io/otel/sdk/resource"
28 )
29
30 var (
31 fakePID = 123
32 fakeExecutablePath = "/fake/path/mock"
33 fakeCommandArgs = []string{"mock", "-t", "30"}
34 fakeOwner = "gopher"
35 fakeRuntimeName = "gcmock"
36 fakeRuntimeVersion = "go1.2.3"
37 fakeRuntimeOS = "linux"
38 fakeRuntimeArch = "amd64"
39 )
40
41 var (
42 fakeExecutableName = "mock"
43 fakeRuntimeDescription = "go version go1.2.3 linux/amd64"
44 )
45
46 var (
47 fakePidProvider = func() int { return fakePID }
48 fakeExecutablePathProvider = func() (string, error) { return fakeExecutablePath, nil }
49 fakeCommandArgsProvider = func() []string { return fakeCommandArgs }
50 fakeOwnerProvider = func() (*user.User, error) { return &user.User{Username: fakeOwner}, nil }
51 fakeRuntimeNameProvider = func() string { return fakeRuntimeName }
52 fakeRuntimeVersionProvider = func() string { return fakeRuntimeVersion }
53 fakeRuntimeOSProvider = func() string { return fakeRuntimeOS }
54 fakeRuntimeArchProvider = func() string { return fakeRuntimeArch }
55 )
56
57 var (
58 fakeExecutablePathProviderWithError = func() (string, error) {
59 return "", fmt.Errorf("unable to get process executable")
60 }
61 fakeOwnerProviderWithError = func() (*user.User, error) {
62 return nil, fmt.Errorf("unable to get process user")
63 }
64 )
65
66 func mockProcessAttributesProviders() {
67 resource.SetOSProviders(
68 fakePidProvider,
69 fakeExecutablePathProvider,
70 fakeCommandArgsProvider,
71 )
72 resource.SetRuntimeProviders(
73 fakeRuntimeNameProvider,
74 fakeRuntimeVersionProvider,
75 fakeRuntimeOSProvider,
76 fakeRuntimeArchProvider,
77 )
78 resource.SetUserProviders(
79 fakeOwnerProvider,
80 )
81 }
82
83 func mockProcessAttributesProvidersWithErrors() {
84 resource.SetOSProviders(
85 fakePidProvider,
86 fakeExecutablePathProviderWithError,
87 fakeCommandArgsProvider,
88 )
89 resource.SetRuntimeProviders(
90 fakeRuntimeNameProvider,
91 fakeRuntimeVersionProvider,
92 fakeRuntimeOSProvider,
93 fakeRuntimeArchProvider,
94 )
95 resource.SetUserProviders(
96 fakeOwnerProviderWithError,
97 )
98 }
99
100 func restoreAttributesProviders() {
101 resource.SetDefaultOSProviders()
102 resource.SetDefaultRuntimeProviders()
103 resource.SetDefaultUserProviders()
104 resource.SetDefaultOSDescriptionProvider()
105 resource.SetDefaultContainerProviders()
106 }
107
108 func TestWithProcessFuncsErrors(t *testing.T) {
109 mockProcessAttributesProvidersWithErrors()
110
111 t.Run("WithExecutablePath", testWithProcessExecutablePathError)
112 t.Run("WithOwner", testWithProcessOwnerError)
113
114 restoreAttributesProviders()
115 }
116
117 func TestCommandArgs(t *testing.T) {
118 require.EqualValues(t, os.Args, resource.CommandArgs())
119 }
120
121 func TestRuntimeName(t *testing.T) {
122 if runtime.Compiler == "gc" {
123 require.EqualValues(t, "go", resource.RuntimeName())
124 } else {
125 require.EqualValues(t, runtime.Compiler, resource.RuntimeName())
126 }
127 }
128
129 func TestRuntimeOS(t *testing.T) {
130 require.EqualValues(t, runtime.GOOS, resource.RuntimeOS())
131 }
132
133 func TestRuntimeArch(t *testing.T) {
134 require.EqualValues(t, runtime.GOARCH, resource.RuntimeArch())
135 }
136
137 func testWithProcessExecutablePathError(t *testing.T) {
138 ctx := context.Background()
139
140 res, err := resource.New(ctx,
141 resource.WithProcessExecutablePath(),
142 )
143
144 require.Error(t, err)
145 require.EqualValues(t, map[string]string{}, toMap(res))
146 }
147
148 func testWithProcessOwnerError(t *testing.T) {
149 ctx := context.Background()
150
151 res, err := resource.New(ctx,
152 resource.WithProcessOwner(),
153 )
154
155 require.Error(t, err)
156 require.EqualValues(t, map[string]string{}, toMap(res))
157 }
158
View as plain text