Author: angela Date: Thu May 2 12:34:12 2019 New Revision: 1858534 URL: http://svn.apache.org/viewvc?rev=1858534&view=rev Log: OAK-8293 : PrincipalProviderImpl.findPrincipals my return null values in result iterator
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java (with props) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderWithCacheTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java?rev=1858534&r1=1858533&r2=1858534&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java Thu May 2 12:34:12 2019 @@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.securi import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.collect.Iterators; import org.apache.jackrabbit.api.security.principal.ItemBasedPrincipal; import org.apache.jackrabbit.api.security.principal.PrincipalManager; @@ -46,6 +45,7 @@ import java.security.Principal; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.Objects; import java.util.Set; /** @@ -146,9 +146,7 @@ class PrincipalProviderImpl implements P } try { Iterator<Authorizable> authorizables = findAuthorizables(nameHint, searchType, offset, limit); - Iterator<Principal> principals = Iterators.transform( - Iterators.filter(authorizables, Predicates.notNull()), - new AuthorizableToPrincipal()); + Iterator<Principal> principals = Iterators.filter(Iterators.transform(authorizables, new AuthorizableToPrincipal()), Objects::nonNull); // everyone is injected only in complete set, not on pages boolean noRange = offset == 0 && limit == Long.MAX_VALUE; @@ -255,9 +253,9 @@ class PrincipalProviderImpl implements P private static final class EveryonePredicate implements Predicate<Principal> { private boolean servedEveryone = false; @Override - public boolean apply(@Nullable Principal principal) { - String pName = (principal == null) ? null : principal.getName(); - if (EveryonePrincipal.NAME.equals(pName)) { + public boolean apply(Principal principal) { + // principal must never be null as the result was already filtered for null. + if (EveryonePrincipal.NAME.equals(principal.getName())) { if (servedEveryone) { return false; } else { Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java?rev=1858534&r1=1858533&r2=1858534&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java Thu May 2 12:34:12 2019 @@ -27,6 +27,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import com.google.common.collect.Iterators; import org.apache.jackrabbit.api.security.principal.GroupPrincipal; import org.apache.jackrabbit.api.security.principal.ItemBasedPrincipal; import org.apache.jackrabbit.api.security.principal.PrincipalManager; @@ -42,6 +43,7 @@ import org.apache.jackrabbit.oak.spi.sec import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider; import org.apache.jackrabbit.oak.spi.security.principal.SystemUserPrincipal; import org.apache.jackrabbit.oak.spi.security.user.UserConstants; +import org.jetbrains.annotations.NotNull; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -110,16 +112,18 @@ public abstract class AbstractPrincipalP } } + @NotNull protected abstract PrincipalProvider createPrincipalProvider(); @Test - public void testGetPrincipals() throws Exception { + public void testGetPrincipals() { String adminId = adminSession.getAuthInfo().getUserID(); Set<? extends Principal> principals = principalProvider.getPrincipals(adminId); assertNotNull(principals); assertFalse(principals.isEmpty()); assertTrue(principals.contains(EveryonePrincipal.getInstance())); + assertEquals(adminSession.getAuthInfo().getPrincipals(), principals); for (Principal principal : principals) { assertNotNull(principalProvider.getPrincipal(principal.getName())); @@ -127,6 +131,28 @@ public abstract class AbstractPrincipalP } @Test + public void testGetPrincipalsNonExistingId() throws Exception { + assertNull(getUserManager(root).getAuthorizable("nonExisting")); + assertTrue(principalProvider.getPrincipals("nonExisting").isEmpty()); + } + + @Test + public void testGetPrincipalsForGroup() throws Exception { + Authorizable group = null; + try { + group = getUserManager(root).createGroup("testGroup"); + root.commit(); + + assertTrue(principalProvider.getPrincipals(group.getID()).isEmpty()); + } finally { + if (group != null) { + group.remove(); + root.commit(); + } + } + } + + @Test public void testGetItemBasedPrincipal() throws Exception { assertTrue(userPrincipal instanceof ItemBasedPrincipal); String jcrPath = ((ItemBasedPrincipal) userPrincipal).getPath(); @@ -149,7 +175,7 @@ public abstract class AbstractPrincipalP } @Test - public void testGetitemBasedPrincipalPropertyPath() throws Exception { + public void testGetItemBasedPrincipalPropertyPath() throws Exception { String propPath = PathUtils.concat(((ItemBasedPrincipal) userPrincipal).getPath(), UserConstants.REP_PRINCIPAL_NAME); assertNull(principalProvider.getItemBasedPrincipal(getNamePathMapper().getOakPath(propPath))); } @@ -435,4 +461,18 @@ public abstract class AbstractPrincipalP } return l; } + + @Test + public void testFindRangeNegativeOffset() { + List<String> expected = Arrays.asList(groupId, groupId2, groupId3); + Collections.sort(expected); + + for (int limit = -1; limit < expected.size() + 2; limit++) { + Iterator<? extends Principal> i1 = principalProvider.findPrincipals("testGroup", false, + PrincipalManager.SEARCH_TYPE_ALL, -1, limit); + Iterator<? extends Principal> i2 = principalProvider.findPrincipals("testGroup", true, + PrincipalManager.SEARCH_TYPE_ALL, 0, limit); + assertTrue(Iterators.elementsEqual(i1, i2)); + } + } } Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java?rev=1858534&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java (added) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java Thu May 2 12:34:12 2019 @@ -0,0 +1,180 @@ +/* + * 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.jackrabbit.oak.security.principal; + +import com.google.common.collect.Iterators; +import com.google.common.collect.Sets; +import org.apache.jackrabbit.api.security.principal.PrincipalManager; +import org.apache.jackrabbit.api.security.user.Query; +import org.apache.jackrabbit.api.security.user.User; +import org.apache.jackrabbit.api.security.user.UserManager; +import org.apache.jackrabbit.oak.AbstractSecurityTest; +import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; +import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal; +import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl; +import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider; +import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; +import org.jetbrains.annotations.NotNull; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import javax.jcr.RepositoryException; + +import java.security.Principal; +import java.util.Iterator; + +import static org.apache.jackrabbit.oak.namepath.NamePathMapper.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; + +public class PrincipalProviderImplErrorTest extends AbstractSecurityTest { + + private User testUser; + private UserManager umMock; + private PrincipalProviderImpl principalProvider; + + @Before + public void before() throws Exception { + super.before(); + + testUser = getTestUser(); + + Answer throwingAnswer = (Answer<Object>) invocation -> { + throw new RepositoryException(); + }; + umMock = mock(UserManager.class, throwingAnswer); + principalProvider = createPrincipalProvider(umMock); + } + + private PrincipalProviderImpl createPrincipalProvider(@NotNull UserManager um) { + UserConfiguration uc = when(mock(UserConfiguration.class).getUserManager(any(Root.class), any(NamePathMapper.class))).thenReturn(um).getMock(); + return new PrincipalProviderImpl(root, uc, DEFAULT); + } + + @Test + public void testGetPrincipal() throws Exception { + String principalName = testUser.getPrincipal().getName(); + assertNull(principalProvider.getPrincipal(getTestUser().getPrincipal().getName())); + + verify(umMock, times(1)).getAuthorizable(new PrincipalImpl(principalName)); + } + + @Test + public void testGetPrincipalFailsOnUser() throws Exception { + String principalName = testUser.getPrincipal().getName(); + Principal p = new PrincipalImpl(principalName); + + User userMock = when(mock(User.class).getPrincipal()).thenThrow(new RepositoryException()).getMock(); + UserManager um = when(mock(UserManager.class).getAuthorizable(p)).thenReturn(userMock).getMock(); + + assertNull(createPrincipalProvider(um).getPrincipal(getTestUser().getPrincipal().getName())); + verify(um, times(1)).getAuthorizable(p); + verify(userMock, times(1)).getPrincipal(); + } + + @Test + public void testGetEveryone() throws Exception { + assertSame(EveryonePrincipal.getInstance(), principalProvider.getPrincipal(EveryonePrincipal.NAME)); + + verify(umMock, times(1)).getAuthorizable(new PrincipalImpl(EveryonePrincipal.NAME)); + } + + @Test + public void testGetItemBasedPrincipal() throws Exception { + String jcrPath = getTestUser().getPath(); + String oakPath = getNamePathMapper().getOakPath(jcrPath); + assertNotNull(oakPath); + assertNull(principalProvider.getItemBasedPrincipal(oakPath)); + + verify(umMock, times(1)).getAuthorizableByPath(jcrPath); + } + + @Test + public void testGetMembershipPrincipals() throws Exception { + assertTrue(principalProvider.getMembershipPrincipals(testUser.getPrincipal()).isEmpty()); + + verify(umMock, times(1)).getAuthorizable(testUser.getPrincipal()); + } + + @Test + public void testGetMembershipPrincipalsFailsOnUser() throws Exception { + Principal p = testUser.getPrincipal(); + + User userMock = when(mock(User.class).memberOf()).thenThrow(new RepositoryException()).getMock(); + UserManager um = when(mock(UserManager.class).getAuthorizable(p)).thenReturn(userMock).getMock(); + + assertEquals(Sets.newHashSet(EveryonePrincipal.getInstance()), createPrincipalProvider(um).getMembershipPrincipals(p)); + + verify(um, times(1)).getAuthorizable(p); + verify(userMock, times(1)).memberOf(); + } + + @Test + public void testGetPrincipals() throws Exception { + assertTrue(principalProvider.getPrincipals(testUser.getID()).isEmpty()); + + verify(umMock, times(1)).getAuthorizable(testUser.getID()); + } + + @Test + public void testFindByTypeUser() throws Exception { + assertFalse(principalProvider.findPrincipals(PrincipalManager.SEARCH_TYPE_NOT_GROUP).hasNext()); + + verify(umMock, times(1)).findAuthorizables(any(Query.class)); + } + + @Test + public void testFindByTypeGroup() throws Exception { + assertFalse(principalProvider.findPrincipals(PrincipalManager.SEARCH_TYPE_GROUP).hasNext()); + + verify(umMock, times(1)).findAuthorizables(any(Query.class)); + } + + @Test + public void testFind() throws Exception { + assertFalse(principalProvider.findPrincipals(testUser.getPrincipal().getName(), false, PrincipalManager.SEARCH_TYPE_NOT_GROUP, 0, Long.MAX_VALUE).hasNext()); + + verify(umMock, times(1)).findAuthorizables(any(Query.class)); + } + + @Test + public void testFindFailsOnUser() throws Exception { + Principal p = testUser.getPrincipal(); + + User userMock = when(mock(User.class).getPrincipal()).thenThrow(new RepositoryException()).getMock(); + UserManager um = when(mock(UserManager.class).findAuthorizables(any(Query.class))).thenReturn(Iterators.singletonIterator(userMock)).getMock(); + + Iterator it = createPrincipalProvider(um).findPrincipals(PrincipalManager.SEARCH_TYPE_NOT_GROUP); + assertFalse(it.hasNext()); + + verify(userMock, times(1)).getPrincipal(); + } +} \ No newline at end of file Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplErrorTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplTest.java?rev=1858534&r1=1858533&r2=1858534&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImplTest.java Thu May 2 12:34:12 2019 @@ -17,29 +17,56 @@ package org.apache.jackrabbit.oak.security.principal; import java.security.Principal; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; +import java.util.List; import java.util.Set; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterators; +import com.google.common.collect.Lists; import org.apache.jackrabbit.api.security.principal.GroupPrincipal; import org.apache.jackrabbit.api.security.principal.PrincipalManager; +import org.apache.jackrabbit.api.security.user.Authorizable; import org.apache.jackrabbit.api.security.user.Group; +import org.apache.jackrabbit.api.security.user.Query; +import org.apache.jackrabbit.api.security.user.User; import org.apache.jackrabbit.api.security.user.UserManager; +import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal; +import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl; import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider; +import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; +import org.jetbrains.annotations.NotNull; import org.junit.Test; +import static org.apache.jackrabbit.oak.namepath.NamePathMapper.DEFAULT; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class PrincipalProviderImplTest extends AbstractPrincipalProviderTest { + @NotNull + @Override protected PrincipalProvider createPrincipalProvider() { return new PrincipalProviderImpl(root, getUserConfiguration(), namePathMapper); } + private PrincipalProviderImpl createPrincipalProvider(@NotNull UserManager um) { + UserConfiguration uc = when(mock(UserConfiguration.class).getUserManager(any(Root.class), any(NamePathMapper.class))).thenReturn(um).getMock(); + return new PrincipalProviderImpl(root, uc, DEFAULT); + } + @Test public void testEveryoneMembers() throws Exception { Principal everyone = principalProvider.getPrincipal(EveryonePrincipal.NAME); @@ -71,4 +98,52 @@ public class PrincipalProviderImplTest e } } } + + @Test + public void testGetGroupMembershipNonGroupPrincipal() throws Exception { + // Group.getPrincipal doesn't return a GroupPrincipal + Group gr = when(mock(Group.class).getPrincipal()).thenReturn(new PrincipalImpl("group")).getMock(); + Authorizable mockAuthorizable = when(mock(User.class).memberOf()).thenReturn(Iterators.singletonIterator(gr)).getMock(); + UserManager umMock = when(mock(UserManager.class).getAuthorizable(any(Principal.class))).thenReturn(mockAuthorizable).getMock(); + + Set<Principal> membership = createPrincipalProvider(umMock).getMembershipPrincipals(new PrincipalImpl("userPrincipal")); + assertEquals(ImmutableSet.of(EveryonePrincipal.getInstance()), membership); + } + + @Test + public void testGetItemBasedPrincipalNotItemBased() throws Exception { + Authorizable mockUser = when(mock(User.class).getPrincipal()).thenReturn(new PrincipalImpl("noPath")).getMock(); + UserManager umMock = mock(UserManager.class); + when(umMock.getAuthorizableByPath(anyString())).thenReturn(mockUser); + + createPrincipalProvider(umMock).getItemBasedPrincipal("/path/to/authorizable"); + verify(umMock, times(1)).getAuthorizableByPath("/path/to/authorizable"); + } + + @Test + public void testFindWithUnexpectedNullAuthorizable() throws Exception { + List<Authorizable> l = new ArrayList<>(); + l.add(null); + UserManager umMock = mock(UserManager.class); + when(umMock.findAuthorizables(any(Query.class))).thenReturn(l.iterator()); + + Iterator<? extends Principal> result = createPrincipalProvider(umMock).findPrincipals(PrincipalManager.SEARCH_TYPE_NOT_GROUP); + assertFalse(result.hasNext()); + + result = createPrincipalProvider(umMock).findPrincipals(PrincipalManager.SEARCH_TYPE_GROUP); + assertTrue(Iterators.elementsEqual(Iterators.singletonIterator(EveryonePrincipal.getInstance()), result)); + } + + @Test + public void testFindWithUnexpectedNullPrincipal() throws Exception { + Authorizable userMock = when(mock(Authorizable.class).getPrincipal()).thenReturn(null).getMock(); + UserManager umMock = mock(UserManager.class); + when(umMock.findAuthorizables(any(Query.class))).thenReturn(Iterators.singletonIterator(userMock)); + + Iterator<? extends Principal> result = createPrincipalProvider(umMock).findPrincipals(PrincipalManager.SEARCH_TYPE_NOT_GROUP); + assertFalse(result.hasNext()); + + result = createPrincipalProvider(umMock).findPrincipals(PrincipalManager.SEARCH_TYPE_GROUP); + assertTrue(Iterators.elementsEqual(Iterators.singletonIterator(EveryonePrincipal.getInstance()), result)); + } } \ No newline at end of file Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java?rev=1858534&r1=1858533&r2=1858534&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java Thu May 2 12:34:12 2019 @@ -30,12 +30,14 @@ import org.apache.jackrabbit.oak.securit import org.apache.jackrabbit.oak.spi.security.principal.AdminPrincipal; import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal; import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider; +import org.jetbrains.annotations.NotNull; import org.junit.Test; import static org.junit.Assert.assertTrue; public class UserPrincipalProviderTest extends AbstractPrincipalProviderTest { + @NotNull @Override protected PrincipalProvider createPrincipalProvider() { return new UserPrincipalProvider(root, getUserConfiguration(), namePathMapper); Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderWithCacheTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderWithCacheTest.java?rev=1858534&r1=1858533&r2=1858534&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderWithCacheTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderWithCacheTest.java Thu May 2 12:34:12 2019 @@ -53,6 +53,7 @@ import org.apache.jackrabbit.oak.spi.sec import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; import org.apache.jackrabbit.oak.util.NodeUtil; import org.apache.jackrabbit.oak.plugins.tree.TreeUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.Test; @@ -103,6 +104,7 @@ public class UserPrincipalProviderWithCa ); } + @NotNull @Override protected PrincipalProvider createPrincipalProvider() { return createPrincipalProvider(root);