package org.zend.sdk.test.sdklib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.zend.sdk.test.AbstractTest; import org.zend.sdklib.application.PackageBuilder; import org.zend.sdklib.internal.library.AbstractChangeNotifier; import org.zend.sdklib.mapping.IVariableResolver; import org.zend.webapi.core.progress.IStatus; import org.zend.webapi.core.progress.StatusCode; public class TestPackageBuilder extends AbstractTest { public static final String FOLDER = "test/config/apps/"; private static final int BUFFER = 2048; private File file; private class TestNotifier extends AbstractChangeNotifier { private List<IStatus> history = new ArrayList<IStatus>(); @Override public void statusChanged(IStatus status) { history.add(status); } public List<IStatus> getHistory() { return history; } } @Before public void startup() { final String tempDir = System.getProperty("java.io.tmpdir"); file = new File(tempDir + File.separator + new Random().nextInt()); file.mkdir(); } @After public void shutdown() { file.deleteOnExit(); } @Test public void testCreatePackagePath() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project1")); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); } @Test public void testCreatePackageEmptyAppdir() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project7")); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); unzip(result); File parent = result.getParentFile(); assertTrue(new File(parent, "/data/").exists()); } @Test public void testCreatePackageNoAppdir() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project8")); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); unzip(result); File parent = result.getParentFile(); assertTrue(new File(parent, "/include_it").exists()); } @Test public void testCreatePackageNoScriptsdir() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project8")); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); unzip(result); File parent = result.getParentFile(); assertTrue(new File(parent, "/include_it").exists()); assertFalse(new File(parent, "scripts/include_it").exists()); } @Test public void testCreatePackageFile() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project1")); File result = builder.createDeploymentPackage(file); assertNotNull(result); assertTrue(result.exists()); } @Test public void testPackageContent() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project1")); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); unzip(result); File parent = result.getParentFile(); assertTrue(new File(parent, "/data/public/inner_public").exists()); assertTrue(new File(parent, "/eula/license.txt").exists()); assertTrue(new File(parent, "/icon/appicon.png").exists()); } @Test public void testCreatePackageNoDescriptor() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project2")); File result = builder.createDeploymentPackage(file); assertNull(result); } @Test(expected = IllegalStateException.class) public void testCreatePackageNoVersion() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project3")); builder.createDeploymentPackage(file); } @Test(expected = IllegalStateException.class) public void testCreatePackageInvalidDescriptor() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project4")); builder.createDeploymentPackage(file); } @Test public void testCreatePackageNoMapping() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project5")); File result = builder.createDeploymentPackage(file); assertNotNull(result); } @Test public void testCreatePackageNullLocation() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project1")); File result = builder.createDeploymentPackage((File) null); assertNull(result); } @Test public void testCreatePackageNotification() throws IOException { TestNotifier notifier = new TestNotifier(); PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project1"), notifier); File result = builder.createDeploymentPackage(file); assertNotNull(result); assertTrue(result.exists()); List<IStatus> statuses = notifier.getHistory(); assertEquals(StatusCode.STARTING, statuses.get(0).getCode()); assertEquals(StatusCode.STOPPING, statuses.get(statuses.size() - 1) .getCode()); assertEquals(6, statuses.size() - 2); } @Test public void testCreatePackageVariableResolver() throws IOException { PackageBuilder builder = new PackageBuilder(new File(FOLDER + "Project9")); builder.setVariableResolver(new IVariableResolver() { public String resolve(String path) { String varToReplace = "testVariable"; return path.replaceAll(varToReplace, "a"); } }); File result = builder.createDeploymentPackage(file.getCanonicalPath()); assertNotNull(result); assertTrue(result.exists()); unzip(result); File parent = result.getParentFile(); assertTrue(new File(parent, "data/include_it").exists()); assertTrue(new File(parent, "data/file").exists()); } public void unzip(File packageFile) { try { BufferedOutputStream dest = null; FileInputStream in = new FileInputStream(packageFile); File parent = packageFile.getParentFile(); ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(in)); ZipEntry entry; while ((entry = zipStream.getNextEntry()) != null) { int count; byte data[] = new byte[BUFFER]; File file = new File(parent, entry.getName()); createParents(file.getParentFile(), parent); if (entry.getName().endsWith("/")) { file.mkdir(); } else { file.getParentFile().mkdirs(); file.createNewFile(); FileOutputStream out = new FileOutputStream(file); dest = new BufferedOutputStream(out, BUFFER); while ((count = zipStream.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } } zipStream.close(); } catch (Exception e) { fail(e.getMessage()); } } private boolean createParents(File file, File root) { File parent = file.getParentFile(); if (parent.equals(root)) { file.mkdir(); return true; } else { if (!parent.exists()) { if (createParents(parent, root)) { file.mkdir(); return true; } } } return true; } }