/* * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xwiki.security; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.xwiki.model.EntityType; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.EntityReference; import org.xwiki.model.reference.SpaceReference; import org.xwiki.model.reference.WikiReference; import org.xwiki.security.internal.XWikiBridge; import org.xwiki.test.mockito.MockitoComponentMockingRule; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; /** * Security Reference Unit Tests. * * @version $Id: 2e1f0a099688047a290c31809716c28df70dea48 $ * @since 4.0M2 */ public class SecurityReferenceTest { @Rule public final MockitoComponentMockingRule<SecurityReferenceFactory> securityReferenceFactoryMocker = new MockitoComponentMockingRule<SecurityReferenceFactory>(DefaultSecurityReferenceFactory.class); @Rule public ExpectedException thrown = ExpectedException.none(); private EntityReference xwiki = new EntityReference("xwiki", EntityType.WIKI); private EntityReference wiki = new EntityReference("wiki", EntityType.WIKI); private EntityReference xspace = new EntityReference("space", EntityType.SPACE, new EntityReference("xwiki", EntityType.WIKI)); private EntityReference space = new EntityReference("space", EntityType.SPACE, new EntityReference("wiki", EntityType.WIKI)); private EntityReference subEntity = new EntityReference("page", EntityType.DOCUMENT, space); private EntityReference mainEntity = new EntityReference("page", EntityType.DOCUMENT, xspace); private SpaceReference xwikispace = new SpaceReference("XWiki", xwiki); private SpaceReference wikispace = new SpaceReference("XWiki", wiki); private DocumentReference userRef = new DocumentReference("user1", xwikispace); private DocumentReference anotherWikiUserRef = new DocumentReference("user2", wikispace); private DocumentReference groupRef = new DocumentReference("group1", xwikispace); private DocumentReference anotherWikiGroupRef = new DocumentReference("group2", wikispace); private SecurityReferenceFactory factory; @Before public void configure() throws Exception { XWikiBridge xwikiBridge = securityReferenceFactoryMocker.getInstance(XWikiBridge.class); when(xwikiBridge.getMainWikiReference()).thenReturn(new WikiReference("xwiki")); factory = securityReferenceFactoryMocker.getComponentUnderTest(); } @Test public void testEquality() throws Exception { assertThat(factory.newEntityReference(mainEntity), equalTo(factory.newEntityReference(mainEntity))); assertThat(factory.newEntityReference(subEntity), equalTo(factory.newEntityReference(subEntity))); assertThat(factory.newEntityReference(mainEntity), not(equalTo(factory.newEntityReference(subEntity)))); assertThat(factory.newEntityReference(subEntity), not(equalTo(factory.newEntityReference(mainEntity)))); } @Test public void testGetReversedSecurityReferenceChain() throws Exception { List<SecurityReference> subList = (List<SecurityReference>) factory.newEntityReference(subEntity) .getReversedSecurityReferenceChain(); assertThat(subList.get(0), equalTo(xwiki)); assertThat(subList.get(0).getOriginalReference(), equalTo(xwiki)); assertThat(subList.get(1), equalTo(wiki)); assertThat(subList.get(1).getOriginalReference(), equalTo(wiki)); assertThat(subList.get(2), equalTo(space)); assertThat(subList.get(2).getOriginalReference(), equalTo(space)); assertThat(subList.get(3), equalTo(subEntity)); assertThat(subList.get(3).getOriginalReference(), equalTo(subEntity)); List<SecurityReference> mainList = (List<SecurityReference>) factory.newEntityReference(mainEntity) .getReversedSecurityReferenceChain(); assertThat(mainList.get(0), equalTo(xwiki)); assertThat(mainList.get(0).getOriginalReference(), equalTo(xwiki)); assertThat(mainList.get(1), equalTo(xspace)); assertThat(mainList.get(1).getOriginalReference(), equalTo(xspace)); assertThat(mainList.get(2), equalTo(mainEntity)); assertThat(mainList.get(2).getOriginalReference(), equalTo(mainEntity)); } @Test public void testSecurityReferenceForNullReference() throws Exception { assertThat(factory.newEntityReference(null), equalTo(factory.newEntityReference(xwiki))); assertThat(factory.newUserReference(null), equalTo(factory.newEntityReference(xwiki))); assertThat(factory.newEntityReference(null).getOriginalReference(), equalTo(xwiki)); assertThat(factory.newUserReference(null).getOriginalDocumentReference(), nullValue()); thrown.expect(IllegalArgumentException.class); factory.newGroupReference(null); // never reached !! } @Test public void testGetSecurityType() throws Exception { assertThat(factory.newEntityReference(null).getSecurityType(), equalTo(SecurityReference.FARM)); assertThat(factory.newEntityReference(xwiki).getSecurityType(), equalTo(SecurityReference.FARM)); assertThat(factory.newEntityReference(wiki).getSecurityType(), equalTo(EntityType.WIKI)); assertThat(factory.newEntityReference(xspace).getSecurityType(), equalTo(EntityType.SPACE)); assertThat(factory.newEntityReference(space).getSecurityType(), equalTo(EntityType.SPACE)); assertThat(factory.newEntityReference(mainEntity).getSecurityType(), equalTo(EntityType.DOCUMENT)); assertThat(factory.newEntityReference(subEntity).getSecurityType(), equalTo(EntityType.DOCUMENT)); } @Test public void testGetOriginalWikiReference() throws Exception { assertThat(factory.newEntityReference(null).getOriginalWikiReference(), equalTo(xwiki)); assertThat(factory.newEntityReference(xwiki).getOriginalWikiReference(), equalTo(xwiki)); assertThat(factory.newEntityReference(wiki).getOriginalWikiReference(), equalTo(wiki)); assertThat(factory.newEntityReference(xspace).getOriginalWikiReference(), nullValue()); assertThat(factory.newEntityReference(space).getOriginalWikiReference(), nullValue()); assertThat(factory.newEntityReference(mainEntity).getOriginalWikiReference(), nullValue()); assertThat(factory.newEntityReference(subEntity).getOriginalWikiReference(), nullValue()); } @Test public void testGetOriginalSpaceReference() throws Exception { assertThat(factory.newEntityReference(null).getOriginalSpaceReference(), nullValue()); assertThat(factory.newEntityReference(xwiki).getOriginalSpaceReference(), nullValue()); assertThat(factory.newEntityReference(wiki).getOriginalSpaceReference(), nullValue()); assertThat(factory.newEntityReference(xspace).getOriginalSpaceReference(), equalTo(xspace)); assertThat(factory.newEntityReference(space).getOriginalSpaceReference(), equalTo(space)); assertThat(factory.newEntityReference(mainEntity).getOriginalSpaceReference(), nullValue()); assertThat(factory.newEntityReference(subEntity).getOriginalSpaceReference(), nullValue()); } @Test public void testGetOriginalDocumentReference() throws Exception { assertThat(factory.newEntityReference(null).getOriginalDocumentReference(), nullValue()); assertThat(factory.newEntityReference(xwiki).getOriginalDocumentReference(), nullValue()); assertThat(factory.newEntityReference(wiki).getOriginalDocumentReference(), nullValue()); assertThat(factory.newEntityReference(xspace).getOriginalDocumentReference(), nullValue()); assertThat(factory.newEntityReference(space).getOriginalDocumentReference(), nullValue()); assertThat(factory.newEntityReference(mainEntity).getOriginalDocumentReference(), equalTo(mainEntity)); assertThat(factory.newEntityReference(subEntity).getOriginalDocumentReference(), equalTo(subEntity)); } @Test public void testIsGlobal() throws Exception { assertThat(factory.newUserReference(userRef).isGlobal(), is(true)); assertThat(factory.newUserReference(anotherWikiUserRef).isGlobal(), is(false)); assertThat(factory.newGroupReference(groupRef).isGlobal(), is(true)); assertThat(factory.newGroupReference(anotherWikiGroupRef).isGlobal(), is(false)); } @Test public void testGetWikiReference() throws Exception { assertThat(factory.newUserReference(userRef).getWikiReference(), equalTo(xwiki)); assertThat(factory.newUserReference(anotherWikiUserRef).getWikiReference(), equalTo(wiki)); assertThat(factory.newEntityReference(mainEntity).getWikiReference(), equalTo(xwiki)); assertThat(factory.newEntityReference(subEntity).getWikiReference(), equalTo(wiki)); assertThat(factory.newEntityReference(xwiki).getWikiReference(), equalTo(xwiki)); assertThat(factory.newEntityReference(wiki).getWikiReference(), equalTo(wiki)); } }