blob: d53c03d843dba8e90448138f0b8a2fef32c0a12e [file] [log] [blame]
/*
* 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;
}
}