| /* |
| * 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.ambari.server.api; |
| |
| import static org.easymock.EasyMock.capture; |
| import static org.easymock.EasyMock.eq; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.expectLastCall; |
| import static org.easymock.EasyMock.same; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.net.URLEncoder; |
| import java.util.regex.Matcher; |
| |
| import javax.servlet.FilterChain; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletResponse; |
| import javax.servlet.http.HttpServletRequest; |
| |
| import org.apache.ambari.server.security.authorization.AuthorizationHelper; |
| import org.easymock.Capture; |
| import org.easymock.EasyMockRule; |
| import org.easymock.EasyMockSupport; |
| import org.easymock.Mock; |
| import org.easymock.MockType; |
| import org.junit.After; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.powermock.api.easymock.PowerMock; |
| import org.powermock.core.classloader.annotations.PrepareForTest; |
| import org.powermock.modules.junit4.PowerMockRunner; |
| |
| @RunWith(PowerMockRunner.class) // Allow mocking static methods |
| @PrepareForTest(AuthorizationHelper.class) // This class has a static method that will be mocked |
| public class UserNameOverrideFilterTest extends EasyMockSupport { |
| |
| @Rule |
| public EasyMockRule mocks = new EasyMockRule(this); |
| |
| @Mock(type = MockType.NICE) |
| private HttpServletRequest userRelatedRequest; |
| |
| @Mock(type = MockType.NICE) |
| private ServletResponse response; |
| |
| @Mock(type = MockType.NICE) |
| private FilterChain filterChain; |
| |
| private UserNameOverrideFilter filter = new UserNameOverrideFilter(); |
| |
| |
| @Test |
| public void testGetUserNameMatcherNoUserNameInUri() throws Exception { |
| // Given |
| String uri = "/aaa/bbb"; |
| |
| // When |
| Matcher m = filter.getUserNameMatcher(uri); |
| boolean isMatch = m.matches(); |
| |
| // Then |
| assertFalse(isMatch); |
| } |
| |
| @Test |
| public void testGetUserNameMatcherNoPostInUri() throws Exception { |
| // Given |
| String uri = "/aaa/users/user1@domain"; |
| |
| // When |
| Matcher m = filter.getUserNameMatcher(uri); |
| boolean isMatch = m.find(); |
| |
| String pre = isMatch ? m.group("pre") : null; |
| String userName = isMatch ? m.group("username") : null; |
| String post = isMatch ? m.group("post") : null; |
| |
| |
| // Then |
| assertTrue(isMatch); |
| |
| assertEquals("/aaa/users/", pre); |
| assertEquals("user1@domain", userName); |
| assertEquals("", post); |
| } |
| |
| |
| |
| @Test |
| public void testGetUserNameMatcherPostInUri() throws Exception { |
| // Given |
| String uri = "/aaa/users/user1@domain/privileges"; |
| |
| // When |
| Matcher m = filter.getUserNameMatcher(uri); |
| boolean isMatch = m.find(); |
| |
| String pre = isMatch ? m.group("pre") : null; |
| String userName = isMatch ? m.group("username") : null; |
| String post = isMatch ? m.group("post") : null; |
| |
| |
| // Then |
| assertTrue(isMatch); |
| |
| assertEquals("/aaa/users/", pre); |
| assertEquals("user1@domain", userName); |
| assertEquals("/privileges", post); |
| } |
| |
| @Test |
| public void testDoFilterNoUserNameInUri() throws Exception { |
| // Given |
| expect(userRelatedRequest.getRequestURI()).andReturn("/test/test1").anyTimes(); |
| filterChain.doFilter(same(userRelatedRequest), same(response)); |
| expectLastCall(); |
| |
| replayAll(); |
| |
| // When |
| filter.doFilter(userRelatedRequest, response, filterChain); |
| |
| // Then |
| |
| verifyAll(); |
| } |
| |
| @Test |
| public void testDoFilterWithUserNameInUri() throws Exception { |
| // Given |
| expect(userRelatedRequest.getRequestURI()).andReturn("/test/users/testUserName/test1").anyTimes(); |
| |
| // filterChain should be invoked with the same req and resp as the OverrideUserName filter doesn't change these |
| filterChain.doFilter(same(userRelatedRequest), same(response)); |
| expectLastCall(); |
| |
| replayAll(); |
| |
| // When |
| filter.doFilter(userRelatedRequest, response, filterChain); |
| |
| // Then |
| |
| verifyAll(); |
| } |
| |
| @Test |
| public void testDoFilterWithLoginAliasInUri() throws Exception { |
| // Given |
| expect(userRelatedRequest.getRequestURI()).andReturn(String.format("/test/users/%s/test1", URLEncoder.encode("testLoginAlias@testdomain.com", "UTF-8"))).anyTimes(); |
| |
| Capture<ServletRequest> requestCapture = Capture.newInstance(); |
| filterChain.doFilter(capture(requestCapture), same(response)); |
| expectLastCall(); |
| |
| PowerMock.mockStatic(AuthorizationHelper.class); |
| expect(AuthorizationHelper.resolveLoginAliasToUserName(eq("testLoginAlias@testdomain.com"))).andReturn("testuser1"); |
| |
| PowerMock.replay(AuthorizationHelper.class); |
| replayAll(); |
| |
| // When |
| filter.doFilter(userRelatedRequest, response, filterChain); |
| |
| // Then |
| HttpServletRequest updatedRequest = (HttpServletRequest)requestCapture.getValue(); |
| assertEquals("testLoginAlias@testdomain.com login alias in the request Uri should be resolved to testuser1 user name !", "/test/users/testuser1/test1", updatedRequest.getRequestURI()); |
| |
| PowerMock.verify(AuthorizationHelper.class); |
| verifyAll(); |
| } |
| |
| @After |
| public void tearDown() throws Exception { |
| resetAll(); |
| } |
| } |