package org.keycloak.testsuite.federation.storage;
import java.io.File;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import javax.ws.rs.NotFoundException;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
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.common.util.MultivaluedHashMap;
import org.keycloak.exportimport.ExportImportConfig;
import org.keycloak.exportimport.ExportImportManager;
import org.keycloak.exportimport.singlefile.SingleFileExportProviderFactory;
import org.keycloak.representations.idm.ComponentRepresentation;
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.federation.UserMapStorageFactory;
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
/**
*
* @author tkyjovsk
*/
public class ComponentExportImportTest extends AbstractAuthTest implements Serializable {
private File exportFile;
@Deployment
public static WebArchive deploy() {
return RunOnServerDeployment.create(ComponentExportImportTest.class, AbstractAuthTest.class, RealmResource.class)
.addPackages(true, "org.keycloak.testsuite");
}
@Before
public void setDirs() {
exportFile = new File (new File(System.getProperty("auth.server.config.dir", "target")), "singleFile-full.json");
log.infof("Export file: %s", exportFile);
}
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());
}
}
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();
String realmId = testRealmResource().toRepresentation().getId();
String realmName = testRealmResource().toRepresentation().getRealm();
ComponentRepresentation parentComponent = new ComponentRepresentation();
parentComponent.setParentId(realmId);
parentComponent.setName("parent");
parentComponent.setSubType("subtype");
parentComponent.setProviderId(UserMapStorageFactory.PROVIDER_ID);
parentComponent.setProviderType(UserStorageProvider.class.getName());
parentComponent.setConfig(new MultivaluedHashMap<>());
parentComponent.getConfig().putSingle("priority", Integer.toString(0));
parentComponent.getConfig().putSingle("attr", "value");
String parentComponentId = addComponent(parentComponent);
ComponentRepresentation subcomponent = new ComponentRepresentation();
subcomponent.setParentId(parentComponentId);
subcomponent.setName("child");
subcomponent.setSubType("subtype2");
subcomponent.setProviderId(UserMapStorageFactory.PROVIDER_ID);
subcomponent.setProviderType(UserStorageProvider.class.getName());
subcomponent.setConfig(new MultivaluedHashMap<>());
subcomponent.getConfig().putSingle("priority", Integer.toString(0));
subcomponent.getConfig().putSingle("attr", "value2");
String subcomponentId = addComponent(subcomponent);
// export
testingClient.server().run(session -> {
ExportImportConfig.setProvider(SingleFileExportProviderFactory.PROVIDER_ID);
ExportImportConfig.setFile(exportFile.getAbsolutePath());
ExportImportConfig.setRealmName(realmName);
ExportImportConfig.setAction(ExportImportConfig.ACTION_EXPORT);
new ExportImportManager(session).runExport();
});
// import
testingClient.server().run(session -> {
Assert.assertNull(session.realms().getRealmByName(TEST));
ExportImportConfig.setAction(ExportImportConfig.ACTION_IMPORT);
new ExportImportManager(session).runImport();
Assert.assertNotNull(session.realms().getRealmByName(TEST));
});
try {
parentComponent = testRealmResource().components().component(parentComponentId).toRepresentation();
subcomponent = testRealmResource().components().component(subcomponentId).toRepresentation();
} catch (NotFoundException nfe) {
fail("Components not found after import.");
}
Assert.assertEquals(parentComponent.getParentId(), realmId);
Assert.assertEquals(parentComponent.getName(), "parent");
Assert.assertEquals(parentComponent.getSubType(), "subtype");
Assert.assertEquals(parentComponent.getProviderId(), UserMapStorageFactory.PROVIDER_ID);
Assert.assertEquals(parentComponent.getProviderType(), UserStorageProvider.class.getName());
Assert.assertEquals(parentComponent.getConfig().getFirst("attr"), "value");
Assert.assertEquals(subcomponent.getParentId(), realmId);
Assert.assertEquals(subcomponent.getName(), "child");
Assert.assertEquals(subcomponent.getSubType(), "subtype2");
Assert.assertEquals(subcomponent.getProviderId(), UserMapStorageFactory.PROVIDER_ID);
Assert.assertEquals(subcomponent.getProviderType(), UserStorageProvider.class.getName());
Assert.assertEquals(subcomponent.getConfig().getFirst("attr"), "value2");
}
}