/*
* 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.patching.IoUtils.mkdir;
import static org.jboss.as.test.patching.PatchingTestUtil.AS_DISTRIBUTION;
import static org.jboss.as.test.patching.PatchingTestUtil.AS_VERSION;
import static org.jboss.as.test.patching.PatchingTestUtil.FILE_SEPARATOR;
import static org.jboss.as.test.patching.PatchingTestUtil.PRODUCT;
import static org.jboss.as.test.patching.PatchingTestUtil.createPatchXMLFile;
import static org.jboss.as.test.patching.PatchingTestUtil.createZippedPatchFile;
import static org.jboss.as.test.patching.PatchingTestUtil.randomString;
import static org.jboss.as.test.patching.PatchingTestUtil.readFile;
import static org.jboss.as.test.patching.PatchingTestUtil.setFileContent;
import java.io.File;
import org.jboss.as.patching.metadata.ContentModification;
import org.jboss.as.patching.metadata.Patch;
import org.jboss.as.patching.metadata.PatchBuilder;
import org.jboss.as.version.ProductConfig;
import org.jboss.logging.Logger;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
* @author Jan Martiska
*/
@RunWith(WildflyTestRunner.class)
@ServerControl(manual = true)
public class NonStandardSituationsTestCase extends AbstractPatchingTestCase {
private static final Logger logger = Logger.getLogger(NonStandardSituationsTestCase.class);
/**
* bug: https://issues.jboss.org/browse/WFLY-1803
* <p/>
* Prepare a patch which modifies a file, but the file will not be writable for the patching process.
* Check that the patch rolls back completely and doesn't leave itself half-applied.
*/
@Test
public void testWritePermissionDenied() throws Exception {
// prepare the patch
String patchID = randomString();
File oneOffPatchDir = mkdir(tempDir, patchID);
final String testFile1Name = "f1_" + randomString();
final String testFilePath1 = AS_DISTRIBUTION + FILE_SEPARATOR + testFile1Name;
final String testContent1 = "test content1";
final String originalContent1 = "original content1";
setFileContent(testFilePath1, originalContent1);
final String testFile2Name = "f2_" + randomString();
final String testFilePath2 = AS_DISTRIBUTION + FILE_SEPARATOR + testFile2Name;
final String testContent2 = "test content2";
final String originalContent2 = "original content2";
setFileContent(testFilePath2, originalContent2);
ContentModification miscFileModified1 = ContentModificationUtils.modifyMisc(oneOffPatchDir, patchID, testContent1, new File(testFilePath1), testFile1Name);
ContentModification miscFileModified2 = ContentModificationUtils.modifyMisc(oneOffPatchDir, patchID, testContent2, new File(testFilePath2), testFile2Name);
ProductConfig productConfig = new ProductConfig(PRODUCT, AS_VERSION, "consoleSlot");
Patch oneOffPatch = PatchBuilder.create()
.setPatchId(patchID)
.setDescription("A one-off patch modifying multiple misc files.")
.oneOffPatchIdentity(productConfig.getProductName(), productConfig.getProductVersion())
.getParent()
.addContentModification(miscFileModified1)
.addContentModification(miscFileModified2)
.build();
createPatchXMLFile(oneOffPatchDir, oneOffPatch);
File zippedPatch = createZippedPatchFile(oneOffPatchDir, patchID);
logger.debug(zippedPatch.getAbsolutePath());
if (!new File(testFilePath2).setWritable(false)) {
logger.warn("Unable to revoke write permissions on file " + testFilePath2);
Assume.assumeFalse(true); // skip this test
}
controller.start();
boolean success = CliUtilsForPatching.applyPatch(zippedPatch.getAbsolutePath());
new File(testFilePath2).setWritable(true);
Assert.assertFalse("Patch should not be applied successfully", success);
Assert.assertFalse("The patch should not be listed as installed",
CliUtilsForPatching.getInstalledPatches().contains(patchID));
controller.stop();
// both files should have their original content
String actualContent1 = readFile(testFilePath1);
String actualContent2 = readFile(testFilePath2);
Assert.assertEquals(originalContent1, actualContent1);
Assert.assertEquals(originalContent2, actualContent2);
}
}