/* * Copyright (C) 2005-2007 Alfresco Software Limited. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * As a special exception to the terms and conditions of version 2.0 of * the GPL, you may redistribute this Program in connection with Free/Libre * and Open Source Software ("FLOSS") applications as described in Alfresco's * FLOSS exception. You should have recieved a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ package org.alfresco.repo.module.tool; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import junit.framework.TestCase; import org.alfresco.util.TempFileProvider; import org.springframework.util.FileCopyUtils; import de.schlichtherle.io.DefaultRaesZipDetector; import de.schlichtherle.io.FileInputStream; import de.schlichtherle.io.FileOutputStream; import de.schlichtherle.io.ZipDetector; /** * @see org.alfresco.repo.module.tool.ModuleManagementTool * * @author Roy Wetherall * @author Derek Hulley */ public class ModuleManagementToolTest extends TestCase { private ModuleManagementTool manager = new ModuleManagementTool(); ZipDetector defaultDetector = new DefaultRaesZipDetector("amp|war"); public void testBasicInstall() throws Exception { manager.setVerbose(true); String warLocation = getFileLocation(".war", "module/test.war"); String ampLocation = getFileLocation(".amp", "module/test_v1.amp"); String ampV2Location = getFileLocation(".amp", "module/test_v2.amp"); // Initial install of module this.manager.installModule(ampLocation, warLocation); // Check that the war has been modified correctly List files = new ArrayList(10); files.add("/WEB-INF/classes/alfresco/module/test/module.properties"); files.add("/WEB-INF/classes/alfresco/module/test/modifications.install"); files.add("/WEB-INF/lib/test.jar"); files.add("/WEB-INF/classes/alfresco/module/test/module-context.xml"); files.add("/WEB-INF/classes/alfresco/module/test"); files.add("/WEB-INF/licenses/license.txt"); files.add("/scripts/test.js"); files.add("/images/test.jpg"); files.add("/jsp/test.jsp"); files.add("/css/test.css"); files.add("/extra.txt"); checkForFileExistance(warLocation, files); // Check the intstalled files InstalledFiles installed0 = new InstalledFiles(warLocation, "test"); installed0.load(); assertNotNull(installed0); assertEquals(8, installed0.getAdds().size()); assertEquals(1, installed0.getMkdirs().size()); assertEquals(1, installed0.getUpdates().size()); String backup = null; String orig = null; for (Map.Entry update : installed0.getUpdates().entrySet()) { checkContentsOfFile(warLocation + update.getKey(), "VERSIONONE"); checkContentsOfFile(warLocation + update.getValue(), "ORIGIONAL"); backup = update.getValue(); orig = update.getKey(); } // Try and install same version try { this.manager.installModule(ampLocation, warLocation); fail("The module is already installed so an exception should have been raised since we are not forcing an overwite"); } catch(ModuleManagementToolException exception) { // Pass } // Install a later version this.manager.installModule(ampV2Location, warLocation); // Check that the war has been modified correctly List files2 = new ArrayList(12); files.add("/WEB-INF/classes/alfresco/module/test/module.properties"); files.add("/WEB-INF/classes/alfresco/module/test/modifications.install"); files2.add("/WEB-INF/lib/test.jar"); files2.add("/WEB-INF/classes/alfresco/module/test/module-context.xml"); files2.add("/WEB-INF/classes/alfresco/module/test"); files2.add("/WEB-INF/licenses/license.txt"); files2.add("/scripts/test2.js"); files2.add("/scripts/test3.js"); files2.add("/images/test.jpg"); files2.add("/css/test.css"); files2.add("/WEB-INF/classes/alfresco/module/test/version2"); files2.add("/WEB-INF/classes/alfresco/module/test/version2/version2-context.xml"); checkForFileExistance(warLocation, files2); List files3 = new ArrayList(2); files3.add("/scripts/test.js"); files3.add("/jsp/test.jsp"); files3.add("/extra.txt"); files3.add(backup); checkForFileNonExistance(warLocation, files3); // Check the intstalled files InstalledFiles installed1 = new InstalledFiles(warLocation, "test"); installed1.load(); assertNotNull(installed1); assertEquals(8, installed1.getAdds().size()); assertEquals(1, installed1.getMkdirs().size()); assertEquals(0, installed1.getUpdates().size()); // Ensure the file has been reverted as it isnt updated in the v2.0 checkContentsOfFile(warLocation + orig, "ORIGIONAL"); // Try and install and earlier version try { this.manager.installModule(ampLocation, warLocation); fail("An earlier version of this module is already installed so an exception should have been raised since we are not forcing an overwite"); } catch(ModuleManagementToolException exception) { // Pass } } public void testDependencySuccess() throws Exception { manager.setVerbose(true); String warLocation = getFileLocation(".war", "module/test.war"); String testAmpV1Location = getFileLocation(".amp", "module/test_v1.amp"); String testAmpV2Location = getFileLocation(".amp", "module/test_v2.amp"); String testAmpDepV1Location = getFileLocation(".amp", "module/dependent_on_test_v1.amp"); String testAmpDepV2Location = getFileLocation(".amp", "module/dependent_on_test_v2.amp"); // Install V1 this.manager.installModule(testAmpV1Location, warLocation, false, false, false); // Install the module dependent on test_v1 this.manager.installModule(testAmpDepV1Location, warLocation, false, false, false); try { // Attempt to upgrade the dependent module this.manager.installModule(testAmpDepV2Location, warLocation, false, false, false); fail("Failed to detect inadequate dependency on the test amp"); } catch (ModuleManagementToolException e) { System.out.println("Expected: " + e.getMessage()); } // Install the test_v2 this.manager.installModule(testAmpV2Location, warLocation, false, false, false); // The dependent module should now go in this.manager.installModule(testAmpDepV2Location, warLocation, false, false, false); } public void testPreviewInstall() throws Exception { manager.setVerbose(true); String warLocation = getFileLocation(".war", "module/test.war"); String ampLocation = getFileLocation(".amp", "module/test_v1.amp"); // Initial install of module this.manager.installModule(ampLocation, warLocation, true, false, true); // TODO need to prove that the war file has not been updated in any way } public void testForcedInstall() throws Exception { manager.setVerbose(true); String warLocation = getFileLocation(".war", "module/test.war"); String ampLocation = getFileLocation(".amp", "module/test_v1.amp"); // Initial install of module this.manager.installModule(ampLocation, warLocation, false, false, false); this.manager.installModule(ampLocation, warLocation, false, true, false); } public void testInstallFromDir() throws Exception { manager.setVerbose(true); String warLocation = getFileLocation(".war", "module/test.war"); String ampLocation = getFileLocation(".amp", "module/test_v1.amp"); String ampV2Location = getFileLocation(".amp", "module/test_v2.amp"); int index = ampV2Location.lastIndexOf(File.separator); System.out.println(index); String directoryLocation = ampV2Location.substring(0, index); try { this.manager.installModules(directoryLocation, warLocation); } catch (ModuleManagementToolException exception) { exception.printStackTrace(); System.out.println("Expected failure: " + exception.getMessage()); } } public void testList() throws Exception { String warLocation = getFileLocation(".war", "module/test.war"); String ampLocation = getFileLocation(".amp", "module/test_v1.amp"); this.manager.listModules(warLocation); this.manager.installModule(ampLocation, warLocation); this.manager.listModules(warLocation); } private String getFileLocation(String extension, String location) throws IOException { File file = TempFileProvider.createTempFile("moduleManagementToolTest-", extension); InputStream is = this.getClass().getClassLoader().getResourceAsStream(location); assertNotNull(is); OutputStream os = new FileOutputStream(file); FileCopyUtils.copy(is, os); return file.getPath(); } private void checkForFileExistance(String warLocation, List files) { for (String file : files) { File file0 = new de.schlichtherle.io.File(warLocation + file, this.defaultDetector); assertTrue("The file/dir " + file + " does not exist in the WAR.", file0.exists()); } } private void checkForFileNonExistance(String warLocation, List files) { for (String file : files) { File file0 = new de.schlichtherle.io.File(warLocation + file, this.defaultDetector); assertFalse("The file/dir " + file + " does exist in the WAR.", file0.exists()); } } private void checkContentsOfFile(String location, String expectedContents) throws IOException { File file = new de.schlichtherle.io.File(location, this.defaultDetector); assertTrue(file.exists()); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line = reader.readLine(); assertNotNull(line); assertEquals(expectedContents, line.trim()); } }