diff --git a/.chloggen/mx-psi_seal-them-all.yaml b/.chloggen/mx-psi_seal-them-all.yaml new file mode 100644 index 00000000000..6371a8bae26 --- /dev/null +++ b/.chloggen/mx-psi_seal-them-all.yaml @@ -0,0 +1,26 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: breaking + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: extensionauthtest + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Remove the `extensionauthtest.MockClient` struct. + +# One or more tracking issues or pull requests related to the change +issues: [12567] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: | + Use the standard `extensionauth.NewClient` constructor to create a client with a specific mock implementation. Use `extensionauthtest.NewErrorClient` to create a client that always returns an error. + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [api] diff --git a/config/configgrpc/configgrpc_test.go b/config/configgrpc/configgrpc_test.go index ac598618e14..25d933e592b 100644 --- a/config/configgrpc/configgrpc_test.go +++ b/config/configgrpc/configgrpc_test.go @@ -30,7 +30,6 @@ import ( "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/extension/extensionauth" - "go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest" "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" ) @@ -41,6 +40,13 @@ func mustNewServerAuth(t *testing.T, opts ...extensionauth.ServerOption) extensi return srv } +func mustNewClientAuth(t *testing.T, opts ...extensionauth.ClientOption) extensionauth.Client { + t.Helper() + client, err := extensionauth.NewClient(opts...) + require.NoError(t, err) + return client +} + func TestNewDefaultKeepaliveClientConfig(t *testing.T) { expectedKeepaliveClientConfig := &KeepaliveClientConfig{ Time: time.Second * 10, @@ -171,7 +177,7 @@ func TestAllGrpcClientSettings(t *testing.T) { }, host: &mockHost{ ext: map[component.ID]component.Component{ - testAuthID: &extensionauthtest.MockClient{}, + testAuthID: mustNewClientAuth(t), }, }, }, @@ -200,7 +206,7 @@ func TestAllGrpcClientSettings(t *testing.T) { }, host: &mockHost{ ext: map[component.ID]component.Component{ - testAuthID: &extensionauthtest.MockClient{}, + testAuthID: mustNewClientAuth(t), }, }, }, @@ -229,7 +235,7 @@ func TestAllGrpcClientSettings(t *testing.T) { }, host: &mockHost{ ext: map[component.ID]component.Component{ - testAuthID: &extensionauthtest.MockClient{}, + testAuthID: mustNewClientAuth(t), }, }, }, diff --git a/config/configgrpc/go.mod b/config/configgrpc/go.mod index a3b51670824..c0b2f5e90cf 100644 --- a/config/configgrpc/go.mod +++ b/config/configgrpc/go.mod @@ -14,7 +14,6 @@ require ( go.opentelemetry.io/collector/config/configopaque v1.27.0 go.opentelemetry.io/collector/config/configtls v1.27.0 go.opentelemetry.io/collector/extension/extensionauth v0.121.0 - go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.121.0 go.opentelemetry.io/collector/pdata v1.27.0 go.opentelemetry.io/collector/pdata/testdata v0.121.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 @@ -80,5 +79,3 @@ replace go.opentelemetry.io/collector/component => ../../component replace go.opentelemetry.io/collector/component/componenttest => ../../component/componenttest replace go.opentelemetry.io/collector/consumer => ../../consumer - -replace go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest => ../../extension/extensionauth/extensionauthtest diff --git a/config/confighttp/confighttp_test.go b/config/confighttp/confighttp_test.go index 3b2b47cc42e..fa1442aff1e 100644 --- a/config/confighttp/confighttp_test.go +++ b/config/confighttp/confighttp_test.go @@ -34,19 +34,11 @@ import ( "go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest" ) -type customRoundTripper struct{} - -var _ http.RoundTripper = (*customRoundTripper)(nil) - -func (c *customRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { - return nil, nil -} - -func mustNewServerAuth(t *testing.T, opts ...extensionauth.ServerOption) extensionauth.Server { +func build[T any, O any](t *testing.T, builder func(...O) (T, error), opts ...O) T { t.Helper() - srv, err := extensionauth.NewServer(opts...) + obj, err := builder(opts...) require.NoError(t, err) - return srv + return obj } var ( @@ -61,7 +53,7 @@ var ( func TestAllHTTPClientSettings(t *testing.T) { host := &mockHost{ ext: map[component.ID]component.Component{ - testAuthID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + testAuthID: build(t, extensionauth.NewClient), }, } @@ -187,7 +179,7 @@ func TestAllHTTPClientSettings(t *testing.T) { func TestPartialHTTPClientSettings(t *testing.T) { host := &mockHost{ ext: map[component.ID]component.Component{ - testAuthID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + testAuthID: build(t, extensionauth.NewClient), }, } @@ -339,7 +331,20 @@ func TestHTTPClientSettingsError(t *testing.T) { } } +var _ http.RoundTripper = &customRoundTripper{} + +type customRoundTripper struct{} + +func (c *customRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { + return nil, nil +} + func TestHTTPClientSettingWithAuthConfig(t *testing.T) { + customRoundTripperOpt := extensionauth.WithClientRoundTripper( + func(http.RoundTripper) (http.RoundTripper, error) { + return &customRoundTripper{}, nil + }) + tests := []struct { name string shouldErr bool @@ -355,9 +360,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: false, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ - ResultRoundTripper: &customRoundTripper{}, - }, + mockID: build(t, extensionauth.NewClient), }, }, }, @@ -370,7 +373,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: true, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + mockID: build(t, extensionauth.NewClient), }, }, }, @@ -392,7 +395,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: false, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + mockID: build(t, extensionauth.NewClient, customRoundTripperOpt), }, }, }, @@ -406,7 +409,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: false, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + mockID: build(t, extensionauth.NewClient, customRoundTripperOpt), }, }, }, @@ -420,7 +423,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: false, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ResultRoundTripper: &customRoundTripper{}}, + mockID: build(t, extensionauth.NewClient, customRoundTripperOpt), }, }, }, @@ -433,9 +436,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) { shouldErr: true, host: &mockHost{ ext: map[component.ID]component.Component{ - mockID: &extensionauthtest.MockClient{ - ResultRoundTripper: &customRoundTripper{}, MustError: true, - }, + mockID: build(t, extensionauthtest.NewErrorClient), }, }, }, @@ -832,7 +833,7 @@ func TestHttpCorsWithSettings(t *testing.T) { host := &mockHost{ ext: map[component.ID]component.Component{ - mockID: mustNewServerAuth(t, + mockID: build(t, extensionauth.NewServer, extensionauth.WithServerAuthenticate(func(ctx context.Context, _ map[string][]string) (context.Context, error) { return ctx, errors.New("Settings failed") }), @@ -1144,7 +1145,7 @@ func TestServerAuth(t *testing.T) { host := &mockHost{ ext: map[component.ID]component.Component{ - mockID: mustNewServerAuth(t, + mockID: build(t, extensionauth.NewServer, extensionauth.WithServerAuthenticate(func(ctx context.Context, _ map[string][]string) (context.Context, error) { authCalled = true return ctx, nil @@ -1195,7 +1196,7 @@ func TestFailedServerAuth(t *testing.T) { } host := &mockHost{ ext: map[component.ID]component.Component{ - mockID: mustNewServerAuth(t, + mockID: build(t, extensionauth.NewServer, extensionauth.WithServerAuthenticate(func(ctx context.Context, _ map[string][]string) (context.Context, error) { return ctx, errors.New("Settings failed") }), @@ -1376,7 +1377,7 @@ func TestAuthWithQueryParams(t *testing.T) { host := &mockHost{ ext: map[component.ID]component.Component{ - mockID: mustNewServerAuth(t, + mockID: build(t, extensionauth.NewServer, extensionauth.WithServerAuthenticate(func(ctx context.Context, sources map[string][]string) (context.Context, error) { require.Len(t, sources, 1) assert.Equal(t, "1", sources["auth"][0]) diff --git a/exporter/otlpexporter/go.mod b/exporter/otlpexporter/go.mod index f7a4cd8ae56..59cec3d2c69 100644 --- a/exporter/otlpexporter/go.mod +++ b/exporter/otlpexporter/go.mod @@ -152,8 +152,6 @@ replace go.opentelemetry.io/collector/exporter/exportertest => ../exportertest replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension/extensiontest -replace go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest => ../../extension/extensionauth/extensionauthtest - replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension diff --git a/extension/extensionauth/extensionauthtest/error_client.go b/extension/extensionauth/extensionauthtest/error_client.go new file mode 100644 index 00000000000..6237453f162 --- /dev/null +++ b/extension/extensionauth/extensionauthtest/error_client.go @@ -0,0 +1,28 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package extensionauthtest // import "go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest" + +import ( + "errors" + "net/http" + + "google.golang.org/grpc/credentials" + + "go.opentelemetry.io/collector/extension/extensionauth" +) + +var errMockError = errors.New("mock Error") + +// NewErrorClient returns a new extensionauth.Client that always returns an error on any of the client methods. +func NewErrorClient(opts ...extensionauth.ClientOption) (extensionauth.Client, error) { + errorOpts := []extensionauth.ClientOption{ + extensionauth.WithClientRoundTripper(func(http.RoundTripper) (http.RoundTripper, error) { + return nil, errMockError + }), + extensionauth.WithClientPerRPCCredentials(func() (credentials.PerRPCCredentials, error) { + return nil, errMockError + }), + } + return extensionauth.NewClient(append(errorOpts, opts...)...) +} diff --git a/extension/extensionauth/extensionauthtest/error_client_test.go b/extension/extensionauth/extensionauthtest/error_client_test.go new file mode 100644 index 00000000000..a688d08e5f1 --- /dev/null +++ b/extension/extensionauth/extensionauthtest/error_client_test.go @@ -0,0 +1,21 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package extensionauthtest + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestErrorClient(t *testing.T) { + client, err := NewErrorClient() + require.NoError(t, err) + + _, err = client.RoundTripper(nil) + require.Error(t, err) + + _, err = client.PerRPCCredentials() + require.Error(t, err) +} diff --git a/extension/extensionauth/extensionauthtest/go.mod b/extension/extensionauth/extensionauthtest/go.mod index 629f9930e34..7232d269ee6 100644 --- a/extension/extensionauth/extensionauthtest/go.mod +++ b/extension/extensionauth/extensionauthtest/go.mod @@ -4,7 +4,6 @@ go 1.23.0 require ( github.com/stretchr/testify v1.10.0 - go.opentelemetry.io/collector/component v1.27.0 go.opentelemetry.io/collector/extension/extensionauth v0.121.0 go.uber.org/goleak v1.3.0 google.golang.org/grpc v1.71.0 @@ -14,6 +13,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/collector/component v1.27.0 // indirect go.opentelemetry.io/collector/extension v1.27.0 // indirect go.opentelemetry.io/collector/pdata v1.27.0 // indirect go.opentelemetry.io/otel v1.34.0 // indirect diff --git a/extension/extensionauth/extensionauthtest/mock_clientauth.go b/extension/extensionauth/extensionauthtest/mock_clientauth.go deleted file mode 100644 index 0c9bec48b20..00000000000 --- a/extension/extensionauth/extensionauthtest/mock_clientauth.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package extensionauthtest // import "go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest" - -import ( - "context" - "errors" - "net/http" - - "google.golang.org/grpc/credentials" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/extension/extensionauth" -) - -var ( - _ extensionauth.Client = (*MockClient)(nil) - errMockError = errors.New("mock Error") -) - -// MockClient provides a mock implementation of GRPCClient and HTTPClient interfaces -type MockClient struct { - ResultRoundTripper http.RoundTripper - ResultPerRPCCredentials credentials.PerRPCCredentials - MustError bool -} - -// Start for the MockClient does nothing -func (m *MockClient) Start(context.Context, component.Host) error { - return nil -} - -// Shutdown for the MockClient does nothing -func (m *MockClient) Shutdown(context.Context) error { - return nil -} - -// RoundTripper for the MockClient either returns error if the mock authenticator is forced to or -// returns the supplied resultRoundTripper. -func (m *MockClient) RoundTripper(http.RoundTripper) (http.RoundTripper, error) { - if m.MustError { - return nil, errMockError - } - return m.ResultRoundTripper, nil -} - -// PerRPCCredentials for the MockClient either returns error if the mock authenticator is forced to or -// returns the supplied resultPerRPCCredentials. -func (m *MockClient) PerRPCCredentials() (credentials.PerRPCCredentials, error) { - if m.MustError { - return nil, errMockError - } - return m.ResultPerRPCCredentials, nil -} diff --git a/extension/extensionauth/extensionauthtest/mock_clientauth_test.go b/extension/extensionauth/extensionauthtest/mock_clientauth_test.go deleted file mode 100644 index 2882bc97257..00000000000 --- a/extension/extensionauth/extensionauthtest/mock_clientauth_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package extensionauthtest - -import ( - "context" - "net/http" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/grpc/credentials" -) - -func TestNilStartAndShutdown(t *testing.T) { - // prepare - m := &MockClient{} - - // test and verify - origCtx := context.Background() - - err := m.Start(origCtx, nil) - require.NoError(t, err) - - err = m.Shutdown(origCtx) - assert.NoError(t, err) -} - -type customRoundTripper struct{} - -func (c *customRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { - return nil, nil -} - -func TestMockRoundTripper(t *testing.T) { - testcases := []struct { - name string - expectedErr bool - clientAuth MockClient - }{ - { - name: "no_error", - expectedErr: false, - clientAuth: MockClient{ - ResultRoundTripper: &customRoundTripper{}, - MustError: false, - }, - }, - { - name: "error", - expectedErr: true, - clientAuth: MockClient{ - ResultRoundTripper: &customRoundTripper{}, - MustError: true, - }, - }, - } - - for _, tt := range testcases { - t.Run(tt.name, func(t *testing.T) { - tripper, err := tt.clientAuth.RoundTripper(nil) - if tt.expectedErr { - assert.Error(t, err) - return - } - assert.NotNil(t, tripper) - require.NoError(t, err) - // check if the resultant tripper is indeed the one provided - _, ok := tripper.(*customRoundTripper) - assert.True(t, ok) - }) - } -} - -type customPerRPCCredentials struct{} - -var _ credentials.PerRPCCredentials = (*customPerRPCCredentials)(nil) - -func (c *customPerRPCCredentials) GetRequestMetadata(context.Context, ...string) (map[string]string, error) { - return nil, nil -} - -func (c *customPerRPCCredentials) RequireTransportSecurity() bool { - return true -} - -func TestMockPerRPCCredential(t *testing.T) { - testcases := []struct { - name string - expectedErr bool - clientAuth MockClient - }{ - { - name: "no_error", - expectedErr: false, - clientAuth: MockClient{ - ResultPerRPCCredentials: &customPerRPCCredentials{}, - MustError: false, - }, - }, - { - name: "error", - expectedErr: true, - clientAuth: MockClient{ - ResultPerRPCCredentials: &customPerRPCCredentials{}, - MustError: true, - }, - }, - } - - for _, tt := range testcases { - t.Run(tt.name, func(t *testing.T) { - credential, err := tt.clientAuth.PerRPCCredentials() - if err != nil { - return - } - if tt.expectedErr { - assert.Error(t, err) - return - } - assert.NotNil(t, credential) - require.NoError(t, err) - // check if the resultant tripper is indeed the one provided - _, ok := credential.(*customPerRPCCredentials) - assert.True(t, ok) - }) - } -}