/* * RHQ Management Platform * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser 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. */ package org.rhq.core.util.updater; import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.rhq.core.template.TemplateEngine; import org.rhq.core.util.MessageDigestGenerator; import org.rhq.core.util.ZipUtil; import org.rhq.core.util.file.FileUtil; @Test public class UpdaterZipTest { // earlier we supported windows separators in the map, but i think we want to always support / // this constant is here in case I want to move back to supporting windows paths explicitly // we'd do this by "fileSeparator = File.separator;" private static final String fileSeparator = "/"; private TemplateEngine templateEngine; private String javaVersion; @BeforeClass public void beforeClass() { javaVersion = System.getProperty("java.version"); Map<String, String> tokens = new HashMap<String, String>(); tokens.put("rhq.system.hostname", "localhost"); tokens.put("rhq.system.sysprop.java.version", javaVersion); templateEngine = new TemplateEngine(tokens); } public void testWalkExtractAndSkip() throws Exception { File tmpDir = FileUtil.createTempDirectory("testWalkExtract", ".dir", null); try { File testZipFile = new File("target/test-classes/updater-test2.zip"); Set<String> skip = new HashSet<String>(); skip.add("dir2" + fileSeparator + "file3"); skip.add("dir3" + fileSeparator + "dir4" + fileSeparator + "file4"); skip.add("fileA"); skip.add("dir1" + fileSeparator + "fileB"); skip.add("dir2" + fileSeparator + "fileC"); ExtractorZipFileVisitor visitorNoRealize = new ExtractorZipFileVisitor(tmpDir, null, templateEngine, skip, null, false); ZipUtil.walkZipFile(testZipFile, visitorNoRealize); FileHashcodeMap mapRaw = visitorNoRealize.getFileHashcodeMap(); assert mapRaw.size() == 2 : mapRaw + ": all but 2 files in test jar should be skipped"; String f = "dir1" + fileSeparator + "file1"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists(); assert MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir1" + fileSeparator + "file2"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists(); assert MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); } finally { FileUtil.purge(tmpDir, true); } } public void testWalkExtract() throws Exception { walkExtract(false); } public void testWalkExtractDryRun() throws Exception { walkExtract(true); } private void walkExtract(boolean dryRun) throws Exception { File tmpDir = FileUtil.createTempDirectory("testWalkExtract", ".dir", null); try { File testZipFile = new File("target/test-classes/updater-test2.zip"); DeployDifferences diff = new DeployDifferences(); ExtractorZipFileVisitor visitorNoRealize = new ExtractorZipFileVisitor(tmpDir, null, templateEngine, null, diff, dryRun); ZipUtil.walkZipFile(testZipFile, visitorNoRealize); assert diff.getRealizedFiles().size() == 0 : diff; FileHashcodeMap mapRaw = visitorNoRealize.getFileHashcodeMap(); assert mapRaw.size() == 7 : mapRaw; assert mapRaw.getUnknownContent() == null; String f = "dir1" + fileSeparator + "file1"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir1" + fileSeparator + "file2"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir2" + fileSeparator + "file3"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir3" + fileSeparator + "dir4" + fileSeparator + "file4"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "fileA"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir1" + fileSeparator + "fileB"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); f = "dir2" + fileSeparator + "fileC"; assert mapRaw.containsKey(f) : mapRaw; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(mapRaw.get(f)); // now walk the zip and realize some files FileUtil.purge(tmpDir, false); Pattern filesToRealizeRegex = Pattern.compile("(fileA)|(dir1.fileB)"); // '.' in place of file separator to support running test on windows & unix diff = new DeployDifferences(); ExtractorZipFileVisitor visitor = new ExtractorZipFileVisitor(tmpDir, filesToRealizeRegex, templateEngine, null, diff, dryRun); ZipUtil.walkZipFile(testZipFile, visitor); assert diff.getRealizedFiles().size() == 2 : diff; assert diff.getRealizedFiles().containsKey("fileA") : diff; assert diff.getRealizedFiles().containsKey("dir1" + fileSeparator + "fileB") : diff; FileHashcodeMap map = visitor.getFileHashcodeMap(); assert map.size() == 7 : map; assert map.getUnknownContent() == null; f = "dir1" + fileSeparator + "file1"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "dir1" + fileSeparator + "file2"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "dir2" + fileSeparator + "file3"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "dir3" + fileSeparator + "dir4" + fileSeparator + "file4"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "fileA"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "dir1" + fileSeparator + "fileB"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); f = "dir2" + fileSeparator + "fileC"; assert map.containsKey(f) : map; assert new File(tmpDir, f).exists() == !dryRun; assert dryRun || MessageDigestGenerator.getDigestString(new File(tmpDir, f)).equals(map.get(f)); // check that our unrealized files between the two walks are the same assert map.get("dir1" + fileSeparator + "file1").equals(mapRaw.get("dir1" + fileSeparator + "file1")); assert map.get("dir1" + fileSeparator + "file2").equals(mapRaw.get("dir1" + fileSeparator + "file2")); assert map.get("dir2" + fileSeparator + "file3").equals(mapRaw.get("dir2" + fileSeparator + "file3")); assert map.get("dir3" + fileSeparator + "dir4" + fileSeparator + "file4").equals( mapRaw.get("dir3" + fileSeparator + "dir4" + fileSeparator + "file4")); // check that our realized files have different hashcodes from their unrealized forms assert !map.get("fileA").equals(mapRaw.get("fileA")); assert !map.get("dir1" + fileSeparator + "fileB").equals(mapRaw.get("dir1" + fileSeparator + "fileB")); } finally { FileUtil.purge(tmpDir, true); } } public void testWalkInMemory() throws Exception { File testZipFile = new File("target/test-classes/updater-test2.zip"); InMemoryZipFileVisitor visitorNoRealize = new InMemoryZipFileVisitor(null, templateEngine); ZipUtil.walkZipFile(testZipFile, visitorNoRealize); FileHashcodeMap mapNoRealize = visitorNoRealize.getFileHashcodeMap(); assert mapNoRealize.size() == 7 : mapNoRealize; assert mapNoRealize.containsKey("dir1" + fileSeparator + "file1") : mapNoRealize; assert mapNoRealize.containsKey("dir1" + fileSeparator + "file2") : mapNoRealize; assert mapNoRealize.containsKey("dir2" + fileSeparator + "file3") : mapNoRealize; assert mapNoRealize.containsKey("dir3" + fileSeparator + "dir4" + fileSeparator + "file4") : mapNoRealize; assert mapNoRealize.containsKey("fileA") : mapNoRealize; assert mapNoRealize.containsKey("dir1" + fileSeparator + "fileB") : mapNoRealize; assert mapNoRealize.containsKey("dir2" + fileSeparator + "fileC") : mapNoRealize; Pattern filesToRealizeRegex = Pattern.compile("(fileA)|(dir1.fileB)"); // '.' in place of file separator to support running test on windows & unix InMemoryZipFileVisitor visitor = new InMemoryZipFileVisitor(filesToRealizeRegex, templateEngine); ZipUtil.walkZipFile(testZipFile, visitor); FileHashcodeMap map = visitor.getFileHashcodeMap(); assert map.size() == 7 : map; assert map.containsKey("dir1" + fileSeparator + "file1") : map; assert map.containsKey("dir1" + fileSeparator + "file2") : map; assert map.containsKey("dir2" + fileSeparator + "file3") : map; assert map.containsKey("dir3" + fileSeparator + "dir4" + fileSeparator + "file4") : map; assert map.containsKey("fileA") : map; assert map.containsKey("dir1" + fileSeparator + "fileB") : map; assert map.containsKey("dir2" + fileSeparator + "fileC") : map; // check that our unrealized files between the two walks are the same assert map.get("dir1" + fileSeparator + "file1").equals(mapNoRealize.get("dir1" + fileSeparator + "file1")); assert map.get("dir1" + fileSeparator + "file2").equals(mapNoRealize.get("dir1" + fileSeparator + "file2")); assert map.get("dir2" + fileSeparator + "file3").equals(mapNoRealize.get("dir2" + fileSeparator + "file3")); assert map.get("dir3" + fileSeparator + "dir4" + fileSeparator + "file4").equals( mapNoRealize.get("dir3" + fileSeparator + "dir4" + fileSeparator + "file4")); // check that our realized files have different hashcodes from their unrealized forms assert !map.get("fileA").equals(mapNoRealize.get("fileA")); assert !map.get("dir1" + fileSeparator + "fileB").equals(mapNoRealize.get("dir1" + fileSeparator + "fileB")); } public void testRealize() throws Exception { File testZipFile = new File("target/test-classes/updater-test2.zip"); InMemoryZipEntryRealizer realizer = new InMemoryZipEntryRealizer(testZipFile, templateEngine); String fileA = realizer.realize("fileA"); String fileB = realizer.realize("dir1" + fileSeparator + "fileB"); assert fileA != null; assert fileB != null; assert fileA.contains("this is fileA") : fileA; assert fileB.contains("this is fileB") : fileB; assert fileA.contains("rhq.system.hostname = [localhost]") : fileA; assert fileB.contains("rhq.system.hostname = [localhost]") : fileB; assert fileA.contains("rhq.system.sysprop.java.version = [" + javaVersion + "]") : fileA; assert fileB.contains("rhq.system.sysprop.java.version = [" + javaVersion + "]") : fileB; assert fileA.contains("custom.prop = [@@custom.prop@@]") : fileA; assert fileB.contains("custom.prop = [@@custom.prop@@]") : fileB; } public void testNoRealize() throws Exception { File testZipFile = new File("target/test-classes/updater-test2.zip"); InMemoryZipEntryRealizer realizer = new InMemoryZipEntryRealizer(testZipFile, null); // notice a null template engine String fileA = realizer.realize("fileA"); String fileB = realizer.realize("dir1" + fileSeparator + "fileB"); assert fileA != null; assert fileB != null; assert fileA.contains("this is fileA") : fileA; assert fileB.contains("this is fileB") : fileB; assert fileA.contains("rhq.system.hostname = [@@rhq.system.hostname@@]") : fileA; assert fileB.contains("rhq.system.hostname = [@@rhq.system.hostname@@]") : fileB; assert fileA.contains("rhq.system.sysprop.java.version = [@@rhq.system.sysprop.java.version@@]") : fileA; assert fileB.contains("rhq.system.sysprop.java.version = [@@rhq.system.sysprop.java.version@@]") : fileB; assert fileA.contains("custom.prop = [@@custom.prop@@]") : fileA; assert fileB.contains("custom.prop = [@@custom.prop@@]") : fileB; } }