keycloak-uncached

Changes

testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java 159(+0 -159)

testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java 570(+0 -570)

testsuite/integration-deprecated/src/test/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory 4(+0 -4)

testsuite/integration-deprecated/src/test/resources/storage-test/read-only-user-password.properties 4(+0 -4)

testsuite/integration-deprecated/src/test/resources/storage-test/user-password.properties 4(+0 -4)

Details

diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
index 885c316..5cb6cf0 100644
--- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
+++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
@@ -16,13 +16,16 @@
  */
 package org.keycloak.testsuite.federation;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import org.keycloak.Config;
 import org.keycloak.component.ComponentModel;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.provider.ProviderConfigProperty;
 import org.keycloak.storage.UserStorageProviderFactory;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -34,9 +37,23 @@ public class UserMapStorageFactory implements UserStorageProviderFactory<UserMap
 
     public static final String PROVIDER_ID = "user-password-map-arq";
 
+    protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
+
+    static {
+        ProviderConfigProperty attr = new ProviderConfigProperty("attr", "attr",
+                "This is some attribute",
+                ProviderConfigProperty.STRING_TYPE, null);
+        configProperties.add(attr);
+    }
+
     protected Map<String, String> userPasswords = new HashMap<>();
 
     @Override
+    public List<ProviderConfigProperty> getConfigProperties() {
+        return configProperties;
+    }
+
+    @Override
     public UserMapStorage create(KeycloakSession session, ComponentModel model) {
         return new UserMapStorage(session, model, userPasswords);
     }
diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
index 7b57770..9d5abba 100644
--- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
+++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
@@ -1,4 +1,6 @@
 org.keycloak.testsuite.federation.DummyUserFederationProviderFactory
+org.keycloak.testsuite.federation.FailableHardcodedStorageProviderFactory
 org.keycloak.testsuite.federation.UserMapStorageFactory
 org.keycloak.testsuite.federation.UserPropertyFileStorageFactory
 org.keycloak.testsuite.federation.PassThroughFederatedUserStorageProviderFactory
