Skip to content

Commit

Permalink
Add singleton test
Browse files Browse the repository at this point in the history
Signed-off-by: Pavol Loffay <[email protected]>
  • Loading branch information
pavolloffay committed May 28, 2020
1 parent d779848 commit c6f6cf4
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 16 deletions.
2 changes: 1 addition & 1 deletion cmd/opentelemetry-collector/app/defaults/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func Components(v *viper.Viper, enableArchiveStorage bool) config.Factories {
opts.InitFromViper(v)
return opts
}}
memoryExp := &memory.Factory{Viper: v}
memoryExp := memory.NewFactory(v)
kafkaRec := &kafkaRec.Factory{OptionsFactory: func() *ingesterApp.Options {
opts := kafkaRec.DefaultOptions()
opts.InitFromViper(v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"go.opentelemetry.io/collector/config/configmodels"

"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
storageOtelExporter "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
"github.com/jaegertracing/jaeger/plugin/storage/cassandra"
"github.com/jaegertracing/jaeger/storage"
)
Expand Down Expand Up @@ -97,7 +96,7 @@ func (f Factory) CreateTraceExporter(
if err != nil {
return nil, err
}
return storageOtelExporter.NewSpanWriterExporter(cfg, factory)
return exporter.NewSpanWriterExporter(cfg, factory)
}

// CreateMetricsExporter is not implemented.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"go.opentelemetry.io/collector/config/configmodels"

"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
storageOtelExporter "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
"github.com/jaegertracing/jaeger/plugin/storage/es"
"github.com/jaegertracing/jaeger/storage"
)
Expand Down Expand Up @@ -97,7 +96,7 @@ func (f Factory) CreateTraceExporter(
if err != nil {
return nil, err
}
return storageOtelExporter.NewSpanWriterExporter(cfg, factory)
return exporter.NewSpanWriterExporter(cfg, factory)
}

// CreateMetricsExporter is not implemented.
Expand Down
26 changes: 18 additions & 8 deletions cmd/opentelemetry-collector/app/exporter/memory/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package memory
import (
"context"
"fmt"
"sync"

"github.com/spf13/viper"
"github.com/uber/jaeger-lib/metrics"
Expand All @@ -25,7 +26,6 @@ import (
"go.opentelemetry.io/collector/config/configmodels"

"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
storageOtelExporter "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter"
"github.com/jaegertracing/jaeger/plugin/storage/memory"
"github.com/jaegertracing/jaeger/storage"
)
Expand All @@ -36,6 +36,14 @@ const TypeStr = "jaeger_memory"
// Factory is the factory for Jaeger in-memory exporter.
type Factory struct {
Viper *viper.Viper
mutex sync.Mutex
}

func NewFactory(v *viper.Viper) *Factory {
return &Factory{
Viper: v,
mutex: sync.Mutex{},
}
}

var _ component.ExporterFactory = (*Factory)(nil)
Expand All @@ -47,22 +55,24 @@ var _ exporter.FactoryCreator = (*Factory)(nil)
var instance storage.Factory

// CreateStorageFactory creates Jaeger storage factory.
func (Factory) CreateStorageFactory(params component.ExporterCreateParams, cfg configmodels.Exporter) (storage.Factory, error) {
func (f Factory) CreateStorageFactory(params component.ExporterCreateParams, cfg configmodels.Exporter) (storage.Factory, error) {
config, ok := cfg.(*Config)
if !ok {
return nil, fmt.Errorf("could not cast configuration to %s", TypeStr)
}
f.mutex.Lock()
if instance != nil {
return instance, nil
}
f := memory.NewFactory()
f.InitFromOptions(config.Options)
err := f.Initialize(metrics.NullFactory, params.Logger)
factory := memory.NewFactory()
factory.InitFromOptions(config.Options)
err := factory.Initialize(metrics.NullFactory, params.Logger)
if err != nil {
return nil, err
}
instance = f
return f, nil
instance = factory
f.mutex.Unlock()
return factory, nil
}

// Type gets the type of exporter.
Expand Down Expand Up @@ -95,7 +105,7 @@ func (f Factory) CreateTraceExporter(
if err != nil {
return nil, err
}
return storageOtelExporter.NewSpanWriterExporter(cfg, factory)
return exporter.NewSpanWriterExporter(cfg, factory)
}

// CreateMetricsExporter is not implemented.
Expand Down
38 changes: 35 additions & 3 deletions cmd/opentelemetry-collector/app/exporter/memory/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,35 +31,67 @@ import (
)

func TestCreateTraceExporter(t *testing.T) {
t.Cleanup(func() {
instance = nil
})
v, _ := jConfig.Viperize(AddFlags)
factory := &Factory{Viper: v}
factory := NewFactory(v)
exporter, err := factory.CreateTraceExporter(context.Background(), component.ExporterCreateParams{Logger: zap.NewNop()}, factory.CreateDefaultConfig())
require.NoError(t, err)
require.NotNil(t, exporter)
}

func TestCreateTraceExporter_nilConfig(t *testing.T) {
t.Cleanup(func() {
instance = nil
})
factory := &Factory{}
exporter, err := factory.CreateTraceExporter(context.Background(), component.ExporterCreateParams{}, nil)
require.Nil(t, exporter)
assert.Contains(t, err.Error(), "could not cast configuration to jaeger_memory")
}

func TestCreateMetricsExporter(t *testing.T) {
f := Factory{Viper: viper.New()}
t.Cleanup(func() {
instance = nil
})
f := NewFactory(viper.New())
mReceiver, err := f.CreateMetricsExporter(context.Background(), component.ExporterCreateParams{}, f.CreateDefaultConfig())
assert.Equal(t, err, configerror.ErrDataTypeIsNotSupported)
assert.Nil(t, mReceiver)
}

func TestCreateDefaultConfig(t *testing.T) {
factory := Factory{Viper: viper.New()}
t.Cleanup(func() {
instance = nil
})
factory := NewFactory(viper.New())
cfg := factory.CreateDefaultConfig()
assert.NotNil(t, cfg, "failed to create default config")
assert.NoError(t, configcheck.ValidateConfig(cfg))
}

func TestType(t *testing.T) {
t.Cleanup(func() {
instance = nil
})
factory := Factory{}
assert.Equal(t, configmodels.Type(TypeStr), factory.Type())
}

func TestSingleton(t *testing.T) {
t.Cleanup(func() {
instance = nil
})
f := NewFactory(viper.New())
logger := zap.NewNop()
assert.Nil(t, instance)
exp, err := f.CreateTraceExporter(context.Background(), component.ExporterCreateParams{Logger: logger}, &Config{})
require.NoError(t, err)
require.NotNil(t, exp)
previousInstance := instance
exp, err = f.CreateTraceExporter(context.Background(), component.ExporterCreateParams{Logger: logger}, &Config{})
require.NoError(t, err)
require.NotNil(t, exp)
assert.Equal(t, previousInstance, instance)
}

0 comments on commit c6f6cf4

Please sign in to comment.