blob: 0287e0d56179c234ca8fc11e4452dcaee31e8ffe [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.olingo.client.core.communication.request;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseFactory;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.DefaultHttpResponseFactory;
import org.apache.http.message.BasicStatusLine;
import org.apache.olingo.client.api.Configuration;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.request.ODataBatchableRequest;
import org.apache.olingo.client.api.communication.response.AsyncResponseWrapper;
import org.apache.olingo.client.api.communication.response.ODataResponse;
import org.apache.olingo.client.api.domain.ClientInvokeResult;
import org.apache.olingo.client.api.http.HttpClientFactory;
import org.apache.olingo.client.api.http.HttpUriRequestFactory;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.client.core.communication.request.AsyncRequestWrapperImpl.AsyncResponseWrapperImpl;
import org.apache.olingo.client.core.communication.request.batch.ODataBatchRequestImpl;
import org.apache.olingo.client.core.communication.request.invoke.ODataInvokeRequestImpl;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpMethod;
import org.junit.Test;
public class AsyncRequestWrapperTest {
@Test
public void testBatchReq() throws URISyntaxException {
ODataClient client = ODataClientFactory.getClient();
URI uri = new URI("localhost:8080");
AsyncBatchRequestWrapperImpl req = new AsyncBatchRequestWrapperImpl(client,
client.getBatchRequestFactory().getBatchRequest("root"));
assertNotNull(req.addChangeset());
ODataBatchableRequest request = new ODataInvokeRequestImpl<ClientInvokeResult>(
client, ClientInvokeResult.class, HttpMethod.GET, uri);
req.addRetrieve(request);
req.addOutsideUpdate(request);
assertNotNull(client.getAsyncRequestFactory().getAsyncRequestWrapper(request));
ODataBatchRequestImpl batchRequest = new ODataBatchRequestImpl(client, uri);
assertNotNull(client.getAsyncRequestFactory().getAsyncBatchRequestWrapper(batchRequest));
assertNotNull(req.wait(10));
}
@Test
public void testReq() throws URISyntaxException {
ODataClient client = ODataClientFactory.getClient();
URI uri = new URI("localhost:8080");
AsyncRequestWrapperImpl req = new AsyncRequestWrapperImpl(client,
client.getBatchRequestFactory().getBatchRequest("root"));
assertNotNull(req);
ODataBatchableRequest request = new ODataInvokeRequestImpl<ClientInvokeResult>(
client, ClientInvokeResult.class, HttpMethod.GET, uri);
req.checkRequest(client, null);
assertNotNull(req.callback(uri));
req.extendHeader("header", "value");
AsyncResponseWrapperImpl res = req.new AsyncResponseWrapperImpl();
res.forceNextMonitorCheck(uri);
}
private AsyncRequestWrapperImpl createAsyncRequestWrapperImplWithRetryAfter(int retryAfter)
throws IOException, URISyntaxException {
HttpClient httpClient = mock(HttpClient.class);
ODataClient oDataClient = mock(ODataClient.class);
Configuration configuration = mock(Configuration.class);
HttpClientFactory httpClientFactory = mock(HttpClientFactory.class);
HttpUriRequestFactory httpUriRequestFactory = mock(HttpUriRequestFactory.class);
HttpUriRequest httpUriRequest = mock(HttpUriRequest.class);
when(oDataClient.getConfiguration()).thenReturn(configuration);
when(configuration.getHttpClientFactory()).thenReturn(httpClientFactory);
when(configuration.getHttpUriRequestFactory()).thenReturn(httpUriRequestFactory);
when(httpClientFactory.create(any(), any())).thenReturn(httpClient);
when(httpUriRequestFactory.create(any(), any())).thenReturn(httpUriRequest);
HttpResponseFactory factory = new DefaultHttpResponseFactory();
HttpResponse firstResponse = factory.newHttpResponse(
new BasicStatusLine(HttpVersion.HTTP_1_1, 202, null), null);
firstResponse.addHeader(HttpHeader.LOCATION, "http://localhost/monitor");
firstResponse.addHeader(HttpHeader.RETRY_AFTER, String.valueOf(retryAfter));
when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(firstResponse);
AbstractODataRequest oDataRequest = mock(AbstractODataRequest.class);
ODataResponse oDataResponse = mock(ODataResponse.class);
when(oDataRequest.getResponseTemplate()).thenReturn(oDataResponse);
when(oDataRequest.getURI()).thenReturn(new URI("http://localhost/path"));
when(oDataResponse.initFromHttpResponse(any(HttpResponse.class))).thenReturn(null);
return new AsyncRequestWrapperImpl(oDataClient, oDataRequest);
}
@Test
public void testTooBigRetryAfter() throws IOException, URISyntaxException {
AsyncRequestWrapperImpl req = createAsyncRequestWrapperImplWithRetryAfter(Integer.MAX_VALUE);
AsyncResponseWrapper wrappedResponse = req.execute();
assertTrue(wrappedResponse instanceof AsyncResponseWrapperImpl);
AsyncResponseWrapperImpl wrappedResponseImpl = (AsyncResponseWrapperImpl) wrappedResponse;
assertEquals(AsyncResponseWrapperImpl.MAX_RETRY_AFTER, wrappedResponseImpl.retryAfter);
}
@Test
public void testZeroRetryAfter() throws IOException, URISyntaxException {
AsyncRequestWrapperImpl req = createAsyncRequestWrapperImplWithRetryAfter(0);
AsyncResponseWrapper wrappedResponse = req.execute();
assertTrue(wrappedResponse instanceof AsyncResponseWrapperImpl);
AsyncResponseWrapperImpl wrappedResponseImpl = (AsyncResponseWrapperImpl) wrappedResponse;
assertEquals(0, wrappedResponseImpl.retryAfter);
}
@Test
public void testNegativeRetryAfter() throws IOException, URISyntaxException {
AsyncRequestWrapperImpl req = createAsyncRequestWrapperImplWithRetryAfter(-1);
AsyncResponseWrapper wrappedResponse = req.execute();
assertTrue(wrappedResponse instanceof AsyncResponseWrapperImpl);
AsyncResponseWrapperImpl wrappedResponseImpl = (AsyncResponseWrapperImpl) wrappedResponse;
assertEquals(AsyncResponseWrapperImpl.DEFAULT_RETRY_AFTER, wrappedResponseImpl.retryAfter);
}
@Test
public void testRetryAfter() throws IOException, URISyntaxException {
int retryAfter = 7;
assertNotEquals(retryAfter, AsyncResponseWrapperImpl.DEFAULT_RETRY_AFTER);
AsyncRequestWrapperImpl req = createAsyncRequestWrapperImplWithRetryAfter(retryAfter);
AsyncResponseWrapper wrappedResponse = req.execute();
assertTrue(wrappedResponse instanceof AsyncResponseWrapperImpl);
AsyncResponseWrapperImpl wrappedResponseImpl = (AsyncResponseWrapperImpl) wrappedResponse;
assertEquals(retryAfter, wrappedResponseImpl.retryAfter);
}
@Test
public void testWrapper() {
Wrapper wrap = new Wrapper();
wrap.setWrapped("test");
assertEquals("test", wrap.getWrapped());
}
@Test
public void testException() {
AsyncRequestException ex = new AsyncRequestException("Exception");
assertEquals("Exception", ex.getMessage());
}
private AsyncResponseWrapperImpl createAsyncRequestWrapperImplWithLocation(String target, String location)
throws IOException, URISyntaxException {
HttpClient httpClient = mock(HttpClient.class);
ODataClient oDataClient = mock(ODataClient.class);
Configuration configuration = mock(Configuration.class);
HttpClientFactory httpClientFactory = mock(HttpClientFactory.class);
HttpUriRequestFactory httpUriRequestFactory = mock(HttpUriRequestFactory.class);
HttpUriRequest httpUriRequest = mock(HttpUriRequest.class);
when(oDataClient.getConfiguration()).thenReturn(configuration);
when(configuration.getHttpClientFactory()).thenReturn(httpClientFactory);
when(configuration.getHttpUriRequestFactory()).thenReturn(httpUriRequestFactory);
when(httpClientFactory.create(any(), any())).thenReturn(httpClient);
when(httpUriRequestFactory.create(any(), any())).thenReturn(httpUriRequest);
HttpResponseFactory factory = new DefaultHttpResponseFactory();
HttpResponse firstResponse = factory.newHttpResponse(
new BasicStatusLine(HttpVersion.HTTP_1_1, 202, null), null);
firstResponse.addHeader(HttpHeader.LOCATION, location);
when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(firstResponse);
ODataResponse oDataResponse = mock(ODataResponse.class);
when(oDataResponse.initFromHttpResponse(any(HttpResponse.class))).thenReturn(null);
AbstractODataRequest oDataRequest = mock(AbstractODataRequest.class);
when(oDataRequest.getURI()).thenReturn(new URI(target));
when(oDataRequest.getResponseTemplate()).thenReturn(oDataResponse);
AsyncRequestWrapperImpl req = new AsyncRequestWrapperImpl(oDataClient, oDataRequest);
AsyncResponseWrapper wrappedResponse = req.execute();
assertTrue(wrappedResponse instanceof AsyncResponseWrapperImpl);
return (AsyncResponseWrapperImpl) wrappedResponse;
}
@Test(expected = AsyncRequestException.class)
public void testLocationWithInvalidScheme() throws IOException, URISyntaxException {
String target = "https://server/path";
String location = "http://server/path";
createAsyncRequestWrapperImplWithLocation(target, location);
}
@Test(expected = AsyncRequestException.class)
public void testLocationWithInvalidHost() throws IOException, URISyntaxException {
String target = "http://server/path";
String location = "http://something.else/path";
createAsyncRequestWrapperImplWithLocation(target, location);
}
@Test(expected = AsyncRequestException.class)
public void testLocationWithInvalidPort() throws IOException, URISyntaxException {
String target = "http://server/path";
String location = "http://server:8080/path";
createAsyncRequestWrapperImplWithLocation(target, location);
}
@Test
public void testLocationWithDifferentPaths() throws IOException, URISyntaxException {
String target = "http://server/path";
String location = "http://server/monitor";
AsyncResponseWrapperImpl wrapper = createAsyncRequestWrapperImplWithLocation(target, location);
assertEquals(new URI(location), wrapper.location);
}
}