blob: 6d0635e4e91dba89863a1b717332ec203c15a73b [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.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();
}
}