/*******************************************************************************
* Copyright (c) 2015 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.test;
import static org.springsource.ide.eclipse.commons.tests.util.StsTestUtil.assertNoErrors;
import java.io.File;
import java.util.jar.JarFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.mockito.Mockito;
import org.springframework.ide.eclipse.boot.dash.BootDashActivator;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.packaging.CloudApplicationArchiverStrategies;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.packaging.CloudApplicationArchiverStrategy;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.packaging.ICloudApplicationArchiver;
import org.springframework.ide.eclipse.boot.dash.model.UserInteractions;
import org.springframework.ide.eclipse.boot.test.BootProjectTestHarness;
import org.springframework.ide.eclipse.boot.test.util.JavaUtils;
import org.springframework.ide.eclipse.boot.test.util.LaunchResult;
import org.springsource.ide.eclipse.commons.tests.util.StsTestCase;
import org.springsource.ide.eclipse.commons.tests.util.StsTestUtil;
import static org.springframework.ide.eclipse.boot.test.BootProjectTestHarness.setPackage;
public class BootJarPackagingTest extends StsTestCase {
private JavaUtils java = new JavaUtils();
@Override
protected void setUp() throws Exception {
super.setUp();
StsTestUtil.deleteAllProjects();
StsTestUtil.setAutoBuilding(false);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testSimple() throws Exception {
UserInteractions ui = Mockito.mock(UserInteractions.class);
BootProjectTestHarness harness = getHarness();
IProject project = harness.createBootProject("simple-boot",
setPackage("demo")
);
createFile(project, "src/main/java/demo/Greeter.java",
"package demo;\n" +
"\n" +
"import org.springframework.boot.CommandLineRunner;\n" +
"import org.springframework.stereotype.Component;\n" +
"\n" +
"@Component\n" +
"public class Greeter implements CommandLineRunner {\n" +
"\n" +
" @Override\n" +
" public void run(String... arg0) throws Exception {\n" +
" System.out.println(\"Hello World!\");\n" +
" }\n" +
"\n" +
"}\n"
);
StsTestUtil.assertNoErrors(project); // Builds the project
File jarFile = packageAsJar(project, ui);
LaunchResult result = java.runJar(jarFile);
assertContains("Hello World!", result.out);
assertEquals(0, result.terminationCode);
Mockito.verifyZeroInteractions(ui);
}
public void testProjectDependency() throws Exception {
IProject depProject = createPredefinedProject("demo-lib");
StsTestUtil.assertNoErrors(depProject);
UserInteractions ui = Mockito.mock(UserInteractions.class);
BootProjectTestHarness harness = getHarness();
IProject project = harness.createBootProject("simple-boot",
setPackage("demo")
);
fileReplace(project, "pom.xml",
"</dependencies>",
" <dependency>\n" +
" <groupId>org.demo</groupId>\n" +
" <artifactId>demo-lib</artifactId>\n" +
" <version>0.0.1</version>\n" +
" </dependency>\n" +
" </dependencies>");
createFile(project, "src/main/java/demo/Greeter.java",
"package demo;\n" +
"\n" +
"import org.demo.lib.TheLib;\n" +
"import org.springframework.boot.CommandLineRunner;\n" +
"import org.springframework.stereotype.Component;\n" +
"\n" +
"@Component\n" +
"public class Greeter implements CommandLineRunner {\n" +
"\n" +
" @Override\n" +
" public void run(String... arg0) throws Exception {\n" +
" System.out.println(TheLib.createGreeting(\"Kris\"));\n" +
" }\n" +
"\n" +
"}\n"
);
assertNoErrors(project);
File jarFile = packageAsJar(project, ui);
assertEntries(jarFile,
"lib/demo-lib.jar"
);
LaunchResult result = java.runJar(jarFile);
assertContains("Hello, Kris!", result.out);
assertEquals(0, result.terminationCode);
Mockito.verifyZeroInteractions(ui);
}
/**
* Verifies that jarFile has at least a given list of entries (in any order).
*/
private void assertEntries(File file, String... expected) throws Exception {
JarFile jarFile = new JarFile(file);
try {
for (String name : expected) {
assertNotNull("Missing expected Jar Entry: "+name, jarFile.getJarEntry(name));
}
} finally {
jarFile.close();
}
}
public static File packageAsJar(IProject project, UserInteractions ui) throws Exception {
CloudApplicationArchiverStrategy strategy = CloudApplicationArchiverStrategies.packageAsJar(project, ui);
ICloudApplicationArchiver archiver = strategy.getArchiver(new NullProgressMonitor());
assertNotNull(archiver);
File jar = archiver.getApplicationArchive(new NullProgressMonitor());
assertNotNull(jar);
assertTrue(jar.isFile());
return jar;
}
private BootProjectTestHarness getHarness() {
return new BootProjectTestHarness(ResourcesPlugin.getWorkspace());
}
@Override
protected String getBundleName() {
return BootDashTestBundleConstants.BUNDLE_ID;
}
}