Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/auth/bearer/bearer_test.go
5414 views
1
package bearer_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/bearer"
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.bearer
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 bearer auth has been injected
24
// into the request.
25
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26
authHeader := r.Header.Get("Authorization")
27
assert.Equal(t, "Bearer foobar", authHeader, "auth header didn't match")
28
29
w.WriteHeader(http.StatusOK)
30
}))
31
defer srv.Close()
32
33
ctx := componenttest.TestContext(t)
34
ctx, cancel := context.WithTimeout(ctx, time.Minute)
35
defer cancel()
36
37
l := util.TestLogger(t)
38
39
// Create and run our component
40
ctrl, err := componenttest.NewControllerFromID(l, "otelcol.auth.bearer")
41
require.NoError(t, err)
42
43
cfg := `
44
token = "foobar"
45
`
46
var args bearer.Arguments
47
require.NoError(t, river.Unmarshal([]byte(cfg), &args))
48
49
go func() {
50
err := ctrl.Run(ctx, args)
51
require.NoError(t, err)
52
}()
53
54
require.NoError(t, ctrl.WaitRunning(time.Second), "component never started")
55
require.NoError(t, ctrl.WaitExports(time.Second), "component never exported anything")
56
57
// Get the authentication extension from our component and use it to make a
58
// request to our test server.
59
exports := ctrl.Exports().(auth.Exports)
60
require.NotNil(t, exports.Handler.Extension, "handler extension is nil")
61
62
clientAuth, ok := exports.Handler.Extension.(configauth.ClientAuthenticator)
63
require.True(t, ok, "handler does not implement configauth.ClientAuthenticator")
64
65
rt, err := clientAuth.RoundTripper(http.DefaultTransport)
66
require.NoError(t, err)
67
cli := &http.Client{Transport: rt}
68
69
// Wait until the request finishes. We don't assert anything else here; our
70
// HTTP handler won't write the response until it ensures that the bearer
71
// auth was found.
72
req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil)
73
require.NoError(t, err)
74
resp, err := cli.Do(req)
75
require.NoError(t, err, "HTTP request failed")
76
require.Equal(t, http.StatusOK, resp.StatusCode)
77
}
78
79