package org.odata4j.test.integration.consumer;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Response.StatusType;
import org.junit.After;
import org.junit.Test;
import org.odata4j.core.OError;
import org.odata4j.edm.EdmDataServices;
import org.odata4j.exceptions.ExceptionFactory;
import org.odata4j.exceptions.ODataProducerException;
import org.odata4j.exceptions.ODataProducerExceptions;
import org.odata4j.producer.inmemory.InMemoryProducer;
import org.odata4j.producer.resources.DefaultODataProducerProvider;
import org.odata4j.test.integration.AbstractODataConsumerTest;
public class ErrorTest extends AbstractODataConsumerTest {
public ErrorTest(RuntimeFacadeType type) {
super(type);
}
@Override
protected void registerODataProducer() throws Exception {
InMemoryProducer producer = new InMemoryProducer(null) {
@Override
public EdmDataServices getMetadata() {
// the producer pretends to be unavailable
throw new ServiceUnavailableException();
}
};
DefaultODataProducerProvider.setInstance(producer);
}
@After
public void teardown() throws Exception {
super.teardown();
ODataProducerExceptions.restore();
}
@Test
public void catchUnspecificException() throws Exception {
try {
consumer.getEntitySets();
fail("No exception thrown");
} catch (ServiceUnavailableException e) {
fail("Wrong exception thrown");
} catch (ODataProducerException e) {
// as ServiceUnavailableException is not known by the ODataProducerExceptions
// factory, an unspecific exception is thrown
assertThat(e.getOError().getCode(), is("ServiceUnavailableException"));
}
}
@Test
public void catchSpecificException() throws Exception {
// add ServiceUnavailableException to the ODataProducerExceptions factory
ODataProducerExceptions.add(new ServiceUnavailableException.Factory());
try {
consumer.getEntitySets();
fail("No exception thrown");
} catch (ServiceUnavailableException e) {
// now the specific exception is thrown
assertThat(e.getOError().getCode(), is("ServiceUnavailableException"));
} catch (ODataProducerException e) {
fail("Wrong exception thrown");
}
}
public static class ServiceUnavailableException extends ODataProducerException {
private static final long serialVersionUID = 1L;
public ServiceUnavailableException() {
super(null, null);
}
@Override
public StatusType getHttpStatus() {
return Status.SERVICE_UNAVAILABLE;
}
private ServiceUnavailableException(OError error) {
super(error);
}
public static class Factory implements ExceptionFactory<ServiceUnavailableException> {
@Override
public int getStatusCode() {
return Status.SERVICE_UNAVAILABLE.getStatusCode();
}
@Override
public ServiceUnavailableException createException(OError error) {
return new ServiceUnavailableException(error);
}
}
}
}