+org.keycloak.testsuite.federation.sync.SyncDummyUserFederationProviderFactory
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
index c11b158..d083eb5 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
@@ -171,7 +171,7 @@ public final class TestContext {
     public TestCleanup getOrCreateCleanup(String realmName) {
         TestCleanup cleanup = cleanups.get(realmName);
         if (cleanup == null) {
-            cleanup = new TestCleanup(adminClient, realmName);
+            cleanup = new TestCleanup(this, realmName);
             TestCleanup existing = cleanups.putIfAbsent(realmName, cleanup);
 
             if (existing != null) {
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
index 76e37b0..96626d7 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
@@ -24,6 +24,7 @@ import javax.ws.rs.NotFoundException;
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.common.util.ConcurrentMultivaluedHashMap;
+import org.keycloak.testsuite.arquillian.TestContext;
 
 /**
  * Enlist resources to be cleaned after test method
@@ -42,15 +43,15 @@ public class TestCleanup {
     private static final String AUTH_FLOW_IDS = "AUTH_FLOW_IDS";
     private static final String AUTH_CONFIG_IDS = "AUTH_CONFIG_IDS";
 
-    private final Keycloak adminClient;
+    private final TestContext testContext;
     private final String realmName;
 
     // Key is kind of entity (eg. "client", "role", "user" etc), Values are all kind of entities of given type to cleanup
     private ConcurrentMultivaluedHashMap<String, String> entities = new ConcurrentMultivaluedHashMap<>();
 
 
-    public TestCleanup(Keycloak adminClient, String realmName) {
-        this.adminClient = adminClient;
+    public TestCleanup(TestContext testContext, String realmName) {
+        this.testContext = testContext;
         this.realmName = realmName;
     }
 
@@ -101,7 +102,7 @@ public class TestCleanup {
 
 
     public void executeCleanup() {
-        RealmResource realm = adminClient.realm(realmName);
+        RealmResource realm = getAdminClient().realm(realmName);
 
         List<String> userIds = entities.get(USER_IDS);
         if (userIds != null) {
@@ -204,4 +205,8 @@ public class TestCleanup {
         }
     }
 
+    private Keycloak getAdminClient() {
+        return testContext.getAdminClient();
+    }
+
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
index cc57b8e..7fa431f 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
@@ -18,19 +18,26 @@ import org.keycloak.common.util.MultivaluedHashMap;
 import org.keycloak.exportimport.ExportImportConfig;
 import org.keycloak.exportimport.ExportImportManager;
 import org.keycloak.exportimport.singlefile.SingleFileExportProviderFactory;
+import org.keycloak.models.RealmModel;
 import org.keycloak.representations.idm.ComponentRepresentation;
+import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.storage.UserStorageProvider;
 import org.keycloak.testsuite.AbstractAuthTest;
 import org.keycloak.testsuite.admin.ApiUtil;
 import static org.keycloak.testsuite.auth.page.AuthRealm.TEST;
+
+import org.keycloak.testsuite.client.KeycloakTestingClient;
 import org.keycloak.testsuite.federation.UserMapStorageFactory;
 import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
+import org.keycloak.testsuite.util.RealmBuilder;
 
 /**
  *
  * @author tkyjovsk
  */
-public class ComponentExportImportTest extends AbstractAuthTest implements Serializable {
+public class ComponentExportImportTest extends AbstractAuthTest {
+
+    private static final String REALM_NAME = "exported-component";
 
     private File exportFile;
 
@@ -44,35 +51,55 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
     public void setDirs() {
         exportFile = new File (new File(System.getProperty("auth.server.config.dir", "target")), "singleFile-full.json");
         log.infof("Export file: %s", exportFile);
+
+        // Remove realm if exists
+        testingClient.server().run(session -> {
+            RealmModel realm = session.realms().getRealmByName(REALM_NAME);
+            if (realm != null) {
+                session.realms().removeRealm(realm.getId());
+            }
+        });
     }
 
-    public void clearExportImportProperties() {
-        // Clear export/import properties after test
-        Properties systemProps = System.getProperties();
-        Set<String> propsToRemove = new HashSet<>();
 
-        for (Object key : systemProps.keySet()) {
-            if (key.toString().startsWith(ExportImportConfig.PREFIX)) {
-                propsToRemove.add(key.toString());
+    @Override
+    public RealmResource testRealmResource() {
+        return adminClient.realm(REALM_NAME);
+    }
+
+
+    static void clearExportImportProperties(KeycloakTestingClient testingClient) {
+        testingClient.server().run(session -> {
+            // Clear export/import properties after test
+            Properties systemProps = System.getProperties();
+            Set<String> propsToRemove = new HashSet<>();
+
+            for (Object key : systemProps.keySet()) {
+                if (key.toString().startsWith(ExportImportConfig.PREFIX)) {
+                    propsToRemove.add(key.toString());
+                }
             }
-        }
 
-        for (String propToRemove : propsToRemove) {
-            systemProps.remove(propToRemove);
-        }
+            for (String propToRemove : propsToRemove) {
+                systemProps.remove(propToRemove);
+            }
+        });
     }
 
+
     protected String addComponent(ComponentRepresentation component) {
         return ApiUtil.getCreatedId(testRealmResource().components().add(component));
     }
 
     @Test
-    @Ignore
     public void testSingleFile() {
-        clearExportImportProperties();
+        clearExportImportProperties(testingClient);
 
+        RealmRepresentation realmRep = RealmBuilder.create()
+                .name(REALM_NAME)
+                .build();
+        adminClient.realms().create(realmRep);
         String realmId = testRealmResource().toRepresentation().getId();
-        String realmName = testRealmResource().toRepresentation().getRealm();
 
         ComponentRepresentation parentComponent = new ComponentRepresentation();
         parentComponent.setParentId(realmId);
@@ -96,23 +123,36 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
         subcomponent.getConfig().putSingle("attr", "value2");
         String subcomponentId = addComponent(subcomponent);
 
+        final String exportFilePath = exportFile.getAbsolutePath();
+
         // export 
         testingClient.server().run(session -> {
             ExportImportConfig.setProvider(SingleFileExportProviderFactory.PROVIDER_ID);
-            ExportImportConfig.setFile(exportFile.getAbsolutePath());
-            ExportImportConfig.setRealmName(realmName);
+            ExportImportConfig.setFile(exportFilePath);
+            ExportImportConfig.setRealmName(REALM_NAME);
             ExportImportConfig.setAction(ExportImportConfig.ACTION_EXPORT);
             new ExportImportManager(session).runExport();
         });
 
+        testRealmResource().remove();
+
+        try {
+            testRealmResource().toRepresentation();
+            Assert.fail("Realm wasn't expected to be found");
+        } catch (NotFoundException nfe) {
+            // Expected
+        }
+
         // import 
         testingClient.server().run(session -> {
-            Assert.assertNull(session.realms().getRealmByName(TEST));
+            Assert.assertNull(session.realms().getRealmByName(REALM_NAME));
             ExportImportConfig.setAction(ExportImportConfig.ACTION_IMPORT);
             new ExportImportManager(session).runImport();
-            Assert.assertNotNull(session.realms().getRealmByName(TEST));
         });
 
+        // Assert realm was imported
+        Assert.assertNotNull(testRealmResource().toRepresentation());
+
         try {
             parentComponent = testRealmResource().components().component(parentComponentId).toRepresentation();
             subcomponent = testRealmResource().components().component(subcomponentId).toRepresentation();
@@ -127,7 +167,7 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
         Assert.assertEquals(parentComponent.getProviderType(), UserStorageProvider.class.getName());
         Assert.assertEquals(parentComponent.getConfig().getFirst("attr"), "value");
 
-        Assert.assertEquals(subcomponent.getParentId(), realmId);
+        Assert.assertEquals(subcomponent.getParentId(), parentComponent.getId());
         Assert.assertEquals(subcomponent.getName(), "child");
         Assert.assertEquals(subcomponent.getSubType(), "subtype2");
         Assert.assertEquals(subcomponent.getProviderId(), UserMapStorageFactory.PROVIDER_ID);
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
index 413e9cf..25a3eb5 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
@@ -28,8 +28,13 @@ import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.UserResource;
 import org.keycloak.common.util.MultivaluedHashMap;
+import org.keycloak.component.ComponentModel;
+import org.keycloak.credential.CredentialAuthentication;
+import org.keycloak.credential.UserCredentialStoreManager;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 import static org.keycloak.models.UserModel.RequiredAction.UPDATE_PROFILE;
@@ -48,6 +53,7 @@ import static org.keycloak.storage.UserStorageProviderModel.EVICTION_MINUTE;
 import static org.keycloak.storage.UserStorageProviderModel.MAX_LIFESPAN;
 import org.keycloak.testsuite.AbstractAuthTest;
 import org.keycloak.testsuite.admin.ApiUtil;
+import org.keycloak.testsuite.arquillian.annotation.ModelTest;
 import org.keycloak.testsuite.federation.UserMapStorage;
 import org.keycloak.testsuite.federation.UserMapStorageFactory;
 import org.keycloak.testsuite.federation.UserPropertyFileStorageFactory;
@@ -61,6 +67,8 @@ import java.util.Map;
 import javax.mail.internet.MimeMessage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.junit.Rule;
+import org.keycloak.testsuite.util.TestCleanup;
+
 import static org.keycloak.testsuite.actions.RequiredActionEmailVerificationTest.getPasswordResetEmailLink;
 import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlDoesntStartWith;
 import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith;
@@ -154,11 +162,15 @@ public class UserStorageTest extends AbstractAuthTest {
         return propProviderRW;
     }
 
-    protected String addComponent(ComponentRepresentation component) {
-        Response resp = testRealmResource().components().add(component);
+    private String addComponent(ComponentRepresentation component) {
+        return addComponent(testRealmResource(), getCleanup(), component);
+    }
+
+    static String addComponent(RealmResource realmResource, TestCleanup testCleanup, ComponentRepresentation component) {
+        Response resp = realmResource.components().add(component);
         resp.close();
         String id = ApiUtil.getCreatedId(resp);
-        getCleanup().addComponentId(id);
+        testCleanup.addComponentId(id);
         return id;
     }
 
@@ -183,6 +195,17 @@ public class UserStorageTest extends AbstractAuthTest {
         });
     }
 
+    /**
+     * KEYCLOAK-4013
+     *
+     * @throws Exception
+     */
+    @Test
+    @ModelTest
+    public void testCast(KeycloakSession session) throws Exception {
+        List<CredentialAuthentication> list = UserCredentialStoreManager.getCredentialProviders(session, null, CredentialAuthentication.class);
+    }
+
     @Test
     public void testLoginSuccess() {
         loginSuccessAndLogout("tbrady", "goat");
@@ -416,13 +439,28 @@ public class UserStorageTest extends AbstractAuthTest {
         Assert.assertTrue(usernames.contains("thor"));
 
         // search by single attribute
-        // FIXME - no equivalent for model in REST
+        testingClient.server().run(session -> {
+            System.out.println("search by single attribute");
+
+            RealmModel realm = session.realms().getRealmByName("test");
+            UserModel userModel = session.users().getUserByUsername("thor", realm);
+            userModel.setSingleAttribute("weapon", "hammer");
+
+            List<UserModel> userModels = session.users().searchForUserByUserAttribute("weapon", "hammer", realm);
+            for (UserModel u : userModels) {
+                System.out.println(u.getUsername());
+
+            }
+            Assert.assertEquals(1, userModels.size());
+            Assert.assertEquals("thor", userModels.get(0).getUsername());
+        });
     }
 
     @Deployment
     public static WebArchive deploy() {
         return RunOnServerDeployment.create(UserResource.class)
-                .addPackages(true, "org.keycloak.testsuite");
+                .addPackages(true, "org.keycloak.testsuite")
+                .addPackages(true, "org.keycloak.admin.client.resource");
     }
 
     private void setDailyEvictionTime(int hour, int minutes) {
@@ -677,6 +715,26 @@ public class UserStorageTest extends AbstractAuthTest {
             System.out.println("User class: " + user.getClass());
             Assert.assertFalse(user instanceof CachedUserModel); // should be evicted
         });
+
+
+        testingClient.server().run(session -> {
+            RealmModel realm = session.realms().getRealmByName("test");
+            UserModel thor2 = session.users().getUserByUsername("thor", realm);
+            Assert.assertFalse(thor2 instanceof CachedUserModel);
+        });
+
+        propProviderRW = testRealmResource().components().component(propProviderRWId).toRepresentation();
+        propProviderRW.getConfig().putSingle(CACHE_POLICY, CachePolicy.DEFAULT.name());
+        propProviderRW.getConfig().remove("evictionHour");
+        propProviderRW.getConfig().remove("evictionMinute");
+        propProviderRW.getConfig().remove("evictionDay");
+        testRealmResource().components().component(propProviderRWId).update(propProviderRW);
+
+        testingClient.server().run(session -> {
+            RealmModel realm = session.realms().getRealmByName("test");
+            UserModel thor = session.users().getUserByUsername("thor", realm);
+            System.out.println("Foo");
+        });
     }
 
     @Test
diff --git a/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml b/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
index 24d714a..95ff75e 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
+++ b/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
@@ -13,6 +13,8 @@
             <module name="org.keycloak.keycloak-kerberos-federation"/>
             <module name="org.keycloak.keycloak-ldap-federation"/>
             <module name="org.infinispan"/>
+            <module name="org.apache.commons.io"/>
+            <module name="org.apache.httpcomponents.core"/>
         </dependencies>
     </deployment>
 </jboss-deployment-structure>
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
index cf19917..7af2a7b 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
  * and other contributors as indicated by the @author tags.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +16,12 @@
  */
 package org.keycloak.testsuite.federation.storage;
 
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.logging.Logger;
 import org.keycloak.component.ComponentModel;
 import org.keycloak.credential.CredentialInput;
 import org.keycloak.credential.CredentialInputUpdater;
@@ -33,23 +39,23 @@ import org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage;
 import org.keycloak.storage.user.UserLookupProvider;
 import org.keycloak.storage.user.UserRegistrationProvider;
 
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
 public class UserMapStorage implements UserLookupProvider, UserStorageProvider, UserRegistrationProvider, CredentialInputUpdater, CredentialInputValidator {
 
+    private static final Logger log = Logger.getLogger(UserMapStorage.class);
+    
     protected Map<String, String> userPasswords;
     protected ComponentModel model;
     protected KeycloakSession session;
 
     public static final AtomicInteger allocations = new AtomicInteger(0);
     public static final AtomicInteger closings = new AtomicInteger(0);
+    public static final AtomicInteger realmRemovals = new AtomicInteger(0);
+    public static final AtomicInteger groupRemovals = new AtomicInteger(0);
+    public static final AtomicInteger roleRemovals = new AtomicInteger(0);
 
     public UserMapStorage(KeycloakSession session, ComponentModel model, Map<String, String> userPasswords) {
         this.session = session;
@@ -58,18 +64,19 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider, 
         allocations.incrementAndGet();
     }
 
-
     @Override
     public UserModel getUserById(String id, RealmModel realm) {
         StorageId storageId = new StorageId(id);
         final String username = storageId.getExternalId();
-        if (!userPasswords.containsKey(username)) return null;
+        if (!userPasswords.containsKey(username)) {
+            return null;
+        }
 
         return createUser(realm, username);
     }
 
     private UserModel createUser(RealmModel realm, String username) {
-        return new AbstractUserAdapterFederatedStorage(session, realm,  model) {
+        return new AbstractUserAdapterFederatedStorage(session, realm, model) {
             @Override
             public String getUsername() {
                 return username;
@@ -90,9 +97,11 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider, 
 
     @Override
     public boolean updateCredential(RealmModel realm, UserModel user, CredentialInput input) {
-        if (!(input instanceof UserCredentialModel)) return false;
+        if (!(input instanceof UserCredentialModel)) {
+            return false;
+        }
         if (input.getType().equals(UserCredentialModel.PASSWORD)) {
-            userPasswords.put(user.getUsername(), ((UserCredentialModel)input).getValue());
+            userPasswords.put(user.getUsername(), ((UserCredentialModel) input).getValue());
             return true;
 
         } else {
@@ -117,10 +126,12 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider, 
 
     @Override
     public boolean isValid(RealmModel realm, UserModel user, CredentialInput input) {
-        if (!(input instanceof UserCredentialModel)) return false;
+        if (!(input instanceof UserCredentialModel)) {
+            return false;
+        }
         if (input.getType().equals(UserCredentialModel.PASSWORD)) {
             String pw = userPasswords.get(user.getUsername());
-            return pw != null && pw.equals( ((UserCredentialModel)input).getValue());
+            return pw != null && pw.equals(((UserCredentialModel) input).getValue());
         } else {
             return false;
         }
@@ -128,7 +139,9 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider, 
 
     @Override
     public UserModel getUserByUsername(String username, RealmModel realm) {
-        if (!userPasswords.containsKey(username)) return null;
+        if (!userPasswords.containsKey(username)) {
+            return null;
+        }
 
         return createUser(realm, username);
     }
@@ -151,22 +164,25 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider, 
 
     @Override
     public void preRemove(RealmModel realm) {
-
+        log.infof("preRemove: realm=%s", realm.getName());
+        realmRemovals.incrementAndGet();
     }
 
     @Override
     public void preRemove(RealmModel realm, GroupModel group) {
-
+        log.infof("preRemove: realm=%s, group=%s", realm.getName(), group.getName());
+        groupRemovals.incrementAndGet();
     }
 
     @Override
     public void preRemove(RealmModel realm, RoleModel role) {
-
+        log.infof("preRemove: realm=%s, role=%s", realm.getName(), role.getName());
+        roleRemovals.incrementAndGet();
     }
 
     @Override
     public void close() {
         closings.incrementAndGet();
-
     }
+
 }
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
index 79e9261..b904f22 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
  * and other contributors as indicated by the @author tags.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +16,18 @@
  */
 package org.keycloak.testsuite.federation.storage;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.keycloak.Config;
 import org.keycloak.component.ComponentModel;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.provider.ProviderConfigProperty;
 import org.keycloak.storage.UserStorageProviderFactory;
 
-import java.util.Hashtable;
-import java.util.Map;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -32,9 +35,23 @@ import java.util.Map;
 public class UserMapStorageFactory implements UserStorageProviderFactory<UserMapStorage> {
 
 
-    public static final String PROVIDER_ID = "user-password-map";
+    public static final String PROVIDER_ID = "user-password-map-arq";
+
+    protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
 
-    protected Map<String, String> userPasswords = new Hashtable<>();
+    static {
+        ProviderConfigProperty attr = new ProviderConfigProperty("attr", "attr",
+                "This is some attribute",
+                ProviderConfigProperty.STRING_TYPE, null);
+        configProperties.add(attr);
+    }
+
+    protected Map<String, String> userPasswords = new HashMap<>();
+
+    @Override
+    public List<ProviderConfigProperty> getConfigProperties() {
+        return configProperties;
+    }
 
     @Override
     public UserMapStorage create(KeycloakSession session, ComponentModel model) {
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
index bab2c4a..e83937f 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
  * and other contributors as indicated by the @author tags.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +16,12 @@
  */
 package org.keycloak.testsuite.federation.storage;
 
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
 import org.keycloak.component.ComponentModel;
 import org.keycloak.credential.CredentialInput;
 import org.keycloak.credential.CredentialInputValidator;
@@ -32,12 +38,6 @@ import org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage;
 import org.keycloak.storage.user.UserLookupProvider;
 import org.keycloak.storage.user.UserQueryProvider;
 
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -137,7 +137,6 @@ public class UserPropertyFileStorage implements UserLookupProvider, UserStorageP
         }
     }
 
-
     @Override
     public int getUsersCount(RealmModel realm) {
         return userPasswords.size();
@@ -191,7 +190,6 @@ public class UserPropertyFileStorage implements UserLookupProvider, UserStorageP
 
     @Override
     public List<UserModel> searchForUser(Map<String, String> attributes, RealmModel realm, int firstResult, int maxResults) {
-        if (attributes.size() != 1) return Collections.EMPTY_LIST;
         String username = attributes.get(UserModel.USERNAME);
         if (username == null) return Collections.EMPTY_LIST;
         return searchForUser(username, realm, firstResult, maxResults);
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
index 02f97cd..a829ef9 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
  * and other contributors as indicated by the @author tags.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,39 +16,85 @@
  */
 package org.keycloak.testsuite.federation.storage;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+
 import org.keycloak.Config;
+import org.keycloak.common.util.EnvUtil;
 import org.keycloak.component.ComponentModel;
+import org.keycloak.component.ComponentValidationException;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.models.RealmModel;
 import org.keycloak.provider.ProviderConfigProperty;
+import org.keycloak.provider.ProviderConfigurationBuilder;
 import org.keycloak.storage.UserStorageProviderFactory;
 import org.keycloak.storage.UserStorageProviderModel;
 import org.keycloak.storage.user.ImportSynchronization;
 import org.keycloak.storage.user.SynchronizationResult;
 
-import java.io.IOException;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
 public class UserPropertyFileStorageFactory implements UserStorageProviderFactory<UserPropertyFileStorage>, ImportSynchronization {
 
+    public static final String PROVIDER_ID = "user-password-props-arq";
+    public static final String PROPERTY_FILE = "propertyFile";
 
-    public static final String PROVIDER_ID = "user-password-props";
+    public static final String VALIDATION_PROP_FILE_NOT_CONFIGURED = "user property file is not configured";
+    public static final String VALIDATION_PROP_FILE_DOESNT_EXIST = "user property file does not exist";
+
+    protected static final List<ProviderConfigProperty> CONFIG_PROPERTIES;
+
+    static {
+        CONFIG_PROPERTIES = ProviderConfigurationBuilder.create()
+                .property().name(PROPERTY_FILE)
+                .type(ProviderConfigProperty.STRING_TYPE)
+                .label("Property File")
+                .helpText("File that contains name value pairs")
+                .defaultValue(null)
+                .add()
+                .property().name("federatedStorage")
+                .type(ProviderConfigProperty.BOOLEAN_TYPE)
+                .label("User Federated Storage")
+                .helpText("User Federated Storage")
+                .defaultValue(null)
+                .add()
+                .build();
+    }
+
+    @Override
+    public void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel config) throws ComponentValidationException {
+        String fp = config.getConfig().getFirst(PROPERTY_FILE);
+        if (fp == null) {
+            throw new ComponentValidationException(VALIDATION_PROP_FILE_NOT_CONFIGURED);
+        }
+        fp = EnvUtil.replace(fp);
+        File file = new File(fp);
+        if (!file.exists()) {
+            throw new ComponentValidationException(VALIDATION_PROP_FILE_DOESNT_EXIST);
+        }
+    }
 
     @Override
     public UserPropertyFileStorage create(KeycloakSession session, ComponentModel model) {
+        String path = model.getConfig().getFirst(PROPERTY_FILE);
+        path = EnvUtil.replace(path);
+
         Properties props = new Properties();
-        try {
-            props.load(getClass().getResourceAsStream(model.getConfig().getFirst("propertyFile")));
+        try (InputStream is = new FileInputStream(path)) {
+            props.load(is);
+            is.close();
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
+
         return new UserPropertyFileStorage(session, model, props);
     }
 
@@ -57,17 +103,9 @@ public class UserPropertyFileStorageFactory implements UserStorageProviderFactor
         return PROVIDER_ID;
     }
 
-    static List<ProviderConfigProperty> OPTIONS = new LinkedList<>();
-    static {
-        ProviderConfigProperty prop = new ProviderConfigProperty("propertyFile", "Property File", "file that contains name value pairs", ProviderConfigProperty.STRING_TYPE, null);
-        OPTIONS.add(prop);
-        prop = new ProviderConfigProperty("federatedStorage", "User Federated Storage", "use federated storage?", ProviderConfigProperty.BOOLEAN_TYPE, null);
-        OPTIONS.add(prop);
-
-    }
     @Override
     public List<ProviderConfigProperty> getConfigProperties() {
-         return OPTIONS;
+        return CONFIG_PROPERTIES;
     }
 
     @Override
@@ -94,4 +132,5 @@ public class UserPropertyFileStorageFactory implements UserStorageProviderFactor
     public SynchronizationResult syncSince(Date lastSync, KeycloakSessionFactory sessionFactory, String realmId, UserStorageProviderModel model) {
         return SynchronizationResult.ignored();
     }
+
 }