5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/*
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * The contents of this file are subject to the terms of the Common Development and
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Distribution License (the License). You may not use this file except in compliance with the
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * License.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * specific language governing permission and limitations under the License.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * When distributing Covered Software, include this CDDL Header Notice in each file and include
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Header, with the fields enclosed by brackets [] replaced by your own identifying
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * information: "Portions copyright [year] [name of copyright owner]".
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Copyrighted 2015 Intellectual Reserve, Inc (IRI)
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/*
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Portions copyright 2015 ForgeRock AS
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenpackage org.forgerock.openam.radius.server;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowenimport static org.assertj.core.api.Assertions.*;
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowenimport static org.mockito.Matchers.*;
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowenimport static org.mockito.Mockito.*;
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowenimport java.net.Inet4Address;
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowenimport java.net.InetSocketAddress;
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowenimport java.net.UnknownHostException;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport java.nio.ByteBuffer;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowenimport org.forgerock.guava.common.eventbus.EventBus;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.common.AccessAccept;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.common.AccessReject;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.common.Packet;
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowenimport org.forgerock.openam.radius.common.PacketType;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.common.Utils;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.server.config.ClientConfig;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.server.spi.handlers.AcceptAllHandler;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.openam.radius.server.spi.handlers.RejectAllHandler;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.forgerock.util.promise.PromiseImpl;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenimport org.testng.annotations.Test;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen/**
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * Test for the <code>RadiusRequestHandler</code> class.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen *
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @see org.forgerock.openam.radius.server.RadiusRequestHandler
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenpublic class RadiusRequestHandlerTest {
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen private final String res = "01 00 00 38 0f 40 3f 94 73 97 80 57 bd 83 d5 cb "
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen + "98 f4 22 7a 01 06 6e 65 6d 6f 02 12 0d be 70 8d " + "93 d4 13 ce 31 96 e4 3f 78 2a 0a ee 04 06 c0 a8 "
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen + "01 10 05 06 00 00 00 03";
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen /**
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Test that when run is called with an AcceptAllHandler then the RadiusAuthResponse contains a success code and an
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * AcceptResponse is sent.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws InterruptedException - when an interrupt occurs.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws RadiusProcessingException - when something goes wrong processing a RADIUS packet.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws UnknownHostException - if the host can't be determined
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen @Test(enabled = true)
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen public void testRun() throws UnknownHostException, InterruptedException, RadiusProcessingException {
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // given
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final RadiusRequestContext reqCtx = mock(RadiusRequestContext.class);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ClientConfig clientConfig = mock(ClientConfig.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen String url = "forgerock.org";
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen InetSocketAddress socketAddress = new InetSocketAddress(Inet4Address.getByName(url), 6836);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(reqCtx.getClientConfig()).thenReturn(clientConfig);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(reqCtx.getSource()).thenReturn(socketAddress);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(clientConfig.getName()).thenReturn("TestConfig");
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ByteBuffer bfr = Utils.toBuffer(res);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final PromiseImpl<RadiusResponse, RadiusProcessingException> promise = PromiseImpl.create();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen EventBus eventBus = new EventBus();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen AccessRequestHandlerFactory accessRequestHandlerFactory = mock(AccessRequestHandlerFactory.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(accessRequestHandlerFactory.getAccessRequestHandler(reqCtx)).thenReturn(new AcceptAllHandler());
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusRequestHandler handler = new RadiusRequestHandler(accessRequestHandlerFactory, reqCtx, bfr, promise,
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen promise, eventBus);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen handler.run();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // when
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusResponse result = promise.getOrThrow();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // then
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen assertThat(result.getResponsePacket().getType()).isEqualTo(PacketType.ACCESS_ACCEPT);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen verify(reqCtx, times(1)).send(isA(AccessAccept.class));
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen }
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen /**
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * Test that when run is called with an RejectAllHandler that the resultant promise returns a RadiusResponse
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * containing an ACCESS_REJECT packet.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen *
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws InterruptedException - when an interrupt occurs.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws RadiusProcessingException - when something goes wrong processing a RADIUS packet.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws UnknownHostException - if the host can't be determined
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen */
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen @Test(enabled = true)
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen public void testRunReject()
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen throws UnknownHostException, InterruptedException, RadiusProcessingException {
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // given
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final RadiusRequestContext reqCtx = mock(RadiusRequestContext.class);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ClientConfig clientConfig = mock(ClientConfig.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen String url = "forgerock.org";
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen InetSocketAddress socketAddress = new InetSocketAddress(Inet4Address.getByName(url), 6836);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(reqCtx.getClientConfig()).thenReturn(clientConfig);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(reqCtx.getSource()).thenReturn(socketAddress);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(clientConfig.getName()).thenReturn("TestConfig");
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(clientConfig.getAccessRequestHandlerClass()).thenReturn(RejectAllHandler.class);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ByteBuffer bfr = Utils.toBuffer(res);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final PromiseImpl<RadiusResponse, RadiusProcessingException> promise = PromiseImpl.create();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen EventBus eventBus = new EventBus();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen AccessRequestHandlerFactory accessRequestHandlerFactory = mock(AccessRequestHandlerFactory.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(accessRequestHandlerFactory.getAccessRequestHandler(reqCtx)).thenReturn(new RejectAllHandler());
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusRequestHandler handler = new RadiusRequestHandler(accessRequestHandlerFactory, reqCtx, bfr, promise,
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen promise, eventBus);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen handler.run();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // when
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusResponse result = promise.getOrThrow();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // then
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen assertThat(result.getResponsePacket().getType()).isEqualTo(PacketType.ACCESS_REJECT);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen verify(reqCtx, times(1)).send(isA(AccessReject.class));
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen }
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen /**
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * Test that when run is called with an CatestrophicHandler that the promise returns a RadiusProcessingException.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen *
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws InterruptedException - when an interrupt occurs.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws RadiusProcessingException - when something goes wrong processing a RADIUS packet.
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen * @throws UnknownHostException - if the host can't be determined
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen @Test(expectedExceptions = RadiusProcessingException.class)
cb241c1aa2096e51864b45398cc15850b0ce4d8cjamiebowen public void testRunCatestrophic() throws InterruptedException, RadiusProcessingException, UnknownHostException {
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // given
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final RadiusRequestContext reqCtx = mock(RadiusRequestContext.class);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ClientConfig clientConfig = mock(ClientConfig.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen String url = "forgerock.org";
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen InetSocketAddress socketAddress = new InetSocketAddress(Inet4Address.getByName(url), 6836);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(reqCtx.getClientConfig()).thenReturn(clientConfig);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(reqCtx.getSource()).thenReturn(socketAddress);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(clientConfig.getName()).thenReturn("TestConfig");
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen when(clientConfig.getAccessRequestHandlerClass()).thenReturn(CatastrophicHandler.class);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen final ByteBuffer bfr = Utils.toBuffer(res);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final PromiseImpl<RadiusResponse, RadiusProcessingException> promise = PromiseImpl.create();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen EventBus eventBus = new EventBus();
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen AccessRequestHandlerFactory accessRequestHandlerFactory = mock(AccessRequestHandlerFactory.class);
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen when(accessRequestHandlerFactory.getAccessRequestHandler(reqCtx)).thenReturn(new CatastrophicHandler());
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusRequestHandler handler = new RadiusRequestHandler(accessRequestHandlerFactory, reqCtx, bfr, promise,
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen promise, eventBus);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen handler.run();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // when
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen final RadiusResponse result = promise.getOrThrow();
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen // then
3e7992560027364f56fb4fb0ef645623bd020c3bjamiebowen assertThat(result.getResponsePacket().getType()).isEqualTo(PacketType.ACCESS_REJECT);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen verify(reqCtx, never()).send(isA(Packet.class));
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen }
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen}