blob: f2cb81326e1f2405606726e7a68c7083ab14170e [file] [log] [blame]
Dan Willemsenb82471a2018-05-17 16:37:09 -07001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package status
16
17import (
18 "testing"
19)
20
21type lastOutput struct {
22 counterOutput
23
24 action *Action
25 result ActionResult
26
27 msgLevel MsgLevel
28 msg string
29}
30
31func (l *lastOutput) StartAction(a *Action, c Counts) {
32 l.action = a
33 l.counterOutput.StartAction(a, c)
34}
35func (l *lastOutput) FinishAction(r ActionResult, c Counts) {
36 l.result = r
37 l.counterOutput.FinishAction(r, c)
38}
39func (l *lastOutput) Message(level MsgLevel, msg string) {
40 l.msgLevel = level
41 l.msg = msg
42}
43func (l *lastOutput) Flush() {}
44
45func TestKatiNormalCase(t *testing.T) {
46 status := &Status{}
47 output := &lastOutput{}
48 status.AddOutput(output)
49
50 parser := &katiOutputParser{
51 st: status.StartTool(),
52 }
53
54 msg := "*kati*: verbose msg"
55 parser.parseLine(msg)
56 output.Expect(t, Counts{})
57
58 if output.msgLevel != VerboseLvl {
59 t.Errorf("Expected verbose message, but got %d", output.msgLevel)
60 }
61 if output.msg != msg {
62 t.Errorf("unexpected message contents:\nwant: %q\n got: %q\n", msg, output.msg)
63 }
64
65 parser.parseLine("out/build-aosp_arm.ninja is missing, regenerating...")
66 output.Expect(t, Counts{})
67
68 parser.parseLine("[1/1] initializing build system ...")
69 output.Expect(t, Counts{
70 TotalActions: 1,
71 RunningActions: 1,
72 StartedActions: 1,
73 FinishedActions: 0,
74 })
75
76 parser.parseLine("[2/5] including out/soong/Android-aosp_arm.mk ...")
77 output.Expect(t, Counts{
78 TotalActions: 5,
79 RunningActions: 1,
80 StartedActions: 2,
81 FinishedActions: 1,
82 })
83
84 parser.parseLine("[3/5] including a ...")
85 msg = "a random message"
86 parser.parseLine(msg)
87
88 // Start the next line to flush the previous result
89 parser.parseLine("[4/5] finishing build rules ...")
90
91 msg += "\n"
92 if output.result.Output != msg {
93 t.Errorf("output for action did not match:\nwant: %q\n got: %q\n", msg, output.result.Output)
94 }
95
96 parser.parseLine("[5/5] writing build rules ...")
97 parser.parseLine("*kati*: verbose msg")
98 parser.flushAction()
99
100 if output.result.Output != "" {
101 t.Errorf("expected no output for last action, but got %q", output.result.Output)
102 }
103
104 output.Expect(t, Counts{
105 TotalActions: 5,
106 RunningActions: 0,
107 StartedActions: 5,
108 FinishedActions: 5,
109 })
110}
111
112func TestKatiExtraIncludes(t *testing.T) {
113 status := &Status{}
114 output := &lastOutput{}
115 status.AddOutput(output)
116
117 parser := &katiOutputParser{
118 st: status.StartTool(),
119 }
120
121 parser.parseLine("[1/1] initializing build system ...")
122 parser.parseLine("[2/5] including out/soong/Android-aosp_arm.mk ...")
123 output.Expect(t, Counts{
124 TotalActions: 5,
125 RunningActions: 1,
126 StartedActions: 2,
127 FinishedActions: 1,
128 })
129
130 parser.parseLine("including a ...")
131
132 output.Expect(t, Counts{
133 TotalActions: 6,
134 RunningActions: 1,
135 StartedActions: 3,
136 FinishedActions: 2,
137 })
138
139 parser.parseLine("including b ...")
140
141 output.Expect(t, Counts{
142 TotalActions: 7,
143 RunningActions: 1,
144 StartedActions: 4,
145 FinishedActions: 3,
146 })
147
148 parser.parseLine("[3/5] finishing build rules ...")
149
150 output.Expect(t, Counts{
151 TotalActions: 7,
152 RunningActions: 1,
153 StartedActions: 5,
154 FinishedActions: 4,
155 })
156}
157
158func TestKatiFailOnError(t *testing.T) {
159 status := &Status{}
160 output := &lastOutput{}
161 status.AddOutput(output)
162
163 parser := &katiOutputParser{
164 st: status.StartTool(),
165 }
166
167 parser.parseLine("[1/1] initializing build system ...")
168 parser.parseLine("[2/5] inclduing out/soong/Android-aosp_arm.mk ...")
169 parser.parseLine("build/make/tools/Android.mk:19: error: testing")
170 parser.flushAction()
171
172 if output.result.Error == nil {
173 t.Errorf("Expected the last action to be marked as an error")
174 }
175}