xref: /aosp_15_r20/build/blueprint/metrics/event_handler_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
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