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