blob: f5cc58bcfa00f9e5b272218d236448c255ac0475 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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 com.android.ide.eclipse.adt.internal.wizards.exportgradle;
import static com.android.sdklib.internal.project.ProjectProperties.PROPERTY_LIBRARY;
import com.android.SdkConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator;
import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState;
import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
public class ExportGradleTest extends AdtProjectTest {
private QualifiedName ERROR_KEY = new QualifiedName(AdtPlugin.PLUGIN_ID, "JobErrorKey");
private Throwable mLastThrown;
@Override
public void setUp() throws Exception {
super.setUp();
mLastThrown = null;
}
@Override
protected boolean testCaseNeedsUniqueProject() {
return true;
}
public void testSimpleAndroidApp() throws Throwable {
IProject project = getProject("simple-app");
final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
final ProjectSetupBuilder builder = new ProjectSetupBuilder();
builder.setProject(Collections.singletonList(javaProject));
Job job = new Job("Validate project") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
BuildFileCreator.createBuildFiles(builder, null, monitor);
File buildfile = new File(javaProject.getResource().getLocation().toString(),
BuildFileCreator.BUILD_FILE);
assertTrue(buildfile.exists());
String contents = Files.toString(buildfile, Charsets.UTF_8);
String expectedContents =
"buildscript {\n" +
" repositories {\n" +
" " + BuildFileCreator.MAVEN_REPOSITORY + "\n" +
" }\n" +
" dependencies {\n" +
" " + BuildFileCreator.PLUGIN_CLASSPATH + "\n" +
" }\n" +
"}\n" +
"apply plugin: 'android'\n" +
"\n" +
"dependencies {\n" +
"}\n" +
"\n" +
"android {\n" +
" compileSdkVersion 16\n" +
" buildToolsVersion \"16\"\n" +
"\n" +
" defaultConfig {\n" +
" minSdkVersion 1\n" +
" targetSdkVersion 1\n" +
" }\n" +
" sourceSets {\n" +
" main {\n" +
" manifest.srcFile 'AndroidManifest.xml'\n" +
" java.srcDirs = ['src']\n" +
" resources.srcDirs = ['src']\n" +
" aidl.srcDirs = ['src']\n" +
" renderscript.srcDirs = ['src']\n" +
" res.srcDirs = ['res']\n" +
" assets.srcDirs = ['assets']\n" +
" }\n" +
" instrumentTest.setRoot('tests')\n" +
" }\n" +
"}";
assertEqualsWhitespaceInsensitive(expectedContents, contents);
} catch (Throwable t) {
mLastThrown = t;
}
return null;
}
};
job.schedule(1000);
job.join();
Object property = job.getProperty(ERROR_KEY);
assertNull(property);
if (mLastThrown != null) {
throw mLastThrown;
}
}
public void testSimpleAndroidLib() throws Throwable {
final IProject project = getProject("simple-library");
ProjectState projectState = Sdk.getProjectState(project.getProject());
ProjectPropertiesWorkingCopy propertiesWorkingCopy = projectState.getProperties().makeWorkingCopy();
propertiesWorkingCopy.setProperty(PROPERTY_LIBRARY, "true");
propertiesWorkingCopy.save();
IResource projectProp = project.findMember(SdkConstants.FN_PROJECT_PROPERTIES);
if (projectProp != null) {
projectProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
}
Job job = new Job("Validate project") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
final ProjectSetupBuilder builder = new ProjectSetupBuilder();
builder.setProject(Collections.singletonList(javaProject));
BuildFileCreator.createBuildFiles(builder, null, monitor);
File buildfile = new File(javaProject.getResource().getLocation().toString(),
BuildFileCreator.BUILD_FILE);
assertTrue(buildfile.exists());
String contents = Files.toString(buildfile, Charsets.UTF_8);
String expectedContents =
"buildscript {\n" +
" repositories {\n" +
" " + BuildFileCreator.MAVEN_REPOSITORY + "\n" +
" }\n" +
" dependencies {\n" +
" " + BuildFileCreator.PLUGIN_CLASSPATH + "\n" +
" }\n" +
"}\n" +
"apply plugin: 'android-library'\n" +
"\n" +
"dependencies {\n" +
"}\n" +
"\n" +
"android {\n" +
" compileSdkVersion 16\n" +
" buildToolsVersion \"16\"\n" +
"\n" +
" defaultConfig {\n" +
" minSdkVersion 1\n" +
" targetSdkVersion 1\n" +
" }\n" +
" sourceSets {\n" +
" main {\n" +
" manifest.srcFile 'AndroidManifest.xml'\n" +
" java.srcDirs = ['src']\n" +
" resources.srcDirs = ['src']\n" +
" aidl.srcDirs = ['src']\n" +
" renderscript.srcDirs = ['src']\n" +
" res.srcDirs = ['res']\n" +
" assets.srcDirs = ['assets']\n" +
" }\n" +
" instrumentTest.setRoot('tests')\n" +
" }\n" +
"}";
assertEqualsWhitespaceInsensitive(expectedContents, contents);
} catch (Throwable t) {
mLastThrown = t;
}
return null;
}
};
job.schedule(1000);
job.join();
Object property = job.getProperty(ERROR_KEY);
assertNull(property);
if (mLastThrown != null) {
throw mLastThrown;
}
}
public void testPlainJavaProject() throws Throwable {
IProject project = getJavaProject("simple-java");
final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
final ProjectSetupBuilder builder = new ProjectSetupBuilder();
builder.setProject(Collections.singletonList(javaProject));
BuildFileCreator.createBuildFiles(builder, null, null);
Job job = new Job("Validate project") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
File buildfile = new File(javaProject.getResource().getLocation().toString(), "build.gradle");
assertTrue(buildfile.exists());
String contents = Files.toString(buildfile, Charsets.UTF_8);
String expectedContents =
"apply plugin: 'java'\n" +
"sourceSets {\n" +
" main.java.srcDirs = ['src']\n" +
"}";
assertEqualsWhitespaceInsensitive(expectedContents, contents);
} catch (Throwable t) {
mLastThrown = t;
}
return null;
}
};
job.schedule(1000);
job.join();
Object property = job.getProperty(ERROR_KEY);
assertNull(property);
if (mLastThrown != null) {
throw mLastThrown;
}
}
protected IProject getProject(String projectName) {
IProject project = createProject(projectName);
assertNotNull(project);
if (!testCaseNeedsUniqueProject() && !testNeedsUniqueProject()) {
addCleanupDir(AdtUtils.getAbsolutePath(project).toFile());
}
addCleanupDir(project.getFullPath().toFile());
return project;
}
protected IProject getJavaProject(String projectName) {
IProject project = createJavaProject(projectName);
assertNotNull(project);
if (!testCaseNeedsUniqueProject() && !testNeedsUniqueProject()) {
addCleanupDir(AdtUtils.getAbsolutePath(project).toFile());
}
addCleanupDir(project.getFullPath().toFile());
return project;
}
protected IProject createJavaProject(String name) {
IRunnableContext context = new IRunnableContext() {
@Override
public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
throws InvocationTargetException, InterruptedException {
runnable.run(new NullProgressMonitor());
}
};
NewProjectWizardState state = new NewProjectWizardState(Mode.ANY);
state.projectName = name;
state.packageName = TEST_PROJECT_PACKAGE;
state.activityName = name;
state.applicationName = name;
state.createActivity = false;
state.useDefaultLocation = true;
if (getMinSdk() != -1) {
state.minSdk = Integer.toString(getMinSdk());
}
NewProjectCreator creator = new NewProjectCreator(state, context);
creator.createJavaProjects();
return validateProjectExists(name);
}
/**
* Compares two strings, disregarding whitespace. This makes the test less brittle with respect
* to insignificant changes.
*/
protected void assertEqualsWhitespaceInsensitive(String a, String b) {
a = stripWhitespace(a);
b = stripWhitespace(b);
assertEquals("Expected:\n" + a + "\nbut was:\n" + b + "\n\n", a, b);
}
protected String stripWhitespace(String s) {
return s.replaceAll("\\s","");
}
}