| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package validator |
| |
| import ( |
| "config" |
| "testing" |
| ) |
| |
| var metricstests = []struct { |
| name string |
| o *config.MetricDefinition |
| n *config.MetricDefinition |
| isValid bool |
| }{ |
| { |
| "CompatibleChange", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| }, true, |
| }, |
| { |
| "IncompatibleChange", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| }, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 101: "A different code", |
| }, |
| }}, |
| }, |
| false, |
| }, |
| { |
| "AnotherIncompatibleChange", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| 101: "A second code", |
| 102: "A third code", |
| 103: "A fourth code", |
| }, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| 101: "A second code", |
| 103: "A fourth code", |
| }, |
| }}, |
| }, |
| false, |
| }, |
| { |
| "ChangingMaxEventCodeAllowedForNonEventOccurred", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| }, |
| MaxEventCode: 100, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| }, |
| MaxEventCode: 101, |
| }}, |
| }, |
| true, |
| }, |
| { |
| "ChangingMaxEventCodeNotAllowedEventOccurred", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_EVENT_OCCURRED, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| }, |
| MaxEventCode: 100, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_EVENT_OCCURRED, |
| MetricDimensions: []*config.MetricDefinition_MetricDimension{{ |
| EventCodes: map[uint32]string{ |
| 100: "A code", |
| }, |
| MaxEventCode: 101, |
| }}, |
| }, |
| false, |
| }, |
| { |
| "DeletingReportWithRecordedId", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_OCCURRENCE, |
| Reports: []*config.ReportDefinition{{ |
| Id: 123, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_OCCURRENCE, |
| DeletedReportIds: []uint32{123, 456}, |
| }, |
| true, |
| }, |
| { |
| "DeletingReportWithoutRecordingId", |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_OCCURRENCE, |
| Reports: []*config.ReportDefinition{{ |
| Id: 123, |
| }}, |
| }, |
| &config.MetricDefinition{ |
| MetaData: &config.MetricDefinition_Metadata{ |
| MaxReleaseStage: config.ReleaseStage_GA, |
| }, |
| MetricType: config.MetricDefinition_OCCURRENCE, |
| DeletedReportIds: []uint32{456}, |
| }, |
| false, |
| }, |
| } |
| |
| func TestCompareMetrics(t *testing.T) { |
| for _, tt := range metricstests { |
| t.Run(tt.name, func(t *testing.T) { |
| err := CompareMetrics(tt.o, tt.n, false) |
| if err != nil && tt.isValid { |
| t.Errorf("expected valid change, got %v", err) |
| } |
| if err == nil && !tt.isValid { |
| t.Errorf("expected invalid change, but was accepted") |
| } |
| |
| if err = CompareMetrics(tt.o, tt.n, true); err != nil { |
| t.Errorf("rejected change when ignoreCompatChecks=true, got %v", err) |
| } |
| |
| origMeta := tt.o.MetaData |
| tt.o.MetaData.MaxReleaseStage = config.ReleaseStage_DEBUG |
| if err = CompareMetrics(tt.o, tt.n, false); err != nil { |
| t.Errorf("rejected change when old.MetaData.MaxReleaseStage=DEBUG, got %v", err) |
| } |
| tt.o.MetaData = origMeta |
| |
| origMeta = tt.n.MetaData |
| tt.n.MetaData.MaxReleaseStage = config.ReleaseStage_DEBUG |
| if err = CompareMetrics(tt.n, tt.n, false); err != nil { |
| t.Errorf("rejected change when new.MetaData.MaxReleaseStage=DEBUG, got %v", err) |
| } |
| tt.n.MetaData = origMeta |
| }) |
| } |
| } |