/* * JBoss, Home of Professional Open Source. * Copyright 2017 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * Licensed 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.wildfly.security.auth.realm.cache; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.security.Principal; import java.util.LinkedList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.wildfly.security.auth.SupportLevel; import org.wildfly.security.auth.server.RealmIdentity; import org.wildfly.security.auth.server.RealmUnavailableException; import org.wildfly.security.cache.LRURealmIdentityCache; import org.wildfly.security.cache.RealmIdentityCache; import org.wildfly.security.credential.Credential; import org.wildfly.security.evidence.Evidence; /** * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a> */ public class LRURealmIdentityCacheTest { private static int count = 0; private RealmIdentityCache cache; private List<Principal> principals = new LinkedList<>(); @Before public void onBefore() { for (int i = 0; i < 5; i++) { createPrincipal(principals); } cache = new LRURealmIdentityCache(5); cache.put(principals.get(0), createRealmIdentity()); cache.put(principals.get(1), createRealmIdentity()); cache.put(principals.get(2), createRealmIdentity()); cache.put(principals.get(3), createRealmIdentity()); cache.put(principals.get(4), createRealmIdentity()); } private Principal createPrincipal(List<Principal> principals) { String name = String.valueOf(count++); Principal principal = new Principal() { @Override public String getName() { return name; } @Override public String toString() { return name; } }; principals.add(principal); return principal; } @Test public void testMaxEntries() { LinkedList<Principal> expected = new LinkedList<>(); cache.put(createPrincipal(expected), createRealmIdentity()); assertNull(cache.get(principals.get(0))); assertNotNull(cache.get(principals.get(1))); assertNotNull(cache.get(principals.get(2))); assertNotNull(cache.get(principals.get(3))); assertNotNull(cache.get(principals.get(4))); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); assertNull(cache.get(principals.get(0))); assertNull(cache.get(principals.get(1))); assertNotNull(cache.get(principals.get(2))); assertNotNull(cache.get(principals.get(3))); assertNotNull(cache.get(principals.get(4))); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); assertNull(cache.get(principals.get(0))); assertNull(cache.get(principals.get(1))); assertNull(cache.get(principals.get(2))); assertNotNull(cache.get(principals.get(3))); assertNotNull(cache.get(principals.get(4))); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); cache.put(createPrincipal(expected), createRealmIdentity()); assertNull(cache.get(principals.get(0))); assertNull(cache.get(principals.get(1))); assertNull(cache.get(principals.get(2))); assertNull(cache.get(principals.get(3))); assertNull(cache.get(principals.get(4))); for (int i = expected.size() - 1; i >= expected.size() - 5; i--) { assertNotNull(cache.get(expected.get(i))); } for (int i = 0; i < expected.size() - 5; i++) { assertNull(cache.get(expected.get(i))); } for (int i = 0; i < principals.size(); i++) { assertNull(cache.get(principals.get(i))); } } @Test public void testRemove() { cache.remove(principals.get(3)); assertNull(cache.get(principals.get(3))); cache.remove(principals.get(0)); assertNull(cache.get(principals.get(0))); cache.remove(principals.get(4)); assertNull(cache.get(principals.get(4))); } @Test public void testClear() { cache.clear(); for (Principal principal : principals) { assertNull(cache.get(principal)); } } private RealmIdentity createRealmIdentity() { return new RealmIdentity() { @Override public Principal getRealmIdentityPrincipal() { return null; } @Override public SupportLevel getCredentialAcquireSupport(Class<? extends Credential> credentialType, String algorithmName) throws RealmUnavailableException { return null; } @Override public <C extends Credential> C getCredential(Class<C> credentialType) throws RealmUnavailableException { return null; } @Override public SupportLevel getEvidenceVerifySupport(Class<? extends Evidence> evidenceType, String algorithmName) throws RealmUnavailableException { return null; } @Override public boolean verifyEvidence(Evidence evidence) throws RealmUnavailableException { return false; } @Override public boolean exists() throws RealmUnavailableException { return false; } }; } }