blob: a6d1c5492196f0fadff84473584cd7a794446b16 [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.geode.test.junit.assertions;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.assertj.core.api.AbstractAssert;
import org.assertj.core.api.AbstractStringAssert;
import org.assertj.core.api.Assertions;
import org.apache.geode.management.cli.Result;
import org.apache.geode.management.internal.cli.result.CommandResult;
import org.apache.geode.management.internal.cli.result.model.DataResultModel;
import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
import org.apache.geode.management.internal.cli.result.model.ResultModel;
import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
public class CommandResultAssert
extends AbstractAssert<CommandResultAssert, CommandResult> {
private String commandOutput;
public CommandResultAssert(CommandResult commandResult) {
super(commandResult, CommandResultAssert.class);
this.commandOutput = commandResult.asString();
}
public CommandResult getCommandResult() {
return actual;
}
/**
* Verifies that the gfsh output contains the given key, value pair.
*
* For example, given the following gfsh output:
*
* <pre>
* {@code
* Result : true
* Key Class : java.lang.String
* Key : key92
* Locations Found : 2
* }
* </pre>
*
* We might assert that:
*
* <pre>
* <code> containsKeyValuePair("Key Class", "java.lang.String"); </code>
* </pre>
*
* @deprecated use hasDataSection methods to verify the table contents
*/
public CommandResultAssert containsKeyValuePair(String key, String value) {
assertThat(commandOutput).containsPattern("\\Q" + key + "\\E\\s+: \\Q" + value + "\\E");
return this;
}
public AbstractStringAssert<?> hasOutput() {
return assertThat(commandOutput);
}
/**
* Verifies the gfsh output contains the given output
*/
public CommandResultAssert containsOutput(String... expectedOutputs) {
assertThat(commandOutput).contains(expectedOutputs);
return this;
}
/**
* Verifies the gfsh output does not contain the given output
*/
public CommandResultAssert doesNotContainOutput(String... expectedOutputs) {
assertThat(commandOutput).doesNotContain(expectedOutputs);
return this;
}
/**
* Verifies that gfsh executed with status OK
*/
public CommandResultAssert statusIsSuccess() {
Assertions.assertThat(actual.getStatus()).describedAs(commandOutput)
.isEqualTo(Result.Status.OK);
return this;
}
/**
* Verifies that gfsh executed with status ERROR
*/
public CommandResultAssert statusIsError() {
Assertions.assertThat(actual.getStatus()).describedAs(commandOutput)
.isEqualTo(Result.Status.ERROR);
return this;
}
/**
* Verifies that the gfsh output contains a table that has a column with the specified header and
* the specified values in any order.
*
* For example, given the following gfsh output:
*
* <pre>
* Index Name | Region Path | Server Name | Indexed Fields |
* ---------- | ----------- | ----------- | ------------------------ |
* index1 | /region1 | server-0 | [field1, field3, field2] |
* index2 | /region2 | server-0 | [field1, field3, field2] |
*
* </pre>
*
* We might assert that:
*
* <pre>
* <code> tableHasColumnWithExactValuesInAnyOrder("Region Path", "/region2", "/region1"); </code>
* </pre>
*
* @deprecated use hasTableSection methods to verify the table contents
*/
public CommandResultAssert tableHasColumnWithExactValuesInAnyOrder(String header,
String... expectedValues) {
hasTableSection().hasColumn(header).containsExactlyInAnyOrder(expectedValues);
return this;
}
/**
* @deprecated use hasTableSection methods to verify the table contents
*/
public CommandResultAssert tableHasRowWithValues(String... headersThenValues) {
assertThat(headersThenValues.length % 2)
.describedAs("You need to pass even number of parameters.").isEqualTo(0);
int numberOfColumn = headersThenValues.length / 2;
String[] headers = Arrays.copyOfRange(headersThenValues, 0, numberOfColumn);
String[] expectedValues =
Arrays.copyOfRange(headersThenValues, numberOfColumn, headersThenValues.length);
Map<String, List<String>> allValues = new HashMap<>();
int numberOfRows = -1;
for (String header : headers) {
List<String> columnValues =
actual.getResultData().getTableSections().get(0).getValuesInColumn(header);
if (numberOfRows > 0) {
assertThat(columnValues.size()).isEqualTo(numberOfRows);
}
numberOfRows = columnValues.size();
allValues.put(header, columnValues);
}
for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {
Object[] rowValues = new Object[headers.length];
for (int columnIndex = 0; columnIndex < headers.length; columnIndex++) {
rowValues[columnIndex] = allValues.get(headers[columnIndex]).get(rowIndex).toString();
}
// check if entire row is equal, but if not, continue to next row
if (Arrays.deepEquals(expectedValues, rowValues)) {
return this;
}
}
// did not find any matching rows, then this would pass only if we do not pass in any values
assertThat(headersThenValues.length)
.describedAs("No matching row found containing expected values: "
+ StringUtils.join(expectedValues, ","))
.isEqualTo(0);
return this;
}
public CommandResultAssert tableHasRowCount(int rowSize) {
hasTableSection().hasRowSize(rowSize);
return this;
}
/**
* Verifies that each of the actual values in the column with the given header contains at least
* one of the expectedValues.
*
* @deprecated use hasTableSection methods to verify the table contents
*/
public CommandResultAssert tableHasColumnWithValuesContaining(String header,
String... expectedValues) {
TabularResultModel actual = hasTableSection().getActual();
List<String> actualValues = actual.getValuesInColumn(header);
for (Object actualValue : actualValues) {
String actualValueString = (String) actualValue;
boolean actualValueContainsAnExpectedValue =
Arrays.stream(expectedValues).anyMatch(actualValueString::contains);
if (!actualValueContainsAnExpectedValue) {
failWithMessage(
"Expecting: " + Arrays.toString(expectedValues) + ", but found: " + actualValue);
}
}
return this;
}
/**
* Verifies that each of the actual values in the column with the given header contains at least
* one of the expectedValues.
*
* @deprecated use hasTableSection methods to verify the table contents
*/
public CommandResultAssert tableHasColumnOnlyWithValues(String header, String... expectedValues) {
hasTableSection().hasColumn(header).containsOnly(expectedValues);
return this;
}
public CommandResultAssert hasResult() {
containsKeyValuePair("Result", "true");
return this;
}
public CommandResultAssert hasNoResult() {
containsKeyValuePair("Result", "false");
return this;
}
/*
* methods that are only applicable to CommandResult
*/
// Will throw error unless this is a ModelCommand Result
public ResultModel getResultModel() {
return actual.getResultData();
}
public CommandResultAssert hasSection(String... sectionName) {
ResultModel resultModel = getResultModel();
assertThat(resultModel.getSectionNames()).contains(sectionName);
return this;
}
public CommandResultAssert hasNoSection(String... sectionName) {
assertThat(getResultModel().getSectionNames()).doesNotContain(sectionName);
return this;
}
// convenience method to get the first info section. if more than one info section
// use the sectionName to get it
public InfoResultModelAssert hasInfoSection() {
return new InfoResultModelAssert(getResultModel().getInfoSections().get(0));
}
public InfoResultModelAssert hasInfoSection(String sectionName) {
ResultModel resultModel = getResultModel();
InfoResultModel section = resultModel.getInfoSection(sectionName);
if (section == null) {
fail(sectionName + " section not found");
}
return new InfoResultModelAssert(section);
}
// convenience method to get the first table section. if more than one table section
// use the sectionName to get it
public TabularResultModelAssert hasTableSection() {
List<TabularResultModel> table = getResultModel().getTableSections();
assertThat(table.size()).isGreaterThan(0);
return new TabularResultModelAssert(table.get(0));
}
public TabularResultModelAssert hasTableSection(String sectionName) {
ResultModel resultModel = getResultModel();
TabularResultModel section = resultModel.getTableSection(sectionName);
if (section == null) {
fail(sectionName + " section not found");
}
return new TabularResultModelAssert(section);
}
public CommandResultAssert hasNoTableSection() {
assertThat(actual.getResultData().getTableSections().size()).isEqualTo(0);
return this;
}
// convenience method to get the first data section. if more than one data section
// use the sectionName to get it
public DataResultModelAssert hasDataSection() {
return new DataResultModelAssert(getResultModel().getDataSections().get(0));
}
public DataResultModelAssert hasDataSection(String sectionName) {
ResultModel resultModel = getResultModel();
DataResultModel section = resultModel.getDataSection(sectionName);
if (section == null) {
fail(sectionName + " section not found");
}
return new DataResultModelAssert(section);
}
}