/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.brooklyn.util.core.file; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import java.io.File; import java.util.Map; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.core.ResourceUtils; import org.apache.brooklyn.util.core.file.ArchiveBuilder; import org.apache.brooklyn.util.core.file.ArchiveUtils; import org.apache.brooklyn.util.os.Os; import com.google.api.client.repackaged.com.google.common.base.Joiner; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; // Test are integration, because relies on ssh/scp via SshMachineLocation public class ArchiveUtilsTest extends BrooklynAppUnitTestSupport { private SshMachineLocation machine; private ResourceUtils resourceUtils; private Map<String, String> archiveContents = ImmutableMap.of("a.txt", "mya"); private File destDir; private File origZip; private File origJar; @BeforeClass(alwaysRun=true) public void setUpClass() throws Exception { origZip = newZip(archiveContents); origJar = Os.newTempFile(ArchiveUtilsTest.class, ".jar"); Files.copy(origZip, origJar); } @AfterClass(alwaysRun=true) public void tearDownClass() throws Exception { if (origZip != null) origZip.delete(); if (origJar != null) origJar.delete(); } @BeforeMethod(alwaysRun=true) @Override public void setUp() throws Exception { super.setUp(); machine = app.newLocalhostProvisioningLocation().obtain(); resourceUtils = ResourceUtils.create(ArchiveUtilsTest.class); destDir = Os.newTempDir(getClass().getSimpleName()); } @AfterMethod(alwaysRun=true) @Override public void tearDown() throws Exception { super.tearDown(); if (destDir != null) Os.deleteRecursively(destDir); } @Test(groups="Integration") public void testDeployZipWithNoOptionalArgsSupplied() throws Exception { boolean result = ArchiveUtils.deploy(resourceUtils, ImmutableMap.<String, Object>of(), origZip.getAbsolutePath(), machine, destDir.getAbsolutePath(), true, null, null); assertTrue(result); assertFilesEqual(new File(destDir, origZip.getName()), origZip); assertSubFilesEqual(destDir, archiveContents); } @Test(groups="Integration") public void testDeployZipDeletingArchiveAfterUnpack() throws Exception { boolean result = ArchiveUtils.deploy(resourceUtils, ImmutableMap.<String, Object>of(), origZip.getAbsolutePath(), machine, destDir.getAbsolutePath(), false, null, null); assertTrue(result); assertFalse(new File(destDir, origZip.getName()).exists()); assertSubFilesEqual(destDir, archiveContents); } @Test(groups="Integration") public void testDeployJarNotUnpacked() throws Exception { ArchiveUtils.deploy(origJar.getAbsolutePath(), machine, destDir.getAbsolutePath()); assertFilesEqual(new File(destDir, origJar.getName()), origJar); } @Test(groups="Integration") public void testDeployExplicitDestFile() throws Exception { String destFile = "custom-destFile.jar"; ArchiveUtils.deploy(origJar.getAbsolutePath(), machine, destDir.getAbsolutePath(), destFile); assertFilesEqual(new File(destDir, destFile), origJar); } private File newZip(Map<String, String> files) throws Exception { File parentDir = Os.newTempDir(getClass().getSimpleName()+"-archive"); for (Map.Entry<String, String> entry : files.entrySet()) { File subFile = new File(Os.mergePaths(parentDir.getAbsolutePath(), entry.getKey())); subFile.getParentFile().mkdirs(); Files.write(entry.getValue(), subFile, Charsets.UTF_8); } return ArchiveBuilder.zip().addDirContentsAt(parentDir, ".").create(); } private void assertFilesEqual(File f1, File f2) throws Exception { byte[] bytes1 = Files.asByteSource(f1).read(); byte[] bytes2 = Files.asByteSource(f1).read(); assertEquals(bytes1, bytes2, "f1="+f1+"; f2="+f2); } private void assertSubFilesEqual(File parentDir, Map<String, String> files) throws Exception { for (Map.Entry<String, String> entry : archiveContents.entrySet()) { File subFile = new File(Os.mergePaths(parentDir.getAbsolutePath(), entry.getKey())); assertEquals(Joiner.on("\n").join(Files.readLines(subFile, Charsets.UTF_8)), entry.getValue()); } } }