diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtSdkTestCase.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtSdkTestCase.java new file mode 100644 index 000000000..ef4028fbc --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtSdkTestCase.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2009 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; + +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.sdk.LoadStatus; +import com.android.ide.eclipse.adt.internal.sdk.Sdk; + +/** + * A test case which uses the Sdk loaded by the Adt plugin. + */ +public abstract class AdtSdkTestCase extends SdkTestCase { + + protected AdtSdkTestCase() { + } + + /** + * Gets the current Sdk from Adt, waiting if necessary. + */ + protected Sdk loadSdk() { + AdtPlugin adt = AdtPlugin.getDefault(); + Object sdkLock = adt.getSdkLockObject(); + LoadStatus loadStatus = LoadStatus.LOADING; + // wait for Adt to load the Sdk on a separate thread + // loop max of 600 times * 200 ms = 2 minutes + final int maxWait = 600; + for (int i=0; i < maxWait && loadStatus == LoadStatus.LOADING; i++) { + try { + Thread.sleep(200); + } + catch (InterruptedException e) { + // ignore + } + synchronized(sdkLock) { + loadStatus = adt.getSdkLoadStatus(); + } + } + Sdk sdk = null; + synchronized(sdkLock) { + assertEquals(LoadStatus.LOADED, loadStatus); + sdk = Sdk.getCurrent(); + } + assertNotNull(sdk); + return sdk; + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTestCase.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTestCase.java deleted file mode 100644 index 344f9ee78..000000000 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTestCase.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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; - -import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetParser; -import com.android.ide.eclipse.adt.internal.sdk.Sdk; -import com.android.sdklib.IAndroidTarget; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; - -import junit.framework.TestCase; - -/** - * Generic superclass for Eclipse Android functional test cases, that provides common facilities. - */ -public class FuncTestCase extends TestCase { - - private String mOsSdkLocation; - protected Sdk mSdk; - - /** - * Initializes test SDK - *

- * Fails test if environment variable "sdk_home" is not set. - */ - @Override - protected void setUp() throws Exception { - super.setUp(); - mOsSdkLocation = System.getProperty("sdk_home"); - if (mOsSdkLocation == null) { - mOsSdkLocation = System.getenv("sdk_home"); - } - if (mOsSdkLocation == null || mOsSdkLocation.length() < 1) { - fail("Environment variable sdk_home is not set"); - } - - loadSdk(mOsSdkLocation); - } - - /** - * Returns the absolute file system path of the Android SDK location to use for this test. - */ - protected String getOsSdkLocation() { - return mOsSdkLocation; - } - - /** - * Returns the {@link Sdk} under test. - */ - protected Sdk getSdk() { - return mSdk; - } - - /** - * Loads the {@link Sdk}. - */ - private void loadSdk(String sdkLocation) { - mSdk = Sdk.loadSdk(sdkLocation); - - int n = mSdk.getTargets().length; - if (n > 0) { - for (IAndroidTarget target : mSdk.getTargets()) { - IStatus status = new AndroidTargetParser(target).run(new NullProgressMonitor()); - if (status.getCode() != IStatus.OK) { - fail("Failed to parse targets data"); - } - } - } - } -} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkEnvTestCase.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkEnvTestCase.java new file mode 100644 index 000000000..1039a7f60 --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkEnvTestCase.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2009 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; + +import com.android.ide.eclipse.adt.internal.sdk.Sdk; + + +/** + * A test case that receives a specific Sdk to test via the "sdk_home" environment variable. + */ +public abstract class SdkEnvTestCase extends SdkTestCase { + + protected SdkEnvTestCase() { + } + + /** + * Loads the {@link Sdk}. + *

+ * Fails test if environment variable "sdk_home" is not set. + */ + @Override + protected Sdk loadSdk() { + String osSdkLocation = System.getProperty("sdk_home"); + if (osSdkLocation == null) { + osSdkLocation = System.getenv("sdk_home"); + } + if (osSdkLocation == null || osSdkLocation.length() < 1) { + fail("Environment variable sdk_home is not set"); + } + return Sdk.loadSdk(osSdkLocation); + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkTestCase.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkTestCase.java new file mode 100644 index 000000000..322ce3e69 --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkTestCase.java @@ -0,0 +1,67 @@ +/* + * 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; + +import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetParser; +import com.android.ide.eclipse.adt.internal.sdk.Sdk; +import com.android.sdklib.IAndroidTarget; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; + +import junit.framework.TestCase; + +/** + * A test case that needs a reference to a SDK. + */ +public abstract class SdkTestCase extends TestCase { + + private Sdk mSdk; + + protected SdkTestCase() { + } + + /** + * Retrieve the {@link Sdk} under test. + */ + protected Sdk getSdk() { + if (mSdk == null) { + mSdk = loadSdk(); + assertNotNull(mSdk); + validateSdk(mSdk); + } + return mSdk; + } + + /** + * Loads the {@link Sdk} to use for test + */ + protected abstract Sdk loadSdk(); + + /** + * Checks that the provided sdk contains one or more valid targets. + * @param sdk the {@link Sdk} to validate. + */ + private void validateSdk(Sdk sdk) { + assertTrue("sdk has no targets", sdk.getTargets().length > 0); + for (IAndroidTarget target : sdk.getTargets()) { + IStatus status = new AndroidTargetParser(target).run(new NullProgressMonitor()); + if (status.getCode() != IStatus.OK) { + fail("Failed to parse targets data"); + } + } + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java index f4dafc80a..3b52789ab 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java @@ -39,7 +39,7 @@ import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager; import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData; import com.android.ide.eclipse.adt.internal.sdk.LoadStatus; import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.LayoutBridge; -import com.android.ide.eclipse.tests.FuncTestCase; +import com.android.ide.eclipse.tests.SdkEnvTestCase; import com.android.layoutlib.api.ILayoutResult; import com.android.layoutlib.api.IProjectCallback; import com.android.layoutlib.api.IResourceValue; @@ -59,7 +59,7 @@ import java.util.Map; import javax.imageio.ImageIO; -public class ApiDemosRenderingTest extends FuncTestCase { +public class ApiDemosRenderingTest extends SdkEnvTestCase { /** * Custom parser that implements {@link IXmlPullParser} (which itself extends @@ -121,7 +121,7 @@ public class ApiDemosRenderingTest extends FuncTestCase { } private void findApiDemos() throws IOException, XmlPullParserException { - IAndroidTarget[] targets = mSdk.getTargets(); + IAndroidTarget[] targets = getSdk().getTargets(); for (IAndroidTarget target : targets) { String path = target.getPath(IAndroidTarget.SAMPLES); @@ -141,7 +141,7 @@ public class ApiDemosRenderingTest extends FuncTestCase { } private void testSample(IAndroidTarget target, File sampleProject) throws IOException, XmlPullParserException { - AndroidTargetData data = mSdk.getTargetData(target); + AndroidTargetData data = getSdk().getTargetData(target); if (data == null) { fail("No AndroidData!"); } diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java index 4b7d0148f..89421efe8 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java @@ -16,12 +16,13 @@ package com.android.ide.eclipse.tests.functests.sampleProjects; import com.android.ide.eclipse.adt.AndroidConstants; -import com.android.ide.eclipse.adt.internal.project.ProjectHelper; import com.android.ide.eclipse.adt.wizards.newproject.StubProjectWizard; -import com.android.ide.eclipse.tests.FuncTestCase; +import com.android.ide.eclipse.tests.AdtSdkTestCase; import com.android.sdklib.IAndroidTarget; +import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; @@ -43,7 +44,7 @@ import java.util.logging.Logger; * execution there * */ -public class SampleProjectTest extends FuncTestCase { +public class SampleProjectTest extends AdtSdkTestCase { private static final Logger sLogger = Logger.getLogger(SampleProjectTest.class.getName()); @@ -56,7 +57,7 @@ public class SampleProjectTest extends FuncTestCase { public void testSamples() throws CoreException { // TODO: For reporting purposes, it would be better if a separate test success or failure // could be reported for each sample - IAndroidTarget[] targets = mSdk.getTargets(); + IAndroidTarget[] targets = getSdk().getTargets(); for (IAndroidTarget target : targets) { doTestSamplesForTarget(target); } @@ -145,8 +146,25 @@ public class SampleProjectTest extends FuncTestCase { private void validateNoProblems(IProject iproject) throws CoreException { waitForBuild(iproject); - assertFalse(String.format("%s project has compile errors", iproject.getName()), - ProjectHelper.hasError(iproject, true)); + + boolean hasErrors = false; + StringBuilder failureBuilder = new StringBuilder(String.format("%s project has errors:", + iproject.getName())); + IMarker[] markers = iproject.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); + if (markers != null && markers.length > 0) { + // the project has marker(s). even though they are "problem" we + // don't know their severity. so we loop on them and figure if they + // are warnings or errors + for (IMarker m : markers) { + int s = m.getAttribute(IMarker.SEVERITY, -1); + if (s == IMarker.SEVERITY_ERROR) { + hasErrors = true; + failureBuilder.append("\n"); + failureBuilder.append(m.getAttribute(IMarker.MESSAGE, "")); + } + } + } + assertFalse(failureBuilder.toString(), hasErrors); } /**