1*b7c941bbSAndroid Build Coastguard Worker /* 2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*b7c941bbSAndroid Build Coastguard Worker * 4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*b7c941bbSAndroid Build Coastguard Worker * 8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*b7c941bbSAndroid Build Coastguard Worker * 10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License. 15*b7c941bbSAndroid Build Coastguard Worker */ 16*b7c941bbSAndroid Build Coastguard Worker 17*b7c941bbSAndroid Build Coastguard Worker package vogar.expect; 18*b7c941bbSAndroid Build Coastguard Worker 19*b7c941bbSAndroid Build Coastguard Worker import java.util.LinkedHashSet; 20*b7c941bbSAndroid Build Coastguard Worker import java.util.Set; 21*b7c941bbSAndroid Build Coastguard Worker import java.util.regex.Pattern; 22*b7c941bbSAndroid Build Coastguard Worker 23*b7c941bbSAndroid Build Coastguard Worker /** 24*b7c941bbSAndroid Build Coastguard Worker * The expected result of an action execution. This is typically encoded in the 25*b7c941bbSAndroid Build Coastguard Worker * expectations text file, which has the following format: 26*b7c941bbSAndroid Build Coastguard Worker * <pre> 27*b7c941bbSAndroid Build Coastguard Worker * test java.io.StreamTokenizer.Reset 28*b7c941bbSAndroid Build Coastguard Worker * result UNSUPPORTED 29*b7c941bbSAndroid Build Coastguard Worker * pattern .*should get token \[, but get -1.* 30*b7c941bbSAndroid Build Coastguard Worker * 31*b7c941bbSAndroid Build Coastguard Worker * # should we fix this? 32*b7c941bbSAndroid Build Coastguard Worker * test java.util.Arrays.CopyMethods 33*b7c941bbSAndroid Build Coastguard Worker * result COMPILE_FAILED 34*b7c941bbSAndroid Build Coastguard Worker * pattern .*cannot find symbol.* 35*b7c941bbSAndroid Build Coastguard Worker * </pre> 36*b7c941bbSAndroid Build Coastguard Worker */ 37*b7c941bbSAndroid Build Coastguard Worker public final class Expectation { 38*b7c941bbSAndroid Build Coastguard Worker 39*b7c941bbSAndroid Build Coastguard Worker /** Justification for this expectation */ 40*b7c941bbSAndroid Build Coastguard Worker private final String description; 41*b7c941bbSAndroid Build Coastguard Worker 42*b7c941bbSAndroid Build Coastguard Worker /** The action's expected result, such as {@code EXEC_FAILED}. */ 43*b7c941bbSAndroid Build Coastguard Worker private final Result result; 44*b7c941bbSAndroid Build Coastguard Worker 45*b7c941bbSAndroid Build Coastguard Worker /** The pattern the expected output will match. */ 46*b7c941bbSAndroid Build Coastguard Worker private final Pattern pattern; 47*b7c941bbSAndroid Build Coastguard Worker 48*b7c941bbSAndroid Build Coastguard Worker /** Attributes of this test. */ 49*b7c941bbSAndroid Build Coastguard Worker private final Set<String> tags; 50*b7c941bbSAndroid Build Coastguard Worker 51*b7c941bbSAndroid Build Coastguard Worker /** The tracking bug ID */ 52*b7c941bbSAndroid Build Coastguard Worker private final long bug; 53*b7c941bbSAndroid Build Coastguard Worker 54*b7c941bbSAndroid Build Coastguard Worker /** True if the identified bug still active. */ 55*b7c941bbSAndroid Build Coastguard Worker private boolean bugIsOpen = false; 56*b7c941bbSAndroid Build Coastguard Worker Expectation(Result result, Pattern pattern, Set<String> tags, String description, long bug)57*b7c941bbSAndroid Build Coastguard Worker public Expectation(Result result, Pattern pattern, Set<String> tags, String description, long bug) { 58*b7c941bbSAndroid Build Coastguard Worker if (result == null || description == null || pattern == null) { 59*b7c941bbSAndroid Build Coastguard Worker throw new IllegalArgumentException( 60*b7c941bbSAndroid Build Coastguard Worker "result=" + result + " description=" + description + " pattern=" + pattern); 61*b7c941bbSAndroid Build Coastguard Worker } 62*b7c941bbSAndroid Build Coastguard Worker 63*b7c941bbSAndroid Build Coastguard Worker this.description = description; 64*b7c941bbSAndroid Build Coastguard Worker this.result = result; 65*b7c941bbSAndroid Build Coastguard Worker this.pattern = pattern; 66*b7c941bbSAndroid Build Coastguard Worker this.tags = new LinkedHashSet<String>(tags); 67*b7c941bbSAndroid Build Coastguard Worker this.bug = bug; 68*b7c941bbSAndroid Build Coastguard Worker } 69*b7c941bbSAndroid Build Coastguard Worker getDescription()70*b7c941bbSAndroid Build Coastguard Worker public String getDescription() { 71*b7c941bbSAndroid Build Coastguard Worker return description; 72*b7c941bbSAndroid Build Coastguard Worker } 73*b7c941bbSAndroid Build Coastguard Worker getBug()74*b7c941bbSAndroid Build Coastguard Worker public long getBug() { 75*b7c941bbSAndroid Build Coastguard Worker return bug; 76*b7c941bbSAndroid Build Coastguard Worker } 77*b7c941bbSAndroid Build Coastguard Worker getResult()78*b7c941bbSAndroid Build Coastguard Worker public Result getResult() { 79*b7c941bbSAndroid Build Coastguard Worker return result; 80*b7c941bbSAndroid Build Coastguard Worker } 81*b7c941bbSAndroid Build Coastguard Worker getTags()82*b7c941bbSAndroid Build Coastguard Worker public Set<String> getTags() { 83*b7c941bbSAndroid Build Coastguard Worker return tags; 84*b7c941bbSAndroid Build Coastguard Worker } 85*b7c941bbSAndroid Build Coastguard Worker 86*b7c941bbSAndroid Build Coastguard Worker /** 87*b7c941bbSAndroid Build Coastguard Worker * Set the current status of this expectation's bug. When a bug is open, 88*b7c941bbSAndroid Build Coastguard Worker * any result (success or failure) is permitted. 89*b7c941bbSAndroid Build Coastguard Worker */ setBugIsOpen(boolean bugIsOpen)90*b7c941bbSAndroid Build Coastguard Worker public void setBugIsOpen(boolean bugIsOpen) { 91*b7c941bbSAndroid Build Coastguard Worker this.bugIsOpen = bugIsOpen; 92*b7c941bbSAndroid Build Coastguard Worker } 93*b7c941bbSAndroid Build Coastguard Worker 94*b7c941bbSAndroid Build Coastguard Worker /** 95*b7c941bbSAndroid Build Coastguard Worker * Returns true if {@code outcome} matches this expectation. 96*b7c941bbSAndroid Build Coastguard Worker */ matches(Outcome outcome)97*b7c941bbSAndroid Build Coastguard Worker public boolean matches(Outcome outcome) { 98*b7c941bbSAndroid Build Coastguard Worker return patternMatches(outcome) && (bugIsOpen || result == outcome.getResult()); 99*b7c941bbSAndroid Build Coastguard Worker } 100*b7c941bbSAndroid Build Coastguard Worker patternMatches(Outcome outcome)101*b7c941bbSAndroid Build Coastguard Worker private boolean patternMatches(Outcome outcome) { 102*b7c941bbSAndroid Build Coastguard Worker return pattern.matcher(outcome.getOutput()).matches(); 103*b7c941bbSAndroid Build Coastguard Worker } 104*b7c941bbSAndroid Build Coastguard Worker toString()105*b7c941bbSAndroid Build Coastguard Worker @Override public String toString() { 106*b7c941bbSAndroid Build Coastguard Worker return "Expectation[description=" + description + " pattern=" + pattern.pattern() + "]"; 107*b7c941bbSAndroid Build Coastguard Worker } 108*b7c941bbSAndroid Build Coastguard Worker } 109