Skip to content

Commit b626ef4

Browse files
committed
Increase test coverage
1 parent 935edc6 commit b626ef4

2 files changed

Lines changed: 91 additions & 0 deletions

File tree

scraper/scraperhelper/controller_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,62 @@ func addLogsScraper(t component.Type, sc scraper.Logs) ControllerOption {
771771
return AddFactoryWithConfig(f, nil)
772772
}
773773

774+
func TestAddScraper(t *testing.T) {
775+
t.Parallel()
776+
777+
// AddScraper is deprecated but must continue to work identically to AddMetricsScraper.
778+
scp, err := scraper.NewMetrics(func(context.Context) (pmetric.Metrics, error) {
779+
return pmetric.NewMetrics(), nil
780+
})
781+
require.NoError(t, err)
782+
783+
recv, err := NewMetricsController(
784+
newTestNoDelaySettings(),
785+
receivertest.NewNopSettings(receivertest.NopType),
786+
new(consumertest.MetricsSink),
787+
AddScraper(component.MustNewType("scraper"), scp), //nolint:staticcheck
788+
)
789+
require.NoError(t, err)
790+
require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost()))
791+
require.NoError(t, recv.Shutdown(context.Background()))
792+
}
793+
794+
func TestNewLogsControllerCreateLogsError(t *testing.T) {
795+
t.Parallel()
796+
797+
createErr := errors.New("create logs failed")
798+
f := scraper.NewFactory(component.MustNewType("scraper"), nil,
799+
scraper.WithLogs(func(context.Context, scraper.Settings, component.Config) (scraper.Logs, error) {
800+
return nil, createErr
801+
}, component.StabilityLevelAlpha))
802+
803+
_, err := NewLogsController(
804+
newTestNoDelaySettings(),
805+
receivertest.NewNopSettings(receivertest.NopType),
806+
new(consumertest.LogsSink),
807+
AddFactoryWithConfig(f, nil),
808+
)
809+
require.ErrorIs(t, err, createErr)
810+
}
811+
812+
func TestNewMetricsControllerCreateMetricsError(t *testing.T) {
813+
t.Parallel()
814+
815+
createErr := errors.New("create metrics failed")
816+
f := scraper.NewFactory(component.MustNewType("scraper"), nil,
817+
scraper.WithMetrics(func(context.Context, scraper.Settings, component.Config) (scraper.Metrics, error) {
818+
return nil, createErr
819+
}, component.StabilityLevelAlpha))
820+
821+
_, err := NewMetricsController(
822+
newTestNoDelaySettings(),
823+
receivertest.NewNopSettings(receivertest.NopType),
824+
new(consumertest.MetricsSink),
825+
AddFactoryWithConfig(f, nil),
826+
)
827+
require.ErrorIs(t, err, createErr)
828+
}
829+
774830
func TestNewDefaultControllerConfig(t *testing.T) {
775831
controllerConfig := NewDefaultControllerConfig()
776832
intControllerConfig := controller.NewDefaultControllerConfig()

scraper/scraperhelper/internal/controller/controller_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717

1818
"go.opentelemetry.io/collector/component"
1919
"go.opentelemetry.io/collector/component/componenttest"
20+
"go.opentelemetry.io/collector/extension/xextension/extensionscrapercontroller"
2021
"go.opentelemetry.io/collector/receiver/receivertest"
2122
"go.opentelemetry.io/collector/scraper/scraperhelper/internal/testhelper"
2223
)
@@ -27,6 +28,17 @@ type mockScraper struct {
2728
component.ShutdownFunc
2829
}
2930

31+
// nilDeregControllerExtension returns a nil DeregisterFunc, violating the
32+
// ControllerExtension contract. Used to exercise the defensive nil guard in teardown.
33+
type nilDeregControllerExtension struct {
34+
component.StartFunc
35+
component.ShutdownFunc
36+
}
37+
38+
func (e *nilDeregControllerExtension) RegisterScraper(_ context.Context, _ extensionscrapercontroller.ScrapeFunc) (extensionscrapercontroller.DeregisterFunc, error) {
39+
return nil, nil
40+
}
41+
3042
func nopScrapeFunc(context.Context, *Controller[component.Component]) error {
3143
return nil
3244
}
@@ -334,6 +346,10 @@ func TestStartExtensionRegistersAndDeregisters(t *testing.T) {
334346

335347
require.NoError(t, ctrl.Shutdown(context.Background()))
336348
assert.True(t, mockExt.Deregistered.Load())
349+
350+
// Calling Scrape after deregistration must return nil without invoking
351+
// the scrape function (exercises the Deregistered early-exit path).
352+
require.NoError(t, mockExt.Scrape(context.Background()))
337353
}
338354

339355
func TestStartExtensionCallbackInvokesScrapeFunc(t *testing.T) {
@@ -659,6 +675,25 @@ func TestShutdownDeregisterError(t *testing.T) {
659675
assert.True(t, mockExt.Deregistered.Load())
660676
}
661677

678+
func TestTeardownNilDeregFunc(t *testing.T) {
679+
t.Parallel()
680+
681+
// An extension that returns (nil, nil) from RegisterScraper, violating
682+
// the contract. The controller must not panic when encountering a nil
683+
// DeregisterFunc in the deregFuncs slice.
684+
extID := component.MustNewID("nilext")
685+
cfg := &ControllerConfig{
686+
Controllers: []component.ID{extID},
687+
}
688+
ctrl := newTestController(t, cfg, nil)
689+
690+
host := &testhelper.MockHost{Extensions: map[component.ID]component.Component{
691+
extID: &nilDeregControllerExtension{},
692+
}}
693+
require.NoError(t, ctrl.Start(context.Background(), host))
694+
require.NoError(t, ctrl.Shutdown(context.Background()))
695+
}
696+
662697
func TestStartMultipleExtensions(t *testing.T) {
663698
t.Parallel()
664699

0 commit comments

Comments
 (0)