xref: /aosp_15_r20/build/soong/ui/status/critical_path_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage status
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"reflect"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker	"time"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workertype testCriticalPath struct {
24*333d2b36SAndroid Build Coastguard Worker	*CriticalPath
25*333d2b36SAndroid Build Coastguard Worker	Counts
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker	actions map[int]*Action
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workertype testClock time.Time
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workerfunc (t testClock) Now() time.Time { return time.Time(t) }
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc (t *testCriticalPath) start(id int, startTime time.Duration, outputs, inputs []string) {
35*333d2b36SAndroid Build Coastguard Worker	t.clock = testClock(time.Unix(0, 0).Add(startTime))
36*333d2b36SAndroid Build Coastguard Worker	action := &Action{
37*333d2b36SAndroid Build Coastguard Worker		Description: outputs[0],
38*333d2b36SAndroid Build Coastguard Worker		Outputs:     outputs,
39*333d2b36SAndroid Build Coastguard Worker		Inputs:      inputs,
40*333d2b36SAndroid Build Coastguard Worker	}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	t.actions[id] = action
43*333d2b36SAndroid Build Coastguard Worker	t.StartAction(action)
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workerfunc (t *testCriticalPath) finish(id int, endTime time.Duration) {
47*333d2b36SAndroid Build Coastguard Worker	t.clock = testClock(time.Unix(0, 0).Add(endTime))
48*333d2b36SAndroid Build Coastguard Worker	t.FinishAction(t.actions[id])
49*333d2b36SAndroid Build Coastguard Worker}
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Workerfunc TestCriticalPath(t *testing.T) {
52*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
53*333d2b36SAndroid Build Coastguard Worker		name     string
54*333d2b36SAndroid Build Coastguard Worker		msgs     func(*testCriticalPath)
55*333d2b36SAndroid Build Coastguard Worker		want     []string
56*333d2b36SAndroid Build Coastguard Worker		wantTime time.Duration
57*333d2b36SAndroid Build Coastguard Worker	}{
58*333d2b36SAndroid Build Coastguard Worker		{
59*333d2b36SAndroid Build Coastguard Worker			name: "empty",
60*333d2b36SAndroid Build Coastguard Worker			msgs: func(cp *testCriticalPath) {},
61*333d2b36SAndroid Build Coastguard Worker		},
62*333d2b36SAndroid Build Coastguard Worker		{
63*333d2b36SAndroid Build Coastguard Worker			name: "duplicate",
64*333d2b36SAndroid Build Coastguard Worker			msgs: func(cp *testCriticalPath) {
65*333d2b36SAndroid Build Coastguard Worker				cp.start(0, 0, []string{"a"}, nil)
66*333d2b36SAndroid Build Coastguard Worker				cp.start(1, 0, []string{"a"}, nil)
67*333d2b36SAndroid Build Coastguard Worker				cp.finish(0, 1000)
68*333d2b36SAndroid Build Coastguard Worker				cp.finish(0, 2000)
69*333d2b36SAndroid Build Coastguard Worker			},
70*333d2b36SAndroid Build Coastguard Worker			want:     []string{"a"},
71*333d2b36SAndroid Build Coastguard Worker			wantTime: 1000,
72*333d2b36SAndroid Build Coastguard Worker		},
73*333d2b36SAndroid Build Coastguard Worker		{
74*333d2b36SAndroid Build Coastguard Worker			name: "linear",
75*333d2b36SAndroid Build Coastguard Worker			//  a
76*333d2b36SAndroid Build Coastguard Worker			//  |
77*333d2b36SAndroid Build Coastguard Worker			//  b
78*333d2b36SAndroid Build Coastguard Worker			//  |
79*333d2b36SAndroid Build Coastguard Worker			//  c
80*333d2b36SAndroid Build Coastguard Worker			msgs: func(cp *testCriticalPath) {
81*333d2b36SAndroid Build Coastguard Worker				cp.start(0, 0, []string{"a"}, nil)
82*333d2b36SAndroid Build Coastguard Worker				cp.finish(0, 1000)
83*333d2b36SAndroid Build Coastguard Worker				cp.start(1, 1000, []string{"b"}, []string{"a"})
84*333d2b36SAndroid Build Coastguard Worker				cp.finish(1, 2000)
85*333d2b36SAndroid Build Coastguard Worker				cp.start(2, 3000, []string{"c"}, []string{"b"})
86*333d2b36SAndroid Build Coastguard Worker				cp.finish(2, 4000)
87*333d2b36SAndroid Build Coastguard Worker			},
88*333d2b36SAndroid Build Coastguard Worker			want:     []string{"c", "b", "a"},
89*333d2b36SAndroid Build Coastguard Worker			wantTime: 3000,
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker		{
92*333d2b36SAndroid Build Coastguard Worker			name: "diamond",
93*333d2b36SAndroid Build Coastguard Worker			//  a
94*333d2b36SAndroid Build Coastguard Worker			//  |\
95*333d2b36SAndroid Build Coastguard Worker			//  b c
96*333d2b36SAndroid Build Coastguard Worker			//  |/
97*333d2b36SAndroid Build Coastguard Worker			//  d
98*333d2b36SAndroid Build Coastguard Worker			msgs: func(cp *testCriticalPath) {
99*333d2b36SAndroid Build Coastguard Worker				cp.start(0, 0, []string{"a"}, nil)
100*333d2b36SAndroid Build Coastguard Worker				cp.finish(0, 1000)
101*333d2b36SAndroid Build Coastguard Worker				cp.start(1, 1000, []string{"b"}, []string{"a"})
102*333d2b36SAndroid Build Coastguard Worker				cp.start(2, 1000, []string{"c"}, []string{"a"})
103*333d2b36SAndroid Build Coastguard Worker				cp.finish(1, 2000)
104*333d2b36SAndroid Build Coastguard Worker				cp.finish(2, 3000)
105*333d2b36SAndroid Build Coastguard Worker				cp.start(3, 3000, []string{"d"}, []string{"b", "c"})
106*333d2b36SAndroid Build Coastguard Worker				cp.finish(3, 4000)
107*333d2b36SAndroid Build Coastguard Worker			},
108*333d2b36SAndroid Build Coastguard Worker			want:     []string{"d", "c", "a"},
109*333d2b36SAndroid Build Coastguard Worker			wantTime: 4000,
110*333d2b36SAndroid Build Coastguard Worker		},
111*333d2b36SAndroid Build Coastguard Worker		{
112*333d2b36SAndroid Build Coastguard Worker			name: "multiple",
113*333d2b36SAndroid Build Coastguard Worker			//  a d
114*333d2b36SAndroid Build Coastguard Worker			//  | |
115*333d2b36SAndroid Build Coastguard Worker			//  b e
116*333d2b36SAndroid Build Coastguard Worker			//  |
117*333d2b36SAndroid Build Coastguard Worker			//  c
118*333d2b36SAndroid Build Coastguard Worker			msgs: func(cp *testCriticalPath) {
119*333d2b36SAndroid Build Coastguard Worker				cp.start(0, 0, []string{"a"}, nil)
120*333d2b36SAndroid Build Coastguard Worker				cp.start(3, 0, []string{"d"}, nil)
121*333d2b36SAndroid Build Coastguard Worker				cp.finish(0, 1000)
122*333d2b36SAndroid Build Coastguard Worker				cp.finish(3, 1000)
123*333d2b36SAndroid Build Coastguard Worker				cp.start(1, 1000, []string{"b"}, []string{"a"})
124*333d2b36SAndroid Build Coastguard Worker				cp.start(4, 1000, []string{"e"}, []string{"d"})
125*333d2b36SAndroid Build Coastguard Worker				cp.finish(1, 2000)
126*333d2b36SAndroid Build Coastguard Worker				cp.start(2, 2000, []string{"c"}, []string{"b"})
127*333d2b36SAndroid Build Coastguard Worker				cp.finish(2, 3000)
128*333d2b36SAndroid Build Coastguard Worker				cp.finish(4, 4000)
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker			},
131*333d2b36SAndroid Build Coastguard Worker			want:     []string{"e", "d"},
132*333d2b36SAndroid Build Coastguard Worker			wantTime: 4000,
133*333d2b36SAndroid Build Coastguard Worker		},
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker	for _, tt := range tests {
136*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
137*333d2b36SAndroid Build Coastguard Worker			cp := &testCriticalPath{
138*333d2b36SAndroid Build Coastguard Worker				CriticalPath: NewCriticalPath(),
139*333d2b36SAndroid Build Coastguard Worker				actions:      make(map[int]*Action),
140*333d2b36SAndroid Build Coastguard Worker			}
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker			tt.msgs(cp)
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker			criticalPath, _, _ := cp.CriticalPath.criticalPath()
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker			var descs []string
147*333d2b36SAndroid Build Coastguard Worker			for _, x := range criticalPath {
148*333d2b36SAndroid Build Coastguard Worker				descs = append(descs, x.action.Description)
149*333d2b36SAndroid Build Coastguard Worker			}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(descs, tt.want) {
152*333d2b36SAndroid Build Coastguard Worker				t.Errorf("criticalPath.criticalPath() = %v, want %v", descs, tt.want)
153*333d2b36SAndroid Build Coastguard Worker			}
154*333d2b36SAndroid Build Coastguard Worker
155*333d2b36SAndroid Build Coastguard Worker			var gotTime time.Duration
156*333d2b36SAndroid Build Coastguard Worker			if len(criticalPath) > 0 {
157*333d2b36SAndroid Build Coastguard Worker				gotTime = criticalPath[0].cumulativeDuration
158*333d2b36SAndroid Build Coastguard Worker			}
159*333d2b36SAndroid Build Coastguard Worker			if gotTime != tt.wantTime {
160*333d2b36SAndroid Build Coastguard Worker				t.Errorf("cumulativeDuration[0].cumulativeDuration = %v, want %v", gotTime, tt.wantTime)
161*333d2b36SAndroid Build Coastguard Worker			}
162*333d2b36SAndroid Build Coastguard Worker		})
163*333d2b36SAndroid Build Coastguard Worker	}
164*333d2b36SAndroid Build Coastguard Worker}
165