/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, 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.patching;
import static org.jboss.as.test.patching.PatchingTestUtil.MODULES_PATH;
import static org.jboss.as.test.patching.PatchingTestUtil.randomString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.patching.HashUtils;
import org.jboss.as.test.patching.util.module.Module;
import org.jboss.dmr.ModelNode;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
* @author Alexey Loubyansky
*/
@RunWith(WildflyTestRunner.class)
@ServerControl(manual = true)
public class ShowHistoryUnitTestCase extends PatchInfoTestBase {
private String[] patchIds;
private boolean[] patchTypes;
@Before
public void setup() throws Exception {
patchIds = new String[8];
patchTypes = new boolean[patchIds.length];
for (int i = 0; i < patchIds.length; ++i) {
patchIds[i] = randomString();
patchTypes[i] = (i % 3 == 0);
}
}
@Test
public void testUnpatched() throws Exception {
final ModelNode response = showHistory();
assertTrue(response.has("outcome"));
assertEquals("success", response.get("outcome").asString());
assertTrue(response.has("result"));
final List<ModelNode> list = response.get("result").asList();
assertTrue(list.isEmpty());
}
@Test
public void testCP() throws Exception {
Module module = new Module.Builder("module-test").
miscFile(new ResourceItem("resource-test", ("module resource").getBytes(StandardCharsets.UTF_8))).
build();
File moduleDir = module.writeToDisk(new File(MODULES_PATH));
byte[] targetHash = HashUtils.hashFile(moduleDir);
targetHash = applyCP("cp1", targetHash);
final ModelNode response = showHistory();
assertTrue(response.has("outcome"));
assertEquals("success", response.get("outcome").asString());
assertTrue(response.has("result"));
final List<ModelNode> list = response.get("result").asList();
assertEquals(1, list.size());
final ModelNode entry = list.get(0);
assertEquals("cp1", entry.get("patch-id").asString());
assertEquals("cumulative", entry.get("type").asString());
}
@Test
public void testOneOff() throws Exception {
Module module = new Module.Builder("module-test").
miscFile(new ResourceItem("resource-test", ("module resource").getBytes(StandardCharsets.UTF_8))).
build();
File moduleDir = module.writeToDisk(new File(MODULES_PATH));
byte[] targetHash = HashUtils.hashFile(moduleDir);
targetHash = applyOneOff("oneoff1", targetHash);
final ModelNode response = showHistory();
assertTrue(response.has("outcome"));
assertEquals("success", response.get("outcome").asString());
assertTrue(response.has("result"));
final List<ModelNode> list = response.get("result").asList();
assertEquals(1, list.size());
final ModelNode entry = list.get(0);
assertEquals("oneoff1", entry.get("patch-id").asString());
assertEquals("one-off", entry.get("type").asString());
}
@Test
public void testOneOffAndCP() throws Exception {
Module module = new Module.Builder("module-test").
miscFile(new ResourceItem("resource-test", ("module resource").getBytes(StandardCharsets.UTF_8))).
build();
File moduleDir = module.writeToDisk(new File(MODULES_PATH));
byte[] targetHash = HashUtils.hashFile(moduleDir);
targetHash = applyOneOff("oneoff1", targetHash);
targetHash = applyCP("cp1", targetHash);
final ModelNode response = showHistory();
assertTrue(response.has("outcome"));
assertEquals("success", response.get("outcome").asString());
assertTrue(response.has("result"));
final List<ModelNode> list = response.get("result").asList();
assertEquals(2, list.size());
ModelNode entry = list.get(0);
assertEquals("cp1", entry.get("patch-id").asString());
assertEquals("cumulative", entry.get("type").asString());
entry = list.get(1);
assertEquals("oneoff1", entry.get("patch-id").asString());
assertEquals("one-off", entry.get("type").asString());
}
@Test
public void testMain() throws Exception {
// create a module
Module module = new Module.Builder("module-test").
miscFile(new ResourceItem("resource-test", ("module resource").getBytes(StandardCharsets.UTF_8))).
build();
File moduleDir = module.writeToDisk(new File(MODULES_PATH));
byte[] targetHash = HashUtils.hashFile(moduleDir);
for (int i = 0; i < patchIds.length; ++i) {
if (patchTypes[i]) {
targetHash = applyCP(patchIds[i], targetHash);
} else {
targetHash = applyOneOff(patchIds[i], targetHash);
}
}
final ModelNode response = showHistory();
assertTrue(response.has("outcome"));
assertEquals("success", response.get("outcome").asString());
assertTrue(response.has("result"));
final List<ModelNode> list = response.get("result").asList();
assertEquals(patchIds.length, list.size());
for (int i = 0; i < patchIds.length; ++i) {
final ModelNode info = list.get(i);
assertEquals(patchIds[patchIds.length - 1 - i], info.get("patch-id").asString());
assertTrue(info.has("type"));
final String type = patchTypes[patchTypes.length - 1 - i] ? "cumulative" : "one-off";
assertEquals(type, info.get("type").asString());
assertTrue(info.has("applied-at"));
}
}
private ModelNode showHistory() throws IOException {
controller.start();
ModelControllerClient client = null;
final ModelNode response;
try {
client = controller.getClient().getControllerClient();
ModelNode op = new ModelNode();
op.get("address").add("core-service", "patching");
op.get("operation").set("show-history");
response = client.execute(op);
} finally {
if (client != null) {
client.close();
}
controller.stop();
}
return response;
}
}