Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/auth/basic/basic_test.go
4096 views
1
package basic_test
2
3
import (
4
"context"
5
"net/http"
6
"net/http/httptest"
7
"testing"
8
"time"
9
10
"github.com/grafana/agent/component/otelcol/auth"
11
"github.com/grafana/agent/component/otelcol/auth/basic"
12
"github.com/grafana/agent/pkg/flow/componenttest"
13
"github.com/grafana/agent/pkg/river"
14
"github.com/grafana/agent/pkg/util"
15
"github.com/stretchr/testify/assert"
16
"github.com/stretchr/testify/require"
17
"go.opentelemetry.io/collector/config/configauth"
18
)
19
20
// Test performs a basic integration test which runs the otelcol.auth.basic
21
// component and ensures that it can be used for authentication.
22
func Test(t *testing.T) {
23
// Create an HTTP server which will assert that basic auth has been injected
24
// into the request.
25
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26
username, password, ok := r.BasicAuth()
27
assert.True(t, ok, "no basic auth found")
28
assert.Equal(t, "foo", username, "basic auth username didn't match")
29
assert.Equal(t, "bar", password, "basic auth password didn't match")
30
31
w.WriteHeader(http.StatusOK)
32
}))
33
defer srv.Close()
34
35
ctx := componenttest.TestContext(t)
36
ctx, cancel := context.WithTimeout(ctx, time.Minute)
37
defer cancel()
38
39
l := util.TestLogger(t)
40
41
// Create and run our component
42
ctrl, err := componenttest.NewControllerFromID(l, "otelcol.auth.basic")
43
require.NoError(t, err)
44
45
cfg := `
46
username = "foo"
47
password = "bar"
48
`
49
var args basic.Arguments
50
require.NoError(t, river.Unmarshal([]byte(cfg), &args))
51
52
go func() {
53
err := ctrl.Run(ctx, args)
54
require.NoError(t, err)
55
}()
56
57
require.NoError(t, ctrl.WaitRunning(time.Second), "component never started")
58
require.NoError(t, ctrl.WaitExports(time.Second), "component never exported anything")
59
60
// Get the authentication extension from our component and use it to make a
61
// request to our test server.
62
exports := ctrl.Exports().(auth.Exports)
63
require.NotNil(t, exports.Handler.Extension, "handler extension is nil")
64
65
clientAuth, ok := exports.Handler.Extension.(configauth.ClientAuthenticator)
66
require.True(t, ok, "handler does not implement configauth.ClientAuthenticator")
67
68
rt, err := clientAuth.RoundTripper(http.DefaultTransport)
69
require.NoError(t, err)
70
cli := &http.Client{Transport: rt}
71
72
// Wait until the request finishes. We don't assert anything else here; our
73
// HTTP handler won't write the response until it ensures that the basic auth
74
// was found.
75
req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil)
76
require.NoError(t, err)
77
resp, err := cli.Do(req)
78
require.NoError(t, err, "HTTP request failed")
79
require.Equal(t, http.StatusOK, resp.StatusCode)
80
}
81
82