Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/auth/headers/headers_test.go
5333 views
1
package headers_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/headers"
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.headers
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 headers auth has been injected
24
// into the request.
25
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26
orgID := r.Header.Get("X-Scope-Org-ID")
27
assert.Equal(t, "fake", orgID, "X-Scope-Org-ID 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.headers")
41
require.NoError(t, err)
42
43
cfg := `
44
header {
45
key = "X-Scope-Org-ID"
46
value = "fake"
47
}
48
`
49
var args headers.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 headers
74
// were set.
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