/* * Copyright (C) 2013 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; import com.android.annotations.NonNull; import com.android.tools.lint.checks.AbstractCheckTest; import com.android.tools.lint.checks.HardcodedValuesDetector; import com.android.tools.lint.checks.ManifestDetector; import com.android.tools.lint.client.api.IssueRegistry; import com.android.tools.lint.detector.api.DefaultPosition; import com.android.tools.lint.detector.api.Detector; import com.android.tools.lint.detector.api.Issue; import com.android.tools.lint.detector.api.Location; import com.android.tools.lint.detector.api.Project; import com.android.tools.lint.detector.api.Severity; import com.google.common.base.Charsets; import com.google.common.io.Files; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MultiProjectHtmlReporterTest extends AbstractCheckTest { public void test() throws Exception { File dir = new File(getTargetDir(), "report"); try { LintCliClient client = new LintCliClient() { @Override IssueRegistry getRegistry() { if (mRegistry == null) { mRegistry = new IssueRegistry() { @NonNull @Override public List<Issue> getIssues() { return Arrays.asList( ManifestDetector.USES_SDK, HardcodedValuesDetector.ISSUE, // Not reported, but for the disabled-list ManifestDetector.MOCK_LOCATION); } }; } return mRegistry; } }; //noinspection ResultOfMethodCallIgnored dir.mkdirs(); MultiProjectHtmlReporter reporter = new MultiProjectHtmlReporter(client, dir); Project project = Project.create(client, new File("/foo/bar/Foo"), new File("/foo/bar/Foo")); Warning warning1 = new Warning(ManifestDetector.USES_SDK, "<uses-sdk> tag should specify a target API level (the highest verified " + "version; when running on later versions, compatibility behaviors may " + "be enabled) with android:targetSdkVersion=\"?\"", Severity.WARNING, project); warning1.line = 6; warning1.file = new File("/foo/bar/Foo/AndroidManifest.xml"); warning1.errorLine = " <uses-sdk android:minSdkVersion=\"8\" />\n ^\n"; warning1.path = "AndroidManifest.xml"; warning1.location = Location.create(warning1.file, new DefaultPosition(6, 4, 198), new DefaultPosition(6, 42, 236)); Warning warning2 = new Warning(HardcodedValuesDetector.ISSUE, "[I18N] Hardcoded string \"Fooo\", should use @string resource", Severity.WARNING, project); warning2.line = 11; warning2.file = new File("/foo/bar/Foo/res/layout/main.xml"); warning2.errorLine = " (java.lang.String) android:text=\"Fooo\" />\n" + " ~~~~~~~~~~~~~~~~~~~\n"; warning2.path = "res/layout/main.xml"; warning2.location = Location.create(warning2.file, new DefaultPosition(11, 8, 377), new DefaultPosition(11, 27, 396)); List<Warning> warnings = new ArrayList<Warning>(); warnings.add(warning1); warnings.add(warning2); reporter.write(0, 2, warnings); String report = Files.toString(new File(dir, "index.html"), Charsets.UTF_8); // Replace the timestamp to make golden file comparison work String timestampPrefix = "Check performed at "; int begin = report.indexOf(timestampPrefix); assertTrue(begin != -1); begin += timestampPrefix.length(); int end = report.indexOf(".<br/>", begin); assertTrue(end != -1); report = report.substring(0, begin) + "$DATE" + report.substring(end); // NOTE: If you change the output, please validate it manually in // http://validator.w3.org/#validate_by_input // before updating the following assertEquals("" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" + "<head>\n" + "<title>Lint Report</title>\n" + "<link rel=\"stylesheet\" type=\"text/css\" href=\"http://fonts.googleapis.com/css?family=Roboto\" />\n" + "<link rel=\"stylesheet\" type=\"text/css\" href=\"index_files/hololike.css\" />\n" + "</head>\n" + "<body>\n" + "<h1>Lint Report</h1>\n" + "<div class=\"titleSeparator\"></div>\n" + "Check performed at $DATE.<br/>\n" + "0 errors and 2 warnings found:\n" + "<br/><br/>\n" + "<table class=\"overview\">\n" + "<tr><th>Project</th><th class=\"countColumn\"><img border=\"0\" align=\"top\" src=\"index_files/lint-error.png\" alt=\"Error\" />\n" + "Errors</th><th class=\"countColumn\"><img border=\"0\" align=\"top\" src=\"index_files/lint-warning.png\" alt=\"Warning\" />\n" + "Warnings</th></tr>\n" + "<tr><td><a href=\"Foo.html\">Foo</a></td><td class=\"countColumn\">0</td><td class=\"countColumn\">2</td></tr>\n" + "</table>\n" + "</body>\n" + "</html>\n", report); assertTrue(new File(dir, "index_files" + File.separator + "hololike.css").exists()); assertTrue(new File(dir, "index_files" + File.separator + "lint-warning.png").exists()); assertTrue(new File(dir, "index_files" + File.separator + "lint-error.png").exists()); assertTrue(new File(dir, "Foo.html").exists()); } finally { //noinspection ResultOfMethodCallIgnored dir.delete(); } } @Override protected Detector getDetector() { fail("Not used in this test"); return null; } }