package org.jboss.resteasy.test.keystone;
import junit.framework.Assert;
import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.keystone.client.SkeletonKeyAdminClient;
import org.jboss.resteasy.keystone.client.SkeletonKeyClientBuilder;
import org.jboss.resteasy.keystone.model.Project;
import org.jboss.resteasy.keystone.model.Projects;
import org.jboss.resteasy.keystone.model.Role;
import org.jboss.resteasy.keystone.model.StoredUser;
import org.jboss.resteasy.keystone.model.User;
import org.jboss.resteasy.keystone.server.Loader;
import org.jboss.resteasy.keystone.server.SkeletonKeyApplication;
import org.jboss.resteasy.spi.ResteasyDeployment;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.test.EmbeddedContainer;
import org.junit.Test;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static org.jboss.resteasy.test.TestPortProvider.generateBaseUrl;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class PersistenceTest
{
private static ResteasyDeployment deployment;
private static SkeletonKeyApplication app;
public static void init() throws Exception
{
StoredUser admin = new StoredUser();
admin.setName("Bill");
admin.setUsername("wburke");
HashMap<String, String> creds = new HashMap<String, String>();
creds.put("password", "geheim");
admin.setCredentials(creds);
app.getUsers().create(admin);
Project project = new Project();
project.setName("Skeleton Key");
project.setEnabled(true);
app.getProjects().createProject(project);
Role adminRole = new Role();
adminRole.setName("admin");
app.getRoles().create(adminRole);
app.getProjects().addUserRole(project.getId(), admin.getId(), adminRole.getId());
// Test export/import
System.out.println(new Loader().export(app.getCache()));
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new Loader().export(app.getCache(), baos);
ByteArrayInputStream bios = new ByteArrayInputStream(baos.toByteArray());
app.getCache().clear();
new Loader().importStore(bios, app.getCache());
}
catch (Exception e)
{
}
}
private static void stopDeployment() throws Exception
{
app.getCache().stop();
deployment = null;
app = null;
EmbeddedContainer.stop();
}
public static class SApp extends Application
{
SkeletonKeyApplication app;
public SApp(@Context Configurable confgurable)
{
this.app = new SkeletonKeyApplication(confgurable);
}
@Override
public Set<Object> getSingletons()
{
return app.getSingletons();
}
}
private static void startDeployment() throws Exception
{
deployment = new ResteasyDeployment();
deployment.setSecurityEnabled(true);
deployment.setApplicationClass(SApp.class.getName());
ResteasyProviderFactory factory = new ResteasyProviderFactory();
deployment.setProviderFactory(factory);
factory.property(SkeletonKeyApplication.SKELETON_KEY_INFINISPAN_CONFIG_FILE, "cache.xml");
factory.property(SkeletonKeyApplication.SKELETON_KEY_INFINISPAN_CACHE_NAME, "idp-store");
EmbeddedContainer.start(deployment);
app = ((SApp)deployment.getApplication()).app;
}
@Test
public void testAppLoad() throws Exception
{
clearCache();
startDeployment();
init();
stopDeployment();
startDeployment();
ResteasyClient client = new ResteasyClientBuilder().build();
WebTarget target = client.target(generateBaseUrl());
SkeletonKeyAdminClient admin = new SkeletonKeyClientBuilder().username("wburke").password("geheim").idp(target).admin();
StoredUser newUser = new StoredUser();
newUser.setName("John Smith");
newUser.setUsername("jsmith");
newUser.setEnabled(true);
Map creds = new HashMap();
creds.put("password", "foobar");
newUser.setCredentials(creds);
Response response = admin.users().create(newUser);
User user = response.readEntity(User.class);
response = admin.roles().create("user");
Role role = response.readEntity(Role.class);
Projects projects = admin.projects().query("Skeleton Key");
Project project = projects.getList().get(0);
admin.projects().addUserRole(project.getId(), user.getId(), role.getId());
admin = new SkeletonKeyClientBuilder().username("jsmith").password("foobar").idp(target).admin();
response = admin.roles().create("error");
Assert.assertEquals(403, response.getStatus());
client.close();
stopDeployment();
}
@Test
public void testImportExport() throws Exception
{
clearCache();
startDeployment();
Assert.assertEquals(0, app.getCache().size());
init();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new Loader().export(app.getCache(), baos);
app.getCache().clear();
stopDeployment();
startDeployment();
Assert.assertEquals(0, app.getCache().size());
ByteArrayInputStream bios = new ByteArrayInputStream(baos.toByteArray());
new Loader().importStore(bios, app.getCache());
stopDeployment();
startDeployment();
Assert.assertTrue(0 < app.getCache().size());
ResteasyClient client = new ResteasyClientBuilder().build();
WebTarget target = client.target(generateBaseUrl());
SkeletonKeyAdminClient admin = new SkeletonKeyClientBuilder().username("wburke").password("geheim").idp(target).admin();
StoredUser newUser = new StoredUser();
newUser.setName("John Smith");
newUser.setUsername("jsmith");
newUser.setEnabled(true);
Map creds = new HashMap();
creds.put("password", "foobar");
newUser.setCredentials(creds);
Response response = admin.users().create(newUser);
User user = response.readEntity(User.class);
response = admin.roles().create("user");
Role role = response.readEntity(Role.class);
String json = target.path("projects").queryParam("name", "Skeleton Key").request().get(String.class);
Projects projects = admin.projects().query("Skeleton Key");
Project project = projects.getList().get(0);
admin.projects().addUserRole(project.getId(), user.getId(), role.getId());
admin = new SkeletonKeyClientBuilder().username("jsmith").password("foobar").idp(target).admin();
response = admin.roles().create("error");
Assert.assertEquals(403, response.getStatus());
client.close();
stopDeployment();
}
private void clearCache() throws IOException
{
Cache<Object,Object> cache = new DefaultCacheManager("cache.xml").getCache("idp-store");
cache.clear();
cache.stop();
}
}