/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.manualmode.security;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.container.test.api.Deployer;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.container.test.api.TargetsContainer;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.as.test.integration.management.base.AbstractCliTestBase;
import org.jboss.as.test.integration.security.common.Utils;
import org.jboss.as.test.integration.security.common.servlets.DataSourceTestServlet;
import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests a DataSource which uses Credentials stored in a security domain.
*
* @author Josef Cacek
*/
@RunWith(Arquillian.class)
@RunAsClient
public class SecuredDataSourceTestCase extends AbstractCliTestBase {
private static final String CONTAINER = "default-jbossas";
private static final String DEPLOYMENT = "deployment";
private static final String TEST_NAME = SecuredDataSourceTestCase.class.getSimpleName();
private static final String BATCH_CLI_FILENAME = TEST_NAME + ".cli";
private static final String REMOVE_BATCH_CLI_FILENAME1 = TEST_NAME + "-remove.cli";
private static final String REMOVE_BATCH_CLI_FILENAME2 = TEST_NAME + "-remove2.cli";
private static final File WORK_DIR = new File("secured-ds-" + System.currentTimeMillis());
private static final File BATCH_CLI_FILE = new File(WORK_DIR, BATCH_CLI_FILENAME);
private static final File REMOVE_BATCH_CLI_FILE1 = new File(WORK_DIR, REMOVE_BATCH_CLI_FILENAME1);
private static final File REMOVE_BATCH_CLI_FILE2 = new File(WORK_DIR, REMOVE_BATCH_CLI_FILENAME2);
@ArquillianResource
private static ContainerController container;
@ArquillianResource
private Deployer deployer;
@Test
public void test() throws Exception {
final URI uri = new URI("http://" + TestSuiteEnvironment.getServerAddress() + ":8080/" + TEST_NAME
+ DataSourceTestServlet.SERVLET_PATH + "?" + DataSourceTestServlet.PARAM_DS + "=" + TEST_NAME);
final String body = Utils.makeCall(uri, HttpServletResponse.SC_OK);
assertEquals("true", body);
}
@Deployment(name = DEPLOYMENT, managed = false, testable = false)
@TargetsContainer(CONTAINER)
public static Archive<?> getDeployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class, TEST_NAME + ".war");
war.addClass(DataSourceTestServlet.class);
return war;
}
/**
* Configure the AS and LDAP as the first step in this testcase.
*
* @throws Exception
*/
@Test
@InSequence(Integer.MIN_VALUE)
public void initServer() throws Exception {
container.start(CONTAINER);
WORK_DIR.mkdirs();
FileUtils.copyInputStreamToFile(getClass().getResourceAsStream(BATCH_CLI_FILENAME), BATCH_CLI_FILE);
FileUtils.copyInputStreamToFile(getClass().getResourceAsStream(REMOVE_BATCH_CLI_FILENAME1), REMOVE_BATCH_CLI_FILE1);
FileUtils.copyInputStreamToFile(getClass().getResourceAsStream(REMOVE_BATCH_CLI_FILENAME2), REMOVE_BATCH_CLI_FILE2);
initCLI();
final boolean batchResult = runBatch(BATCH_CLI_FILE);
closeCLI();
try {
assertTrue("Server configuration failed", batchResult);
} finally {
container.stop(CONTAINER);
}
container.start(CONTAINER);
deployer.deploy(DEPLOYMENT);
}
/**
* Revert the AS configuration and stop the server as the last but one step.
*
* @throws Exception
*/
@Test
@InSequence(Integer.MAX_VALUE)
public void closeServer() throws Exception {
assertTrue(container.isStarted(CONTAINER));
deployer.undeploy(DEPLOYMENT);
initCLI();
boolean batchResult = runBatch(REMOVE_BATCH_CLI_FILE1);
//server reload
container.stop(CONTAINER);
container.start(CONTAINER);
batchResult = batchResult && runBatch(REMOVE_BATCH_CLI_FILE2);
closeCLI();
container.stop(CONTAINER);
FileUtils.deleteQuietly(WORK_DIR);
assertTrue("Reverting server configuration failed", batchResult);
}
/**
* Runs given CLI script file as a batch. The CLI has to be initialized before calling this method.
*
* @param batchFile CLI file to run in batch
* @return true if CLI returns Success
* @throws IOException
*/
protected static boolean runBatch(File batchFile) throws IOException {
cli.sendLine("run-batch --file=\"" + batchFile.getAbsolutePath()
+ "\" --headers={allow-resource-service-restart=true} -v", false);
return cli.readAllAsOpResult().isIsOutcomeSuccess();
}
}