001/*
002 * Licensed to DuraSpace under one or more contributor license agreements.
003 * See the NOTICE file distributed with this work for additional information
004 * regarding copyright ownership.
005 *
006 * DuraSpace licenses this file to you under the Apache License,
007 * Version 2.0 (the "License"); you may not use this file except in
008 * compliance with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.fcrepo.auth.common;
019
020import static org.junit.Assert.assertEquals;
021import static org.junit.Assert.assertNotEquals;
022import static org.junit.Assert.assertTrue;
023import static org.mockito.Mockito.mock;
024import static org.mockito.Mockito.when;
025import static org.mockito.MockitoAnnotations.initMocks;
026
027import org.fcrepo.auth.common.HttpHeaderPrincipalProvider.HttpHeaderPrincipal;
028import org.junit.Before;
029import org.junit.Test;
030import org.mockito.Mock;
031import org.modeshape.jcr.api.ServletCredentials;
032
033import javax.jcr.Credentials;
034import javax.servlet.http.HttpServletRequest;
035
036import java.security.Principal;
037import java.util.Set;
038
039/**
040 * @author daines
041 * @author bbpennel
042 * @since Mar 6, 2014
043 */
044public class HttpHeaderPrincipalProviderTest {
045
046    @Mock
047    private ServletCredentials credentials;
048
049    @Mock
050    private HttpServletRequest request;
051
052    private HttpHeaderPrincipalProvider provider;
053
054    @Before
055    public void setUp() {
056        initMocks(this);
057        when(credentials.getRequest()).thenReturn(request);
058
059        provider = new HttpHeaderPrincipalProvider();
060    }
061
062    @Test
063    public void testPrincipalsExtractedFromHeaders() {
064
065        when(request.getHeader("Groups")).thenReturn("a,b");
066
067        provider.setHeaderName("Groups");
068        provider.setSeparator(",");
069
070        final Set<Principal> principals = provider.getPrincipals(credentials);
071
072        assertEquals(2, principals.size());
073        assertTrue("The principals should contain 'a'", principals
074                .contains(new HttpHeaderPrincipal("a")));
075        assertTrue("The principals should contain 'b'", principals
076                .contains(new HttpHeaderPrincipal("b")));
077
078    }
079
080    @Test
081    public void testShouldTrimPrincipalNames() {
082
083        when(request.getHeader("Groups")).thenReturn(" a ,b");
084
085        provider.setHeaderName("Groups");
086        provider.setSeparator(",");
087
088        final Set<Principal> principals = provider.getPrincipals(credentials);
089
090        assertEquals(2, principals.size());
091        assertTrue("The principals should contain 'a'", principals
092                .contains(new HttpHeaderPrincipal("a")));
093        assertTrue("The principals should contain 'b'", principals
094                .contains(new HttpHeaderPrincipal("b")));
095
096    }
097
098    @Test
099    public void testNoHeaderName() {
100
101        final Set<Principal> principals = provider.getPrincipals(credentials);
102
103        assertTrue("Empty set expected when no header name configured", principals.isEmpty());
104
105    }
106
107    @Test
108    public void testNoSeparator() {
109
110        provider.setHeaderName("Groups");
111
112        final Set<Principal> principals = provider.getPrincipals(credentials);
113
114        assertTrue("Empty set expected when no separator name configured", principals.isEmpty());
115
116    }
117
118    @Test
119    public void testInvalidCredentials() {
120
121        provider.setHeaderName("Groups");
122        provider.setSeparator(",");
123
124        final Set<Principal> principals = provider.getPrincipals(mock(Credentials.class));
125
126        assertTrue("Empty set expected when incorrect type of credentials supplied", principals.isEmpty());
127
128    }
129
130    @Test
131    public void testNoRequest() {
132
133        provider.setHeaderName("Groups");
134        provider.setSeparator(",");
135
136        when(credentials.getRequest()).thenReturn(null);
137
138        final Set<Principal> principals = provider.getPrincipals(credentials);
139
140        assertTrue("Empty set expected when no request supplied", principals.isEmpty());
141
142    }
143
144    @Test
145    public void testPrincipalEqualsDifferentClass() {
146
147        when(request.getHeader("Groups")).thenReturn("a");
148
149        provider.setHeaderName("Groups");
150        provider.setSeparator(",");
151
152        final Set<Principal> principals = provider.getPrincipals(credentials);
153
154        final Principal principal = principals.iterator().next();
155
156        assertNotEquals("Principals should not be equal if not the same class",
157                principal, mock(Principal.class));
158
159    }
160
161}