/** * 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.hadoop.gateway.service.admin; import org.apache.hadoop.gateway.topology.Topology; import org.apache.hadoop.gateway.config.GatewayConfig; import javax.servlet.http.HttpServletRequest; import org.easymock.EasyMock; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; public class TopologyResourceTest { private final String X_Forwarded = "X-Forwarded-"; private final String X_Forwarded_Context = X_Forwarded + "Context"; private final String X_Forwarded_Proto = X_Forwarded + "Proto"; private final String X_Forwarded_Host = X_Forwarded + "Host"; private final String X_Forwarded_Port = X_Forwarded + "Port"; private final String X_Forwarded_Server = X_Forwarded + "Server"; private String reqProto = "http"; private String reqServer = "req-server"; private String reqPort = "9001"; private String gatewayPath = "gateway-path"; private String reqContext = "/" + gatewayPath + "/a-topology"; private String proto = "proto", port = "1337", server = "my-server", host = server + ":" + port, startContext = "/mycontext"; private String fullContext = startContext + reqContext; private String pathInfo = "/api/version"; private String topologyName = "topology-name"; private String expectedBase = proto + "://" + server + ":" + port + "/mycontext/" + gatewayPath; private String expectedURI = expectedBase + "/" + topologyName; private String expectedHref = expectedBase + "/a-topology" + pathInfo + "/" + topologyName; @Test public void testTopologyURLMethods(){ // Note: had to change method signature due to these tests. Changed methods to public and added // HttpServletRequest argument. HttpServletRequest request = EasyMock.createNiceMock( HttpServletRequest.class ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Host, host); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Proto, proto); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Server, server); Topology t = EasyMock.createNiceMock( Topology.class ); EasyMock.expect( t.getName() ).andReturn( topologyName ).anyTimes(); GatewayConfig conf = EasyMock.createNiceMock( GatewayConfig.class ); EasyMock.expect( conf.getGatewayPath() ).andReturn( gatewayPath ).anyTimes(); EasyMock.replay( request, t, conf ); TopologiesResource res = new TopologiesResource(); String href = res.buildHref(t, request); String uri = res.buildURI(t, conf, request); assertThat( uri, containsString( proto ) ); assertThat( uri, containsString( host ) ); assertThat( uri, containsString( server ) ); assertThat( uri, containsString( port ) ); assertThat( uri, containsString( topologyName ) ); assert( uri.equals(expectedURI) ); assertThat( href, containsString( proto ) ); assertThat( href, containsString( host ) ); assertThat( href, containsString( server ) ); assertThat( href, containsString( port ) ); assertThat( href, containsString( fullContext ) ); assert( href.equals(expectedHref) ); // Test 2 - No Protocol Header EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Host, host); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Server, server); EasyMock.replay(request); String test2URI = expectedURI.replace(proto, reqProto); String test2href = expectedHref.replace(proto, reqProto); assert(res.buildURI(t, conf, request).equals(test2URI)); assert(res.buildHref(t, request).equals(test2href)); // Test 3 - No port in host Header EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Host, server); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Server, server); setMockRequestHeader(request, X_Forwarded_Proto, proto); EasyMock.replay(request); assert(res.buildURI(t, conf, request).equals(expectedURI)); assert(res.buildHref(t, request).equals(expectedHref)); // Test 4 - server & no host Header EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Server, server); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Proto, proto); EasyMock.replay(request); assert(res.buildURI(t, conf, request).equals(expectedURI)); assert(res.buildHref(t, request).equals(expectedHref)); // Test 5 - no server & no host Header EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Proto, proto); EasyMock.replay(request); String test5URI = expectedURI.replace(server, reqServer); String test5href = expectedHref.replace(server, reqServer); assertEquals(res.buildURI(t, conf, request), test5URI); assertEquals(res.buildHref(t, request), test5href); // Test 6 - no port, no server & no host Header EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Context, fullContext); setMockRequestHeader(request, X_Forwarded_Proto, proto); EasyMock.replay(request); String test6URI = expectedURI.replace(server, reqServer).replace(port, reqPort); String test6href = expectedHref.replace(server, reqServer).replace(port, reqPort); assertEquals(res.buildURI(t, conf, request), (test6URI)); assertEquals(res.buildHref(t, request), (test6href)); // Test 7 - No Context EasyMock.reset( request ); setDefaultExpectations(request); setMockRequestHeader(request, X_Forwarded_Host, host); setMockRequestHeader(request, X_Forwarded_Port, port); setMockRequestHeader(request, X_Forwarded_Proto, proto); setMockRequestHeader(request, X_Forwarded_Server, server); EasyMock.replay(request); String test7URI = expectedURI.replace(startContext, ""); String test7href = expectedHref.replace(startContext, ""); assertEquals(res.buildURI(t, conf, request), test7URI); assertEquals(res.buildHref(t, request), test7href); } private void setDefaultExpectations(HttpServletRequest request){ EasyMock.expect( request.getPathInfo() ).andReturn( pathInfo ).anyTimes(); EasyMock.expect( request.getContextPath() ).andReturn( reqContext ).anyTimes(); EasyMock.expect( request.getServerName() ).andReturn( reqServer ).anyTimes(); EasyMock.expect( request.getLocalPort() ).andReturn( Integer.parseInt( reqPort ) ).anyTimes(); EasyMock.expect( request.getProtocol() ).andReturn(reqProto).anyTimes(); } private void setMockRequestHeader(HttpServletRequest request, String header, String expected){ EasyMock.expect( request.getHeader( header ) ).andReturn( expected ).anyTimes(); } }