| // Copyright 2018 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package status |
| |
| import "testing" |
| |
| type counterOutput Counts |
| |
| func (c *counterOutput) StartAction(action *Action, counts Counts) { |
| *c = counterOutput(counts) |
| } |
| func (c *counterOutput) FinishAction(result ActionResult, counts Counts) { |
| *c = counterOutput(counts) |
| } |
| func (c counterOutput) Message(level MsgLevel, msg string) {} |
| func (c counterOutput) Flush() {} |
| |
| func (c counterOutput) Write(p []byte) (int, error) { |
| // Discard writes |
| return len(p), nil |
| } |
| |
| func (c counterOutput) Expect(t *testing.T, counts Counts) { |
| if Counts(c) == counts { |
| return |
| } |
| t.Helper() |
| |
| if c.TotalActions != counts.TotalActions { |
| t.Errorf("Expected %d total edges, but got %d", counts.TotalActions, c.TotalActions) |
| } |
| if c.RunningActions != counts.RunningActions { |
| t.Errorf("Expected %d running edges, but got %d", counts.RunningActions, c.RunningActions) |
| } |
| if c.StartedActions != counts.StartedActions { |
| t.Errorf("Expected %d started edges, but got %d", counts.StartedActions, c.StartedActions) |
| } |
| if c.FinishedActions != counts.FinishedActions { |
| t.Errorf("Expected %d finished edges, but got %d", counts.FinishedActions, c.FinishedActions) |
| } |
| } |
| |
| func TestBasicUse(t *testing.T) { |
| status := &Status{} |
| counts := &counterOutput{} |
| status.AddOutput(counts) |
| s := status.StartTool() |
| |
| s.SetTotalActions(2) |
| |
| a := &Action{} |
| s.StartAction(a) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 1, |
| StartedActions: 1, |
| FinishedActions: 0, |
| }) |
| |
| s.FinishAction(ActionResult{Action: a}) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 0, |
| StartedActions: 1, |
| FinishedActions: 1, |
| }) |
| |
| a = &Action{} |
| s.StartAction(a) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 1, |
| StartedActions: 2, |
| FinishedActions: 1, |
| }) |
| |
| s.FinishAction(ActionResult{Action: a}) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 0, |
| StartedActions: 2, |
| FinishedActions: 2, |
| }) |
| } |
| |
| // For when a tool claims to have 2 actions, but finishes after one. |
| func TestFinishEarly(t *testing.T) { |
| status := &Status{} |
| counts := &counterOutput{} |
| status.AddOutput(counts) |
| s := status.StartTool() |
| |
| s.SetTotalActions(2) |
| |
| a := &Action{} |
| s.StartAction(a) |
| s.FinishAction(ActionResult{Action: a}) |
| s.Finish() |
| |
| s = status.StartTool() |
| s.SetTotalActions(2) |
| |
| a = &Action{} |
| s.StartAction(a) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 3, |
| RunningActions: 1, |
| StartedActions: 2, |
| FinishedActions: 1, |
| }) |
| } |
| |
| // For when a tool claims to have 1 action, but starts two. |
| func TestExtraActions(t *testing.T) { |
| status := &Status{} |
| counts := &counterOutput{} |
| status.AddOutput(counts) |
| s := status.StartTool() |
| |
| s.SetTotalActions(1) |
| |
| s.StartAction(&Action{}) |
| s.StartAction(&Action{}) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 2, |
| StartedActions: 2, |
| FinishedActions: 0, |
| }) |
| } |
| |
| // When a tool calls Finish() with a running Action |
| func TestRunningWhenFinished(t *testing.T) { |
| status := &Status{} |
| counts := &counterOutput{} |
| status.AddOutput(counts) |
| |
| s := status.StartTool() |
| s.SetTotalActions(1) |
| s.StartAction(&Action{}) |
| s.Finish() |
| |
| s = status.StartTool() |
| s.SetTotalActions(1) |
| s.StartAction(&Action{}) |
| |
| counts.Expect(t, Counts{ |
| TotalActions: 2, |
| RunningActions: 2, |
| StartedActions: 2, |
| FinishedActions: 0, |
| }) |
| } |