/**
* 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.camel.cdi.rule;
import java.util.ArrayList;
import java.util.List;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertThat;
public final class ExpectedDeploymentException implements TestRule {
private final List<Matcher<Throwable>> exceptions = new ArrayList<>();
private final List<Matcher<String>> messages = new ArrayList<>();
private final LogVerifier log = new LogVerifier();
private final TestRule chain;
private ExpectedDeploymentException() {
chain = RuleChain
.outerRule(log)
.around((base, description) -> new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable exception) {
assertThat(exception, allOf(pecs(exceptions)));
try {
// OpenWebBeans logs the deployment exception details
// TODO: OpenWebBeans only log the root cause of exception thrown in producer methods
//assertThat(log.getMessages(), containsInRelativeOrder(pecs(messages)))
assertThat(log.getMessages(), anyOf(hasItems(messages)));
} catch (AssertionError error) {
// Weld stores the deployment exception details in the exception message
assertThat(exception.getMessage(), allOf(pecs(messages)));
}
}
}
});
}
public static ExpectedDeploymentException none() {
return new ExpectedDeploymentException();
}
public ExpectedDeploymentException expect(Class<? extends Throwable> type) {
exceptions.add(Matchers.instanceOf(type));
return this;
}
public ExpectedDeploymentException expectMessage(Matcher<String> matcher) {
messages.add(matcher);
return this;
}
@SuppressWarnings({"unchecked", "rawtypes"})
private <T> List<Matcher<? super T>> pecs(List<Matcher<T>> matchers) {
return new ArrayList<>((List) matchers);
}
private <T> Matcher<Iterable<? super T>>[] hasItems(List<Matcher<T>> matchers) {
@SuppressWarnings("unchecked")
Matcher<Iterable<? super T>>[] items = new Matcher[matchers.size()];
for (int i = 0; i < items.length; i++) {
items[i] = hasItem(matchers.get(i));
}
return items;
}
@Override
public Statement apply(Statement base, Description description) {
return chain.apply(base, description);
}
}