| /* |
| * Copyright (C) 2016 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.checks; |
| |
| import com.android.tools.lint.detector.api.Detector; |
| |
| /** |
| * <b>NOTE: This is not a final API; if you rely on this be prepared to adjust your code for the |
| * next tools release.</b> |
| */ |
| @SuppressWarnings("javadoc") |
| public class UnpackedNativeCodeDetectorTest extends AbstractCheckTest { |
| |
| @Override |
| protected Detector getDetector() { |
| return new UnpackedNativeCodeDetector(); |
| } |
| |
| /** Test that a manifest without extractNativeLibs produces warnings for Runtime.loadLibrary */ |
| public void testRuntimeLoadLibrary() { |
| String expected = |
| "" |
| + "src/main/AndroidManifest.xml:4: Warning: Missing attribute " |
| + "android:extractNativeLibs=\"false\" on the " |
| + "<application> tag [UnpackedNativeCode]\n" |
| + " <application android:allowBackup=\"true\">\n" |
| + " ^\n" |
| + "0 errors, 1 warnings\n"; |
| |
| //noinspection all // Sample code |
| lint().files( |
| manifest( |
| "" |
| + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
| + "<manifest package=\"com.example.android.custom-lint-rules\"\n" |
| + " xmlns:android=\"http://schemas.android.com/apk/res/android\">" |
| + "\n" |
| + " <application android:allowBackup=\"true\">\n" |
| + " </application>\n" |
| + "</manifest>"), |
| java( |
| "src/main/java/test/pkg/Load.java", |
| "" |
| + "package test.pkg;\n" |
| + "\n" |
| + "import java.lang.Runtime;\n" |
| + "\n" |
| + "public class Load {\n" |
| + " public static void foo() {\n" |
| + " Runtime.getRuntime().loadLibrary(\"hello\"); \n" |
| + " }\n" |
| + "}\n"), |
| gradle( |
| "" |
| + "buildscript {\n" |
| + " dependencies {\n" |
| + " classpath 'com.android.tools.build:gradle:2.2.0'\n" |
| + " }\n" |
| + "}\n" |
| + "android {\n" |
| + " compileSdkVersion 23\n" |
| + "}")) |
| .run() |
| .expect(expected) |
| .expectFixDiffs( |
| "" |
| + "Fix for src/main/AndroidManifest.xml line 3: Set extractNativeLibs=\"false\":\n" |
| + "@@ -5 +5\n" |
| + "- <application android:allowBackup=\"true\" >\n" |
| + "+ <application\n" |
| + "+ android:allowBackup=\"true\"\n" |
| + "+ android:extractNativeLibs=\"false\" >\n"); |
| } |
| |
| /** Test that a manifest without extractNativeLibs produces warnings for System.loadLibrary */ |
| public void testSystemLoadLibrary() { |
| String expected = |
| "" |
| + "src/main/AndroidManifest.xml:4: Warning: Missing attribute android:extractNativeLibs=\"false\" on the <application> tag [UnpackedNativeCode]\n" |
| + " <application>\n" |
| + " ^\n" |
| + "0 errors, 1 warnings\n"; |
| |
| //noinspection all // Sample code |
| lint().files( |
| manifest( |
| "" |
| + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
| + "<manifest package=\"com.example.android.custom-lint-rules\"\n" |
| + " xmlns:android=\"http://schemas.android.com/apk/res/android\">" |
| + "\n" |
| + " <application>\n" |
| + " </application>\n" |
| + "</manifest>"), |
| java( |
| "src/main/java/test/pkg/Load.java", |
| "" |
| + "package test.pkg;\n" |
| + "\n" |
| + "import java.lang.System;\n" |
| + "\n" |
| + "public class Load {\n" |
| + " public static void foo() {\n" |
| + " System.loadLibrary(\"hello\"); \n" |
| + " }\n" |
| + "}\n"), |
| gradle( |
| "" |
| + "buildscript {\n" |
| + " dependencies {\n" |
| + " classpath 'com.android.tools.build:gradle:2.2.0'\n" |
| + " }\n" |
| + "}\n" |
| + "android {\n" |
| + " compileSdkVersion 23\n" |
| + "}")) |
| .run() |
| .expect(expected) |
| .expectFixDiffs( |
| "" |
| + "Fix for src/main/AndroidManifest.xml line 3: Set extractNativeLibs=\"false\":\n" |
| + "@@ -5 +5\n" |
| + "- <application>\n" |
| + "+ <application android:extractNativeLibs=\"false\" >\n"); |
| } |
| |
| /** Test that a manifest with extractNativeLibs has no warnings. */ |
| public void testHasExtractNativeLibs() { |
| //noinspection all // Sample code |
| lint().files( |
| manifest( |
| "" |
| + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
| + "<manifest package=\"com.example.android.custom-lint-rules\"\n" |
| + " xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" |
| + " <application android:extractNativeLibs=\"false\">\n" |
| + " </application>\n" |
| + "</manifest>"), |
| java( |
| "src/main/java/test/pkg/Load.java", |
| "" |
| + "package test.pkg;\n" |
| + "\n" |
| + "import java.lang.Runtime;\n" |
| + "\n" |
| + "public class Load {\n" |
| + " public static void foo() {\n" |
| + " Runtime.getRuntime().loadLibrary(\"hello\"); // ok\n" |
| + " }\n" |
| + "}\n"), |
| gradle( |
| "" |
| + "buildscript {\n" |
| + " dependencies {\n" |
| + " classpath 'com.android.tools.build:gradle:2.2.0'\n" |
| + " }\n" |
| + "}\n" |
| + "android {\n" |
| + " compileSdkVersion 23\n" |
| + "}")) |
| .run() |
| .expectClean(); |
| } |
| |
| /** Test that suppressing the lint check using tools:ignore works. */ |
| public void testSuppress() { |
| //noinspection all // Sample code |
| lint().files( |
| manifest( |
| "" |
| + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
| + "<manifest package=\"com.example.android.custom-lint-rules\"\n" |
| + " xmlns:tools=\"http://schemas.android.com/tools\"\n" |
| + " xmlns:android=\"http://schemas.android.com/apk/res/android\">" |
| + "\n" |
| + " <application tools:ignore=\"UnpackedNativeCode\">\n" |
| + " </application>\n" |
| + "</manifest>"), |
| java( |
| "src/main/java/test/pkg/Load.java", |
| "" |
| + "package test.pkg;\n" |
| + "\n" |
| + "import java.lang.Runtime;\n" |
| + "\n" |
| + "public class Load {\n" |
| + " public static void foo() {\n" |
| + " Runtime.getRuntime().loadLibrary(\"hello\"); // ok\n" |
| + " }\n" |
| + "}\n"), |
| gradle( |
| "" |
| + "buildscript {\n" |
| + " dependencies {\n" |
| + " classpath 'com.android.tools.build:gradle:2.2.0'\n" |
| + " }\n" |
| + "}\n" |
| + "android {\n" |
| + " compileSdkVersion 23\n" |
| + "}")) |
| .run() |
| .expectClean(); |
| } |
| } |