| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 |
| * |
| * 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.tools.lint.client.api; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.tools.lint.checks.AbstractCheckTest; |
| import com.android.tools.lint.checks.UnusedResourceDetector; |
| import com.android.tools.lint.detector.api.Detector; |
| import com.android.tools.lint.detector.api.Project; |
| import com.android.tools.lint.detector.api.Severity; |
| |
| import java.io.File; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.List; |
| |
| public class ProjectTest extends AbstractCheckTest { |
| @Override |
| protected boolean ignoreSystemErrors() { |
| return false; |
| } |
| |
| public void testCycle() throws Exception { |
| // Ensure that a cycle in library project dependencies doesn't cause |
| // infinite directory traversal |
| File master = getProjectDir("MasterProject", |
| // Master project |
| "multiproject/main-manifest.xml=>AndroidManifest.xml", |
| "multiproject/main.properties=>project.properties", |
| "multiproject/MainCode.java.txt=>src/foo/main/MainCode.java" |
| ); |
| File library = getProjectDir("LibraryProject", |
| // Library project |
| "multiproject/library-manifest.xml=>AndroidManifest.xml", |
| "multiproject/main.properties=>project.properties", // RECURSIVE - points to self |
| "multiproject/LibraryCode.java.txt=>src/foo/library/LibraryCode.java", |
| "multiproject/strings.xml=>res/values/strings.xml" |
| ); |
| |
| assertEquals("" |
| + "MasterProject/project.properties: Error: Circular library dependencies; check your project.properties files carefully [LintError]\n" |
| + "1 errors, 0 warnings\n", |
| |
| checkLint(Arrays.asList(master, library))); |
| } |
| |
| public void testInvalidLibraryReferences1() throws Exception { |
| TestClient client = new TestClient(); |
| File dir = new File("project"); |
| TestProject project1 = new TestProject(client, dir); |
| client.registerProject(dir, project1); |
| project1.setDirectLibraries(Collections.<Project>singletonList(project1)); |
| List<Project> libraries = project1.getAllLibraries(); |
| assertNotNull(libraries); |
| assertEquals( |
| "Warning: Internal lint error: cyclic library dependency for Project [dir=project]", |
| client.getLoggedOutput()); |
| } |
| |
| public void testInvalidLibraryReferences2() throws Exception { |
| TestClient client = new TestClient(); |
| File dir1 = new File("project1"); |
| File dir2 = new File("project2"); |
| TestProject project1 = new TestProject(client, dir1); |
| client.registerProject(dir1, project1); |
| TestProject project2 = new TestProject(client, dir2); |
| client.registerProject(dir2, project2); |
| project2.setDirectLibraries(Collections.<Project>singletonList(project1)); |
| project1.setDirectLibraries(Collections.<Project>singletonList(project2)); |
| List<Project> libraries = project1.getAllLibraries(); |
| assertNotNull(libraries); |
| assertEquals( |
| "Warning: Internal lint error: cyclic library dependency for Project [dir=project1]", |
| client.getLoggedOutput()); |
| assertEquals(1, libraries.size()); |
| assertSame(project2, libraries.get(0)); |
| assertEquals(1, project2.getAllLibraries().size()); |
| assertSame(project1, project2.getAllLibraries().get(0)); |
| } |
| |
| public void testOkLibraryReferences() throws Exception { |
| TestClient client = new TestClient(); |
| File dir1 = new File("project1"); |
| File dir2 = new File("project2"); |
| File dir3 = new File("project3"); |
| TestProject project1 = new TestProject(client, dir1); |
| client.registerProject(dir1, project1); |
| TestProject project2 = new TestProject(client, dir2); |
| client.registerProject(dir2, project2); |
| TestProject project3 = new TestProject(client, dir3); |
| client.registerProject(dir3, project3); |
| project1.setDirectLibraries(Arrays.<Project>asList(project2, project3)); |
| project2.setDirectLibraries(Collections.<Project>singletonList(project3)); |
| project3.setDirectLibraries(Collections.<Project>emptyList()); |
| List<Project> libraries = project1.getAllLibraries(); |
| assertNotNull(libraries); |
| assertEquals( |
| "", |
| client.getLoggedOutput()); |
| assertEquals(2, libraries.size()); |
| assertTrue(libraries.contains(project2)); |
| assertTrue(libraries.contains(project3)); |
| assertEquals(1, project2.getAllLibraries().size()); |
| assertSame(project3, project2.getAllLibraries().get(0)); |
| assertTrue(project3.getAllLibraries().isEmpty()); |
| } |
| |
| private class TestClient extends TestLintClient { |
| @SuppressWarnings("StringBufferField") |
| private StringBuilder mLog = new StringBuilder(); |
| |
| @Override |
| public void log(@NonNull Severity severity, @Nullable Throwable exception, |
| @Nullable String format, @Nullable Object... args) { |
| assertNotNull(format); |
| mLog.append(severity.getDescription()).append(": "); |
| mLog.append(String.format(format, args)); |
| } |
| |
| public String getLoggedOutput() { |
| return mLog.toString(); |
| } |
| } |
| |
| private static class TestProject extends Project { |
| protected TestProject(@NonNull LintClient client, @NonNull File dir) { |
| super(client, dir, dir); |
| } |
| |
| public void setDirectLibraries(List<Project> libraries) { |
| mDirectLibraries = libraries; |
| } |
| } |
| |
| public void testDependsOn1() throws Exception { |
| File dir = getProjectDir("MyProject", |
| "multiproject/main-manifest.xml=>AndroidManifest.xml", |
| "multiproject/main.properties=>project.properties", |
| "multiproject/MainCode.java.txt=>src/foo/main/MainCode.java", |
| "bytecode/classes.jar=>libs/android-support-v4.jar" |
| ); |
| TestClient client = new TestClient(); |
| TestProject project1 = new TestProject(client, dir); |
| client.registerProject(dir, project1); |
| assertNull(project1.dependsOn("unknown:library")); |
| assertTrue(project1.dependsOn("com.android.support:support-v4")); |
| } |
| |
| public void testDependsOn2() throws Exception { |
| File dir = getProjectDir("MyProject", |
| "multiproject/main-manifest.xml=>AndroidManifest.xml", |
| "multiproject/main.properties=>project.properties", |
| "multiproject/MainCode.java.txt=>src/foo/main/MainCode.java", |
| "bytecode/classes.jar=>libs/support-v4-13.0.0-f5279ca6f213451a9dfb870f714ce6e6.jar" |
| ); |
| TestClient client = new TestClient(); |
| TestProject project1 = new TestProject(client, dir); |
| client.registerProject(dir, project1); |
| assertNull(project1.dependsOn("unknown:library")); |
| assertTrue(project1.dependsOn("com.android.support:support-v4")); |
| } |
| @Override |
| protected Detector getDetector() { |
| return new UnusedResourceDetector(); |
| } |
| } |