/*
* JBoss, Home of Professional Open Source
* Copyright 2015, Red Hat Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt 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.integration.domain.management.cli;
import org.jboss.as.test.integration.domain.management.util.DomainTestSupport;
import org.jboss.as.test.integration.domain.suites.CLITestSuite;
import org.jboss.as.test.integration.management.base.AbstractCliTestBase;
import org.jboss.logging.Logger;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.assertTrue;
/**
* Test for logical hierarchical composition of Profiles and Socket Binding Groups.
*
* https://issues.jboss.org/browse/WFCORE-844
*
* @author Marek Kopecky <mkopecky@redhat.com>
*/
@Ignore("[WFCORE-1958] Clean up testsuite Elytron registration.")
public class HierarchicalCompositionTestCase extends AbstractCliTestBase {
private static Logger log = Logger.getLogger(HierarchicalCompositionTestCase.class);
private static final String ORIGINAL_PROFILE = "default";
private static final String ROOT_PROFILE = "hierarchical-composition-test-case-root";
private static final String CHILD_PROFILE = "hierarchical-composition-test-case-default";
private static final String ROOT_SUBSYSTEM = "request-controller";
private static final String ORIGINAL_SERVER_GROUP = "main-server-group";
private static final String SERVER_GROUP = "test-group";
private static final String SERVER = "test-server";
private static final String HOST = "master";
private static final String NEW_SOCKET_BINDING_GROUP = "hierarchical-composition-test-case-binding-group";
private static final String NEW_SOCKET_BINDING = "hierarchical-composition-test-case-binding";
private static final int NEW_SOCKET_BINDING_PORT = 1234;
/**
* Original profile from server group
*/
String initProfile;
/**
* Original socket binding group from server group
*/
String initSocketBindingGroup;
@BeforeClass
public static void before() throws Exception {
CLITestSuite.createSupport(HierarchicalCompositionTestCase.class.getSimpleName());
AbstractCliTestBase.initCLI(DomainTestSupport.masterAddress);
}
@AfterClass
public static void after() throws Exception {
AbstractCliTestBase.closeCLI();
CLITestSuite.stopSupport();
}
/**
* Sends command line to CLI, validate and return output.
*
* @param line command line
* @return CLI output
*/
private String cliRequest(String line, boolean successRequired) {
log.info(line);
cli.sendLine(line);
String output = cli.readOutput();
if (successRequired) {
assertTrue("CLI command \"" + line + " doesn't contain \"success\"", output.contains("success"));
}
return output;
}
/**
* Sends command line to CLI, return only result.
*
* @param line command line
* @return CLI output
*/
private String cliGetResult(String line) {
log.info(line);
cli.sendLine(line);
String output = null;
try {
output = (String) cli.readAllAsOpResult().getResult();
} catch (IOException e) {
Assert.fail("Fail to get result of CLI command: " + line + "\n" + e.getMessage() + "\n" + e.getStackTrace());
}
return output;
}
/**
* Get original profile and socket binding group
*/
@Before
public void init() {
// get actual profile
initProfile = cliGetResult("/server-group=" + ORIGINAL_SERVER_GROUP + ":read-attribute(name=profile)");
// get actual socket binding group
initSocketBindingGroup = cliGetResult("/server-group=" + ORIGINAL_SERVER_GROUP + ":read-attribute(name=socket-binding-group)");
}
private String getStr(String s) {
if (s == null)
return "[{null}]";
return "[" + s + "]";
}
/**
* Start server with specific profile and socket-binding-group and get specific settings
*
* @param profile profile for main-server-group
* @param socketBindingGroup socket binding group for main-server-group
* @param getSocketBindings get socket-bindings or get subsystems
*/
private String getServerSettings(String profile, String socketBindingGroup, boolean getSocketBindings) {
String results = "";
// create server group with specific profile and socket binding group
cliRequest("/server-group=" + SERVER_GROUP + ":add(profile=" + profile + ",socket-binding-group=" + socketBindingGroup + ")", true);
try {
// create server
cliRequest("/host=" + HOST + "/server-config=" + SERVER + ":add(group=" + SERVER_GROUP + ",socket-binding-port-offset=550)", true);
try {
// start server
cliRequest("/server-group=" + SERVER_GROUP + ":start-servers(blocking=true)", true);
try {
if (getSocketBindings) {
// get socket bindings
results = cliRequest("ls /host=" + HOST + "/server=" + SERVER + "/socket-binding-group=" + NEW_SOCKET_BINDING_GROUP + "/socket-binding", false);
} else {
// get subsystems
results = cliRequest("ls /host=" + HOST + "/server=" + SERVER + "/subsystem", false);
}
} finally {
// stop server
cliRequest("/server-group=" + SERVER_GROUP + ":stop-servers(blocking=true)", true);
}
} finally {
// remove server
cliRequest("/host=" + HOST + "/server-config=" + SERVER + ":remove", true);
}
} finally {
// remove server group
cliRequest("/server-group=" + SERVER_GROUP + ":remove", true);
}
return results;
}
/**
* Basic smoke test for hierarchical composition of profiles
*/
@Test
public void testHierarchicalCompositionOfProfiles() throws IOException {
// clone profile to child profile
cliRequest("/profile=" + ORIGINAL_PROFILE + ":clone(to-profile=" + CHILD_PROFILE + ")", true);
// remove mail subsystem from child profile
cliRequest("/profile=" + CHILD_PROFILE + "/subsystem=" + ROOT_SUBSYSTEM + ":remove", true);
// add root profile
cliRequest("/profile=" + ROOT_PROFILE + ":add", true);
// add mail subsystem to root profile
cliRequest("/profile=" + ROOT_PROFILE + "/subsystem=" + ROOT_SUBSYSTEM + ":add", true);
// set root profile as ancestor of child profile
cliRequest("/profile=" + CHILD_PROFILE + ":list-add(name=includes,value=" + ROOT_PROFILE + ")", true);
// check subsystems in server for mail subsystem
String subsystemsInServer = getServerSettings(CHILD_PROFILE, initSocketBindingGroup, false);
assertTrue("Child profile doesn't contain subsystem from root profile", subsystemsInServer.contains(ROOT_SUBSYSTEM));
// remove new profiles
cliRequest("/profile=" + CHILD_PROFILE + ":remove", true);
cliRequest("/profile=" + ROOT_PROFILE + ":remove", true);
}
/**
* Basic smoke test for hierarchical composition of socket binding groups
*/
@Test
public void testHierarchicalCompositionOfSocketBindingGroups() throws IOException {
// create new socket binding group
cliRequest("/socket-binding-group=" + NEW_SOCKET_BINDING_GROUP + ":add(default-interface=public,includes=[" + initSocketBindingGroup + "])", true);
// add new socket binding in new socket binding group
cliRequest("/socket-binding-group=" + NEW_SOCKET_BINDING_GROUP + "/socket-binding=" + NEW_SOCKET_BINDING + ":add(port=" + NEW_SOCKET_BINDING_PORT + ")", true);
// get all socket bindings from new socket binding group and check it
String socketBinding = getServerSettings(initProfile, NEW_SOCKET_BINDING_GROUP, true);
assertTrue(socketBinding.contains("http"));
assertTrue(socketBinding.contains(NEW_SOCKET_BINDING));
// remove new subsystems
cliRequest("/socket-binding-group=" + NEW_SOCKET_BINDING_GROUP + ":remove", true);
}
}