github.com/Financial-Times/publish-availability-monitor@v1.12.0/metrics/aggregator_test.go (about)

     1  package metrics
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  
     7  	"github.com/Financial-Times/go-logger/v2"
     8  	"github.com/Financial-Times/publish-availability-monitor/config"
     9  )
    10  
    11  func TestAggregatorRun(t *testing.T) {
    12  	tests := map[string]struct {
    13  		Metric                         PublishMetric
    14  		ExpectedPublishMetricsCount    int
    15  		ExpectedCapabilityMetricsCount int
    16  	}{
    17  		"regular metric should be sent only to publish metric destinations": {
    18  			Metric: PublishMetric{
    19  				Capability: nil,
    20  			},
    21  			ExpectedPublishMetricsCount:    1,
    22  			ExpectedCapabilityMetricsCount: 0,
    23  		},
    24  		"capability metric should be sent only to capability destinations": {
    25  			Metric: PublishMetric{
    26  				Capability: &config.Capability{
    27  					Name: "test-capability",
    28  				},
    29  			},
    30  			ExpectedPublishMetricsCount:    0,
    31  			ExpectedCapabilityMetricsCount: 1,
    32  		},
    33  	}
    34  
    35  	log := logger.NewUPPLogger("test", "PANIC")
    36  	for name, test := range tests {
    37  		t.Run(name, func(t *testing.T) {
    38  			var wg sync.WaitGroup
    39  			wg.Add(test.ExpectedPublishMetricsCount + test.ExpectedCapabilityMetricsCount)
    40  
    41  			var metricsCh = make(chan PublishMetric)
    42  			publishMetricDestination := &mockDestination{waitGroup: &wg}
    43  			capabilityMetricDestination := &mockDestination{waitGroup: &wg}
    44  
    45  			aggregator := NewAggregator(metricsCh,
    46  				[]Destination{publishMetricDestination},
    47  				[]Destination{capabilityMetricDestination},
    48  				log)
    49  
    50  			go aggregator.Run()
    51  			metricsCh <- test.Metric
    52  			wg.Wait()
    53  
    54  			if len(publishMetricDestination.metrics) != test.ExpectedPublishMetricsCount {
    55  				t.Fatalf("expected %v publish metrics, got %v", test.ExpectedPublishMetricsCount, len(publishMetricDestination.metrics))
    56  			}
    57  
    58  			if len(capabilityMetricDestination.metrics) != test.ExpectedCapabilityMetricsCount {
    59  				t.Fatalf("expected %v capability metrics, got %v", test.ExpectedCapabilityMetricsCount, len(capabilityMetricDestination.metrics))
    60  			}
    61  		})
    62  	}
    63  }
    64  
    65  type mockDestination struct {
    66  	metrics   []PublishMetric
    67  	waitGroup *sync.WaitGroup
    68  }
    69  
    70  func (md *mockDestination) Send(pm PublishMetric) {
    71  	defer md.waitGroup.Done()
    72  	md.metrics = append(md.metrics, pm)
    73  }