com.android.ide.eclipse.adt.internal.wizards.exportgradle.ExportGradleTest.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.adt.internal.wizards.exportgradle.ExportGradleTest.java

Source

/*
 * 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", "");
    }
}