/*
* Copyright 2013 Christian Schneider
*
* 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 org.ops4j.pax.exam.invoker.junit.internal;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.isA;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
import static org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.ops4j.pax.exam.TestContainerException;
import org.ops4j.pax.exam.WrappedTestContainerException;
import org.ops4j.pax.exam.util.Injector;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public class WrappedExceptionTest {
private static final String SHOULD_BE_WRAPPED = "This should not be serializable. So it should be wrapped";
private static final String SHOULD_NOT_BE_WRAPPED = "This should be serializable. So it should not be wrapped";
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void testSerializableException() throws ClassNotFoundException {
thrown.expect(TestContainerException.class);
thrown.expect(not(isA(WrappedTestContainerException.class)));
thrown.expectCause(isA(RuntimeException.class));
thrown.expectCause(hasMessage(is(SHOULD_NOT_BE_WRAPPED)));
callWithMethod("serializable");
}
@Test
public void testNotSerializableException() throws ClassNotFoundException {
try {
callWithMethod("notSerializable");
}
catch (WrappedTestContainerException e) {
assertThat(e.getWrappedMessage(), is(SHOULD_BE_WRAPPED));
assertThat(e.getWrappedClassName(), is(MyNotSerializableException.class.getName()));
}
}
private void callWithMethod(String method) throws ClassNotFoundException {
BundleContext bundleContext = mock(BundleContext.class);
Injector injector = mock(Injector.class);
Bundle bundle = mock(Bundle.class);
when(bundleContext.getBundle()).thenReturn(bundle);
doReturn(ExceptionSource.class).when(bundle).loadClass(ExceptionSource.class.getName());
JUnitProbeInvoker invoker = new JUnitProbeInvoker(ExceptionSource.class.getName() + ";"
+ method, bundleContext, injector);
invoker.call(new Object[] {});
}
public static class ExceptionSource {
@Test
public void serializable() {
throw new RuntimeException(SHOULD_NOT_BE_WRAPPED);
}
@Test
public void notSerializable() {
throw new MyNotSerializableException(SHOULD_BE_WRAPPED);
}
}
public static class MyNotSerializableException extends RuntimeException {
private static final long serialVersionUID = 6429496713575239757L;
private NotSerializablePart detail;
public MyNotSerializableException(String message) {
super(message);
this.detail = new NotSerializablePart();
}
public NotSerializablePart getDetail() {
return detail;
}
public class NotSerializablePart {
}
}
}