xref: /aosp_15_r20/build/soong/ui/status/kati_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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	"testing"
19*333d2b36SAndroid Build Coastguard Worker)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workertype lastOutput struct {
22*333d2b36SAndroid Build Coastguard Worker	counterOutput
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	action *Action
25*333d2b36SAndroid Build Coastguard Worker	result ActionResult
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker	msgLevel MsgLevel
28*333d2b36SAndroid Build Coastguard Worker	msg      string
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc (l *lastOutput) StartAction(a *Action, c Counts) {
32*333d2b36SAndroid Build Coastguard Worker	l.action = a
33*333d2b36SAndroid Build Coastguard Worker	l.counterOutput.StartAction(a, c)
34*333d2b36SAndroid Build Coastguard Worker}
35*333d2b36SAndroid Build Coastguard Workerfunc (l *lastOutput) FinishAction(r ActionResult, c Counts) {
36*333d2b36SAndroid Build Coastguard Worker	l.result = r
37*333d2b36SAndroid Build Coastguard Worker	l.counterOutput.FinishAction(r, c)
38*333d2b36SAndroid Build Coastguard Worker}
39*333d2b36SAndroid Build Coastguard Workerfunc (l *lastOutput) Message(level MsgLevel, msg string) {
40*333d2b36SAndroid Build Coastguard Worker	l.msgLevel = level
41*333d2b36SAndroid Build Coastguard Worker	l.msg = msg
42*333d2b36SAndroid Build Coastguard Worker}
43*333d2b36SAndroid Build Coastguard Workerfunc (l *lastOutput) Flush() {}
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Workerfunc TestKatiNormalCase(t *testing.T) {
46*333d2b36SAndroid Build Coastguard Worker	status := &Status{}
47*333d2b36SAndroid Build Coastguard Worker	output := &lastOutput{}
48*333d2b36SAndroid Build Coastguard Worker	status.AddOutput(output)
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	parser := &katiOutputParser{
51*333d2b36SAndroid Build Coastguard Worker		st: status.StartTool(),
52*333d2b36SAndroid Build Coastguard Worker	}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Worker	msg := "*kati*: verbose msg"
55*333d2b36SAndroid Build Coastguard Worker	parser.parseLine(msg)
56*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{})
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	if output.msgLevel != VerboseLvl {
59*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected verbose message, but got %d", output.msgLevel)
60*333d2b36SAndroid Build Coastguard Worker	}
61*333d2b36SAndroid Build Coastguard Worker	if output.msg != msg {
62*333d2b36SAndroid Build Coastguard Worker		t.Errorf("unexpected message contents:\nwant: %q\n got: %q\n", msg, output.msg)
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("out/build-aosp_arm.ninja is missing, regenerating...")
66*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{})
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[1/1] initializing legacy Make module parser ...")
69*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
70*333d2b36SAndroid Build Coastguard Worker		TotalActions:    1,
71*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
72*333d2b36SAndroid Build Coastguard Worker		StartedActions:  1,
73*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 0,
74*333d2b36SAndroid Build Coastguard Worker	})
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[2/5] including out/soong/Android-aosp_arm.mk ...")
77*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
78*333d2b36SAndroid Build Coastguard Worker		TotalActions:    5,
79*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
80*333d2b36SAndroid Build Coastguard Worker		StartedActions:  2,
81*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 1,
82*333d2b36SAndroid Build Coastguard Worker	})
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[3/5] including a ...")
85*333d2b36SAndroid Build Coastguard Worker	msg = "a random message"
86*333d2b36SAndroid Build Coastguard Worker	parser.parseLine(msg)
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	// Start the next line to flush the previous result
89*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[4/5] finishing legacy Make module parsing ...")
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	msg += "\n"
92*333d2b36SAndroid Build Coastguard Worker	if output.result.Output != msg {
93*333d2b36SAndroid Build Coastguard Worker		t.Errorf("output for action did not match:\nwant: %q\n got: %q\n", msg, output.result.Output)
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[5/5] writing legacy Make module rules ...")
97*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("*kati*: verbose msg")
98*333d2b36SAndroid Build Coastguard Worker	parser.flushAction()
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	if output.result.Output != "" {
101*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected no output for last action, but got %q", output.result.Output)
102*333d2b36SAndroid Build Coastguard Worker	}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
105*333d2b36SAndroid Build Coastguard Worker		TotalActions:    5,
106*333d2b36SAndroid Build Coastguard Worker		RunningActions:  0,
107*333d2b36SAndroid Build Coastguard Worker		StartedActions:  5,
108*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 5,
109*333d2b36SAndroid Build Coastguard Worker	})
110*333d2b36SAndroid Build Coastguard Worker}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Workerfunc TestKatiExtraIncludes(t *testing.T) {
113*333d2b36SAndroid Build Coastguard Worker	status := &Status{}
114*333d2b36SAndroid Build Coastguard Worker	output := &lastOutput{}
115*333d2b36SAndroid Build Coastguard Worker	status.AddOutput(output)
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	parser := &katiOutputParser{
118*333d2b36SAndroid Build Coastguard Worker		st: status.StartTool(),
119*333d2b36SAndroid Build Coastguard Worker	}
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[1/1] initializing legacy Make module parser ...")
122*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[2/5] including out/soong/Android-aosp_arm.mk ...")
123*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
124*333d2b36SAndroid Build Coastguard Worker		TotalActions:    5,
125*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
126*333d2b36SAndroid Build Coastguard Worker		StartedActions:  2,
127*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 1,
128*333d2b36SAndroid Build Coastguard Worker	})
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("including a ...")
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
133*333d2b36SAndroid Build Coastguard Worker		TotalActions:    6,
134*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
135*333d2b36SAndroid Build Coastguard Worker		StartedActions:  3,
136*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 2,
137*333d2b36SAndroid Build Coastguard Worker	})
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("including b ...")
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
142*333d2b36SAndroid Build Coastguard Worker		TotalActions:    7,
143*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
144*333d2b36SAndroid Build Coastguard Worker		StartedActions:  4,
145*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 3,
146*333d2b36SAndroid Build Coastguard Worker	})
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[3/5] finishing legacy Make module parsing ...")
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	output.Expect(t, Counts{
151*333d2b36SAndroid Build Coastguard Worker		TotalActions:    7,
152*333d2b36SAndroid Build Coastguard Worker		RunningActions:  1,
153*333d2b36SAndroid Build Coastguard Worker		StartedActions:  5,
154*333d2b36SAndroid Build Coastguard Worker		FinishedActions: 4,
155*333d2b36SAndroid Build Coastguard Worker	})
156*333d2b36SAndroid Build Coastguard Worker}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Workerfunc TestKatiFailOnError(t *testing.T) {
159*333d2b36SAndroid Build Coastguard Worker	status := &Status{}
160*333d2b36SAndroid Build Coastguard Worker	output := &lastOutput{}
161*333d2b36SAndroid Build Coastguard Worker	status.AddOutput(output)
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Worker	parser := &katiOutputParser{
164*333d2b36SAndroid Build Coastguard Worker		st: status.StartTool(),
165*333d2b36SAndroid Build Coastguard Worker	}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[1/1] initializing legacy Make module parser ...")
168*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("[2/5] inclduing out/soong/Android-aosp_arm.mk ...")
169*333d2b36SAndroid Build Coastguard Worker	parser.parseLine("build/make/tools/Android.mk:19: error: testing")
170*333d2b36SAndroid Build Coastguard Worker	parser.flushAction()
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker	if output.result.Error == nil {
173*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected the last action to be marked as an error")
174*333d2b36SAndroid Build Coastguard Worker	}
175*333d2b36SAndroid Build Coastguard Worker}
176