1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2022 Google Inc. All Rights Reserved. 2*1fa6dee9SAndroid Build Coastguard Worker// 3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*1fa6dee9SAndroid Build Coastguard Worker// 7*1fa6dee9SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*1fa6dee9SAndroid Build Coastguard Worker// 9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License. 14*1fa6dee9SAndroid Build Coastguard Worker 15*1fa6dee9SAndroid Build Coastguard Workerpackage metrics 16*1fa6dee9SAndroid Build Coastguard Worker 17*1fa6dee9SAndroid Build Coastguard Workerimport ( 18*1fa6dee9SAndroid Build Coastguard Worker "fmt" 19*1fa6dee9SAndroid Build Coastguard Worker "reflect" 20*1fa6dee9SAndroid Build Coastguard Worker "strings" 21*1fa6dee9SAndroid Build Coastguard Worker "testing" 22*1fa6dee9SAndroid Build Coastguard Worker) 23*1fa6dee9SAndroid Build Coastguard Worker 24*1fa6dee9SAndroid Build Coastguard Workerfunc Map[A any, B any](in []A, f func(A) B) []B { 25*1fa6dee9SAndroid Build Coastguard Worker r := make([]B, len(in)) 26*1fa6dee9SAndroid Build Coastguard Worker for i, a := range in { 27*1fa6dee9SAndroid Build Coastguard Worker r[i] = f(a) 28*1fa6dee9SAndroid Build Coastguard Worker } 29*1fa6dee9SAndroid Build Coastguard Worker return r 30*1fa6dee9SAndroid Build Coastguard Worker} 31*1fa6dee9SAndroid Build Coastguard Worker 32*1fa6dee9SAndroid Build Coastguard Workerfunc TestEventNameWithDot(t *testing.T) { 33*1fa6dee9SAndroid Build Coastguard Worker defer func() { 34*1fa6dee9SAndroid Build Coastguard Worker r := fmt.Sprintf("%v", recover()) 35*1fa6dee9SAndroid Build Coastguard Worker if !strings.HasPrefix(r, "illegal event name") { 36*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("The code did not panic in the expected manner: %s", r) 37*1fa6dee9SAndroid Build Coastguard Worker } 38*1fa6dee9SAndroid Build Coastguard Worker }() 39*1fa6dee9SAndroid Build Coastguard Worker eh := EventHandler{} 40*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("a.") 41*1fa6dee9SAndroid Build Coastguard Worker} 42*1fa6dee9SAndroid Build Coastguard Worker 43*1fa6dee9SAndroid Build Coastguard Workerfunc TestEventNesting(t *testing.T) { 44*1fa6dee9SAndroid Build Coastguard Worker eh := EventHandler{} 45*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("a") 46*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("b") 47*1fa6dee9SAndroid Build Coastguard Worker eh.End("b") 48*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("c") 49*1fa6dee9SAndroid Build Coastguard Worker eh.End("c") 50*1fa6dee9SAndroid Build Coastguard Worker eh.End("a") 51*1fa6dee9SAndroid Build Coastguard Worker expected := []string{"a.b", "a.c", "a"} 52*1fa6dee9SAndroid Build Coastguard Worker actual := Map(eh.CompletedEvents(), func(e Event) string { 53*1fa6dee9SAndroid Build Coastguard Worker return e.Id 54*1fa6dee9SAndroid Build Coastguard Worker }) 55*1fa6dee9SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, actual) { 56*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected: %s actual %s", expected, actual) 57*1fa6dee9SAndroid Build Coastguard Worker } 58*1fa6dee9SAndroid Build Coastguard Worker} 59*1fa6dee9SAndroid Build Coastguard Worker 60*1fa6dee9SAndroid Build Coastguard Workerfunc TestEventOverlap(t *testing.T) { 61*1fa6dee9SAndroid Build Coastguard Worker defer func() { 62*1fa6dee9SAndroid Build Coastguard Worker r := fmt.Sprintf("%v", recover()) 63*1fa6dee9SAndroid Build Coastguard Worker if !strings.Contains(r, "unexpected scope end 'a'") { 64*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected panic but: %s", r) 65*1fa6dee9SAndroid Build Coastguard Worker } 66*1fa6dee9SAndroid Build Coastguard Worker }() 67*1fa6dee9SAndroid Build Coastguard Worker eh := EventHandler{} 68*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("a") 69*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("b") 70*1fa6dee9SAndroid Build Coastguard Worker eh.End("a") 71*1fa6dee9SAndroid Build Coastguard Worker} 72*1fa6dee9SAndroid Build Coastguard Worker 73*1fa6dee9SAndroid Build Coastguard Workerfunc TestEventDuplication(t *testing.T) { 74*1fa6dee9SAndroid Build Coastguard Worker eh := EventHandler{} 75*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("a") 76*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("b") 77*1fa6dee9SAndroid Build Coastguard Worker eh.End("b") 78*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("b") 79*1fa6dee9SAndroid Build Coastguard Worker eh.End("b") 80*1fa6dee9SAndroid Build Coastguard Worker eh.End("a") 81*1fa6dee9SAndroid Build Coastguard Worker defer func() { 82*1fa6dee9SAndroid Build Coastguard Worker r := fmt.Sprintf("%v", recover()) 83*1fa6dee9SAndroid Build Coastguard Worker if !strings.HasPrefix(r, "duplicate event") { 84*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected panic but: %s", r) 85*1fa6dee9SAndroid Build Coastguard Worker } 86*1fa6dee9SAndroid Build Coastguard Worker }() 87*1fa6dee9SAndroid Build Coastguard Worker eh.CompletedEvents() 88*1fa6dee9SAndroid Build Coastguard Worker} 89*1fa6dee9SAndroid Build Coastguard Worker 90*1fa6dee9SAndroid Build Coastguard Workerfunc TestIncompleteEvent(t *testing.T) { 91*1fa6dee9SAndroid Build Coastguard Worker eh := EventHandler{} 92*1fa6dee9SAndroid Build Coastguard Worker eh.Begin("a") 93*1fa6dee9SAndroid Build Coastguard Worker defer func() { 94*1fa6dee9SAndroid Build Coastguard Worker r := fmt.Sprintf("%v", recover()) 95*1fa6dee9SAndroid Build Coastguard Worker if !strings.HasPrefix(r, "retrieving events before all events have been closed.") { 96*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected panic but: %s", r) 97*1fa6dee9SAndroid Build Coastguard Worker } 98*1fa6dee9SAndroid Build Coastguard Worker }() 99*1fa6dee9SAndroid Build Coastguard Worker eh.CompletedEvents() 100*1fa6dee9SAndroid Build Coastguard Worker} 101