/**
* Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.gistlabs.mechanize.filters;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.protocol.HttpContext;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class DefaultMechanizeChainFilterTest {
/**
* How many filters have been run?
*/
int counter=0;
@Mock MechanizeFilter theEndMock;
@InjectMocks DefaultMechanizeChainFilter defaultChainFilter;
@Test
public void testTailCall() {
when(theEndMock.execute(any(HttpUriRequest.class), any(HttpContext.class))).thenReturn(mock(HttpResponse.class));
assertNotNull(defaultChainFilter.execute(null, null));
}
@Test
public void testOneFilterChainWithTailCall() {
when(theEndMock.execute(any(HttpUriRequest.class), any(HttpContext.class))).thenReturn(mock(HttpResponse.class));
defaultChainFilter.add(new MechanizeChainFilter() {
@Override
public HttpResponse execute(final HttpUriRequest request, final HttpContext context, final MechanizeFilter chain) {
counter++;
return chain.execute(request, context);
}
});
assertNotNull(defaultChainFilter.execute(null, null));
assertEquals(1, counter);
}
@Test
public void testManyFilterChainWithTailCall() {
when(theEndMock.execute(any(HttpUriRequest.class), any(HttpContext.class))).thenReturn(mock(HttpResponse.class));
int length = 5;
for (int i = 0; i < length ; i++)
defaultChainFilter.add(new MechanizeChainFilter() {
@Override
public HttpResponse execute(final HttpUriRequest request, final HttpContext context, final MechanizeFilter chain) {
counter++;
return chain.execute(request, context);
}
});
assertNotNull(defaultChainFilter.execute(null, null));
assertEquals(length, counter);
}
@Test(expected=IllegalStateException.class)
public void testOneFilterChainWithExceptionNoTailCall() {
defaultChainFilter.add(new MechanizeChainFilter() {
@Override
public HttpResponse execute(final HttpUriRequest request, final HttpContext context, final MechanizeFilter chain) {
throw new IllegalStateException();
}
});
defaultChainFilter.execute(null, null);
}
}