blob: 78c02f8de2760fcd8db028b1c1dbda3c72c2736e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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 org.apache.accumulo.iteratortest;
import static java.util.Objects.requireNonNull;
import java.util.Collections;
import java.util.SortedMap;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.iteratortest.testcases.IteratorTestCase;
/**
* The expected results from invoking a {@link IteratorTestCase} on a {@link IteratorTestInput}. The
* output will be either a {@link SortedMap} of Keys and Values or an exception but never both. If
* one of these members is null, the other is guaranteed to be non-null.
*/
public class IteratorTestOutput {
/**
* An outcome about what happened during a test case.
*/
public enum TestOutcome {
/**
* The IteratorTestCase proactively passed.
*/
PASSED,
/**
* The IteratorTestCase proactively failed.
*/
FAILED,
/**
* The IteratorTestCase completed, but the pass/fail should be determined by the other context.
*/
COMPLETED
}
private final SortedMap<Key,Value> output;
private final Exception exception;
private final TestOutcome outcome;
public IteratorTestOutput(TestOutcome outcome) {
this.outcome = outcome;
if (outcome == TestOutcome.COMPLETED) {
throw new IllegalArgumentException("This constructor is only for use with PASSED and FAILED");
}
output = null;
exception = null;
}
/**
* Create an instance of the class.
*
* @param output
* The sorted collection of Key-Value pairs generated by an Iterator.
*/
public IteratorTestOutput(SortedMap<Key,Value> output) {
this.output = Collections.unmodifiableSortedMap(requireNonNull(output));
this.exception = null;
this.outcome = TestOutcome.COMPLETED;
}
public IteratorTestOutput(Exception e) {
this.output = null;
this.exception = requireNonNull(e);
this.outcome = TestOutcome.FAILED;
}
/**
* @return The outcome of the test.
*/
public TestOutcome getTestOutcome() {
return outcome;
}
/**
* Returns the output from the iterator.
*
* @return The sorted Key-Value pairs from an iterator, null if an exception was thrown.
*/
public SortedMap<Key,Value> getOutput() {
return output;
}
/**
* @return True if there is output, false if the output is null.
*/
public boolean hasOutput() {
return output != null;
}
/**
* Returns the exception thrown by the iterator.
*
* @return The exception thrown by the iterator, null if no exception was thrown.
*/
public Exception getException() {
return exception;
}
/**
* @return True if there is an exception, null if the iterator successfully generated Key-Value
* pairs.
*/
public boolean hasException() {
return exception != null;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((exception == null) ? 0 : exception.hashCode());
result = prime * result + ((outcome == null) ? 0 : outcome.hashCode());
result = prime * result + ((output == null) ? 0 : output.hashCode());
return result;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof IteratorTestOutput)) {
return false;
}
IteratorTestOutput other = (IteratorTestOutput) o;
if (outcome != other.outcome) {
return false;
}
if (hasOutput()) {
if (!other.hasOutput()) {
return false;
}
return output.equals(other.output);
}
if (!other.hasException()) {
return false;
}
return exception.equals(other.getException());
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(64);
sb.append("[outcome=").append(outcome).append(", output='").append(output)
.append("', exception=").append(exception).append("]");
return sb.toString();
}
}