/* * 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.patching.runner; import static org.jboss.as.patching.HashUtils.hashFile; import static org.jboss.as.patching.IoUtils.mkdir; import static org.jboss.as.patching.metadata.ModificationType.MODIFY; import static org.jboss.as.patching.runner.PatchingAssert.assertFileExists; import static org.jboss.as.patching.runner.PatchingAssert.assertPatchHasBeenApplied; import static org.jboss.as.patching.runner.PatchingAssert.assertPatchHasNotBeenApplied; import static org.jboss.as.patching.runner.TestUtils.createPatchXMLFile; import static org.jboss.as.patching.runner.TestUtils.createZippedPatchFile; import static org.jboss.as.patching.runner.TestUtils.dump; import static org.jboss.as.patching.runner.TestUtils.randomString; import static org.jboss.as.patching.runner.TestUtils.touch; import static org.junit.Assert.assertArrayEquals; import java.io.File; import java.nio.charset.StandardCharsets; import org.jboss.as.patching.ContentConflictsException; import org.jboss.as.patching.metadata.ContentModification; import org.jboss.as.patching.metadata.MiscContentItem; import org.jboss.as.patching.metadata.Patch; import org.jboss.as.patching.metadata.PatchBuilder; import org.jboss.as.patching.tool.ContentVerificationPolicy; import org.jboss.as.patching.tool.PatchTool; import org.jboss.as.patching.tool.PatchingResult; import org.junit.After; import org.junit.Before; import org.junit.Test; public class UpdateModifiedFileTaskTestCase extends AbstractTaskTestCase { private PatchTool runner; private File zippedPatch; private Patch patch; private ContentModification fileUpdated; private File modifiedFile; private byte[] expectedModifiedHash; private byte[] updatedHash; @Before public void setUp() throws Exception{ // with a file in it File binDir = mkdir(env.getInstalledImage().getJbossHome(), "bin"); String fileName = "standalone.sh"; modifiedFile = touch(binDir, fileName); dump(modifiedFile, "modified script to run standalone AS7"); expectedModifiedHash = hashFile(modifiedFile); // let's simulate that the file has been modified by the users by using a hash that is not the file checksum byte[] unmodifiedHash = randomString().getBytes(StandardCharsets.UTF_8); // build a one-off patch for the base installation // with 1 updated file String patchID = randomString(); File patchDir = mkdir(tempDir, patchID); File updatedFile = touch(patchDir, patchID, "misc", "bin", fileName); dump(updatedFile, "updated script"); updatedHash = hashFile(updatedFile); fileUpdated = new ContentModification(new MiscContentItem(fileName, new String[] { "bin" }, updatedHash), unmodifiedHash, MODIFY); PatchBuilder builder = PatchBuilder.create() .setPatchId(patchID) .setDescription(randomString()) .oneOffPatchIdentity(productConfig.getProductName(), productConfig.getProductVersion()) .getParent(); // PatchElementImpl element = new PatchElementImpl("patch element 01"); // builder.addElement(element); // element.setDescription("patch element 01 description"); // element.setNoUpgrade(); // // PatchElementProviderImpl provider = new PatchElementProviderImpl("base", "4.5.6", false); // provider.require("patch element 02"); // element.setProvider(provider); builder.addContentModification(fileUpdated); patch = builder.build(); // create the patch createPatchXMLFile(patchDir, patch); zippedPatch = createZippedPatchFile(patchDir, patch.getPatchId()); runner = newPatchTool(); } @After public void tearDown() { super.tearDown(); runner = null; zippedPatch = null; patch = null; fileUpdated = null; modifiedFile = null; expectedModifiedHash = null; updatedHash = null; } @Test public void testUpdateModifiedFileWithSTRICT() throws Exception { try { runner.applyPatch(zippedPatch, ContentVerificationPolicy.STRICT); } catch (ContentConflictsException e) { assertPatchHasNotBeenApplied(e, patch, fileUpdated.getItem(), env); /// file has not been modified in the AS7 installation assertFileExists(modifiedFile); assertArrayEquals(expectedModifiedHash, hashFile(modifiedFile)); } } @Test public void testUpdateModifiedFileWithOVERRIDE_ALL() throws Exception { PatchingResult result = runner.applyPatch(zippedPatch, ContentVerificationPolicy.OVERRIDE_ALL); assertPatchHasBeenApplied(result, patch); /// file has been updated in the AS7 installation // and it's the new one assertFileExists(modifiedFile); assertArrayEquals(updatedHash, hashFile(modifiedFile)); // the existing file has been backed up File backupFile = assertFileExists(env.getInstalledImage().getPatchHistoryDir(patch.getPatchId()), "misc", "bin", modifiedFile.getName()); assertArrayEquals(expectedModifiedHash, hashFile(backupFile)); } @Test public void testUpdateModifiedFileWithPRESERVE_ALL() throws Exception { try { runner.applyPatch(zippedPatch, ContentVerificationPolicy.PRESERVE_ALL); } catch (ContentConflictsException e) { assertPatchHasNotBeenApplied(e, patch, fileUpdated.getItem(), env); /// file has not been modified in the AS7 installation assertFileExists(modifiedFile); assertArrayEquals(expectedModifiedHash, hashFile(modifiedFile)); } } }