/* * Copyright (C) 2008 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.tests.functests.sampleProjects; import com.android.ide.eclipse.adt.project.ProjectHelper; import com.android.ide.eclipse.adt.wizards.newproject.StubSampleProjectWizard; import com.android.ide.eclipse.tests.FuncTestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.swt.widgets.Display; import java.util.logging.Level; import java.util.logging.Logger; /** * Test case that verifies all SDK sample projects can be imported, built in * Eclipse * * TODO: add support for deploying apps onto emulator and verifying successful * execution there * */ public class SampleProjectTest extends FuncTestCase { private static final Logger sLogger = Logger.getLogger(SampleProjectTest.class.getName()); /** * Tests the sample project with the given name * * @param name - name of sample project to test */ protected void doTestSampleProject(String name) { try { StubSampleProjectWizard newProjCreator = new StubSampleProjectWizard( name, getOsSdkLocation()); newProjCreator.init(null, null); newProjCreator.performFinish(); IProject iproject = validateProjectExists(name); validateNoProblems(iproject); } catch (CoreException e) { fail("Unexpected exception when creating sample project: " + e.toString()); } } public void testApiDemos() { doTestSampleProject("ApiDemos"); } public void testHelloActivity() { doTestSampleProject("HelloActivity"); } public void testLunarLander() { doTestSampleProject("LunarLander"); } public void testNotePad() { doTestSampleProject("NotePad"); } public void testSkeletonApp() { doTestSampleProject("SkeletonApp"); } public void testSnake() { doTestSampleProject("Snake"); } private IProject validateProjectExists(String name) { IProject iproject = getIProject(name); assertTrue(iproject.exists()); assertTrue(iproject.isOpen()); return iproject; } private IProject getIProject(String name) { IProject iproject = ResourcesPlugin.getWorkspace().getRoot() .getProject(name); return iproject; } private void validateNoProblems(IProject iproject) throws CoreException { waitForBuild(iproject); assertFalse(ProjectHelper.hasError(iproject, true)); } /** * Waits for build to complete. * * @param iproject */ private void waitForBuild(final IProject iproject) { final BuiltProjectDeltaVisitor deltaVisitor = new BuiltProjectDeltaVisitor(iproject); IResourceChangeListener newBuildListener = new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { try { event.getDelta().accept(deltaVisitor); } catch (CoreException e) { fail(); } } }; iproject.getWorkspace().addResourceChangeListener(newBuildListener, IResourceChangeEvent.POST_BUILD); // poll build listener to determine when build is done // loop max of 1200 times * 50 ms = 60 seconds final int maxWait = 1200; for (int i=0; i < maxWait; i++) { if (deltaVisitor.isProjectBuilt()) { return; } try { Thread.sleep(50); } catch (InterruptedException e) { } if (Display.getCurrent() != null) { Display.getCurrent().readAndDispatch(); } } sLogger.log(Level.SEVERE, "expected build event never happened?"); fail("expected build event never happened for " + iproject.getName()); } /** * Scans a given IResourceDelta looking for a "build event" change for given IProject * */ private class BuiltProjectDeltaVisitor implements IResourceDeltaVisitor { private IProject mIProject; private boolean mIsBuilt; public BuiltProjectDeltaVisitor(IProject iproject) { mIProject = iproject; mIsBuilt = false; } public boolean visit(IResourceDelta delta) { if (mIProject.equals(delta.getResource())) { setBuilt(true); return false; } return true; } private synchronized void setBuilt(boolean b) { mIsBuilt = b; } public synchronized boolean isProjectBuilt() { return mIsBuilt; } } }