Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/integrations/mssql/sql_exporter_test.go
5330 views
1
package mssql
2
3
import (
4
"os"
5
"testing"
6
"time"
7
8
"github.com/go-kit/log"
9
"github.com/stretchr/testify/require"
10
"gopkg.in/yaml.v2"
11
)
12
13
func TestConfig_validate(t *testing.T) {
14
testCases := []struct {
15
name string
16
input Config
17
err string
18
}{
19
{
20
name: "valid config",
21
input: Config{
22
ConnectionString: "sqlserver://user:pass@localhost:1433",
23
MaxIdleConnections: 3,
24
MaxOpenConnections: 3,
25
Timeout: 10 * time.Second,
26
},
27
},
28
{
29
name: "incorrect connection_string scheme",
30
input: Config{
31
ConnectionString: "mysql://user:pass@localhost:1433",
32
MaxIdleConnections: 3,
33
MaxOpenConnections: 3,
34
Timeout: 10 * time.Second,
35
},
36
err: "scheme of provided connection_string URL must be sqlserver",
37
},
38
{
39
name: "invalid URL",
40
input: Config{
41
ConnectionString: "\u0001",
42
MaxIdleConnections: 3,
43
MaxOpenConnections: 3,
44
Timeout: 10 * time.Second,
45
},
46
err: "failed to parse connection_string",
47
},
48
{
49
name: "missing connection_string",
50
input: Config{
51
MaxIdleConnections: 3,
52
MaxOpenConnections: 3,
53
Timeout: 10 * time.Second,
54
},
55
err: "the connection_string parameter is required",
56
},
57
{
58
name: "max connections is less than 1",
59
input: Config{
60
ConnectionString: "sqlserver://user:pass@localhost:1433",
61
MaxIdleConnections: 3,
62
MaxOpenConnections: 0,
63
Timeout: 10 * time.Second,
64
},
65
err: "max_connections must be at least 1",
66
},
67
{
68
name: "max idle connections is less than 1",
69
input: Config{
70
ConnectionString: "sqlserver://user:pass@localhost:1433",
71
MaxIdleConnections: 0,
72
MaxOpenConnections: 3,
73
Timeout: 10 * time.Second,
74
},
75
err: "max_idle_connection must be at least 1",
76
},
77
{
78
name: "timeout is not positive",
79
input: Config{
80
ConnectionString: "sqlserver://user:pass@localhost:1433",
81
MaxIdleConnections: 3,
82
MaxOpenConnections: 3,
83
Timeout: 0,
84
},
85
err: "timeout must be positive",
86
},
87
}
88
89
for _, tc := range testCases {
90
t.Run(tc.name, func(t *testing.T) {
91
err := tc.input.validate()
92
if tc.err == "" {
93
require.NoError(t, err)
94
} else {
95
require.Error(t, err)
96
require.ErrorContains(t, err, tc.err)
97
}
98
})
99
}
100
}
101
func TestConfig_UnmarshalYaml(t *testing.T) {
102
t.Run("only required values", func(t *testing.T) {
103
strConfig := `connection_string: "sqlserver://user:pass@localhost:1433"`
104
105
var c Config
106
107
require.NoError(t, yaml.UnmarshalStrict([]byte(strConfig), &c))
108
109
require.Equal(t, Config{
110
ConnectionString: "sqlserver://user:pass@localhost:1433",
111
MaxIdleConnections: 3,
112
MaxOpenConnections: 3,
113
Timeout: 10 * time.Second,
114
}, c)
115
})
116
117
t.Run("all values", func(t *testing.T) {
118
strConfig := `
119
connection_string: "sqlserver://user:pass@localhost:1433"
120
max_idle_connections: 5
121
max_open_connections: 6
122
timeout: 1m
123
`
124
125
var c Config
126
127
require.NoError(t, yaml.UnmarshalStrict([]byte(strConfig), &c))
128
129
require.Equal(t, Config{
130
ConnectionString: "sqlserver://user:pass@localhost:1433",
131
MaxIdleConnections: 5,
132
MaxOpenConnections: 6,
133
Timeout: time.Minute,
134
}, c)
135
})
136
}
137
138
func TestConfig_NewIntegration(t *testing.T) {
139
t.Run("integration with valid config", func(t *testing.T) {
140
c := &Config{
141
ConnectionString: "sqlserver://user:pass@localhost:1433",
142
MaxIdleConnections: 3,
143
MaxOpenConnections: 3,
144
Timeout: 10 * time.Second,
145
}
146
147
i, err := c.NewIntegration(log.NewJSONLogger(os.Stdout))
148
require.NoError(t, err)
149
require.NotNil(t, i)
150
})
151
152
t.Run("integration with invalid config", func(t *testing.T) {
153
c := &Config{
154
ConnectionString: "mysql://user:pass@localhost:1433",
155
MaxIdleConnections: 3,
156
MaxOpenConnections: 3,
157
Timeout: 10 * time.Second,
158
}
159
160
i, err := c.NewIntegration(log.NewJSONLogger(os.Stdout))
161
require.Nil(t, i)
162
require.ErrorContains(t, err, "failed to validate config:")
163
})
164
}
165
166
func TestConfig_AgentKey(t *testing.T) {
167
t.Run("valid url", func(t *testing.T) {
168
c := Config{
169
ConnectionString: "mssql://user:pass@localhost:1433",
170
MaxIdleConnections: 3,
171
MaxOpenConnections: 3,
172
Timeout: 10 * time.Second,
173
}
174
175
ik, err := c.InstanceKey("agent-key")
176
177
require.NoError(t, err)
178
require.Equal(t, "localhost:1433", ik)
179
})
180
181
t.Run("invalid url", func(t *testing.T) {
182
c := Config{
183
ConnectionString: "\u0001",
184
MaxIdleConnections: 3,
185
MaxOpenConnections: 3,
186
Timeout: 10 * time.Second,
187
}
188
189
_, err := c.InstanceKey("agent-key")
190
191
require.Error(t, err)
192
require.ErrorContains(t, err, "failed to parse connection string URL")
193
})
194
}
195
196