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