/* * Copyright (C) 2015 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; public class FullBackupContentDetectorTest extends AbstractCheckTest { @Override protected Detector getDetector() { return new FullBackupContentDetector(); } public void testOk() throws Exception { assertEquals("No warnings.", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <include domain=\"file\" path=\"dd\"/>\n" + " <exclude domain=\"file\" path=\"dd/fo3o.txt\"/>\n" + " <exclude domain=\"file\" path=\"dd/ss/foo.txt\"/>\n" + "</full-backup-content>"))); } public void test20890435() throws Exception { assertEquals("" + "res/xml/backup.xml:6: Error: foo.xml is not in an included path [FullBackupContent]\n" + " <exclude domain=\"sharedpref\" path=\"foo.xml\"/>\n" + " ~~~~~~~\n" + "1 errors, 0 warnings\n", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <include domain=\"file\" path=\"dd\"/>\n" + " <exclude domain=\"file\" path=\"dd/fo3o.txt\"/>\n" + " <exclude domain=\"file\" path=\"dd/ss/foo.txt\"/>\n" + " <exclude domain=\"sharedpref\" path=\"foo.xml\"/>\n" + "</full-backup-content>"))); } public void testImplicitInclude() throws Exception { // If there is no include, then everything is considered included assertEquals("No warnings.", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <exclude domain=\"file\" path=\"dd/fo3o.txt\"/>\n" + "</full-backup-content>"))); } public void testImplicitPath() throws Exception { // If you specify an include, but no path attribute, that's defined to mean include // everything assertEquals("No warnings.", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <include domain=\"file\"/>\n" + " <exclude domain=\"file\" path=\"dd/fo3o.txt\"/>\n" + " <include domain=\"sharedpref\" path=\"something\"/>\n" + "</full-backup-content>"))); } public void testSuppressed() throws Exception { assertEquals("No warnings.", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content xmlns:tools=\"http://schemas.android.com/tools\">\n" + " <include domain=\"file\" path=\"dd\"/>\n" + " <exclude domain=\"file\" path=\"dd/fo3o.txt\"/>\n" + " <exclude domain=\"file\" path=\"dd/ss/foo.txt\"/>\n" + " <exclude domain=\"sharedpref\" path=\"foo.xml\" tools:ignore=\"FullBackupContent\"/>\n" + "</full-backup-content>"))); } public void testIncludeWrongDomain() throws Exception { // Ensure that the path prefix check is done independently for each domain assertEquals("" + "res/xml/backup.xml:4: Error: abc/def.txt is not in an included path [FullBackupContent]\n" + " <exclude domain=\"external\" path=\"abc/def.txt\"/>\n" + " ~~~~~~~~~~~\n" + "res/xml/backup.xml:6: Error: def/ghi.txt is not in an included path [FullBackupContent]\n" + " <exclude domain=\"external\" path=\"def/ghi.txt\"/>\n" + " ~~~~~~~~~~~\n" + "2 errors, 0 warnings\n", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <include domain=\"file\" path=\"abc\"/>\n" + " <exclude domain=\"external\" path=\"abc/def.txt\"/>\n" + " <include domain=\"file\" path=\"def\"/>\n" + " <exclude domain=\"external\" path=\"def/ghi.txt\"/>\n" + "</full-backup-content>"))); } public void testValidation() throws Exception { assertEquals("" + "res/xml/backup.xml:7: Error: Subdirectories are not allowed for domain sharedpref [FullBackupContent]\n" + " <include domain=\"sharedpref\" path=\"dd/subdir\"/>\n" + " ~~~~~~~~~\n" + "res/xml/backup.xml:8: Error: Paths are not allowed to contain .. [FullBackupContent]\n" + " <include domain=\"file\" path=\"../outside\"/>\n" + " ~~~~~~~~~~\n" + "res/xml/backup.xml:9: Error: Paths are not allowed to contain // [FullBackupContent]\n" + " <include domain=\"file\" path=\"//wrong\"/>\n" + " ~~~~~~~\n" + "res/xml/backup.xml:11: Error: Include dd is also excluded [FullBackupContent]\n" + " <exclude domain=\"external\" path=\"dd\"/>\n" + " ~~\n" + " res/xml/backup.xml:10: Unnecessary/conflicting <include>\n" + "res/xml/backup.xml:12: Error: Unexpected domain unknown-domain, expected one of root, file, database, sharedpref, external [FullBackupContent]\n" + " <exclude domain=\"unknown-domain\" path=\"dd\"/>\n" + " ~~~~~~~~~~~~~~\n" + "res/xml/backup.xml:12: Error: dd is not in an included path [FullBackupContent]\n" + " <exclude domain=\"unknown-domain\" path=\"dd\"/>\n" + " ~~\n" + "res/xml/backup.xml:13: Error: Missing domain attribute, expected one of root, file, database, sharedpref, external [FullBackupContent]\n" + " <include path=\"dd\"/>\n" + " ~~~~~~~~~~~~~~~~~~~~\n" + "res/xml/backup.xml:15: Error: Unexpected element <wrongtag> [FullBackupContent]\n" + " <wrongtag />\n" + " ~~~~~~~~\n" + "8 errors, 0 warnings\n", lintProject(xml("res/xml/backup.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<full-backup-content>\n" + " <include domain=\"root\" path=\"dd\"/>\n" // OK + " <include domain=\"file\" path=\"dd\"/>\n" // OK + " <include domain=\"database\" path=\"dd\"/>\n" // OK + " <include domain=\"sharedpref\" path=\"dd\"/>\n" // OK + " <include domain=\"sharedpref\" path=\"dd/subdir\"/>\n" // Not allowed + " <include domain=\"file\" path=\"../outside\"/>\n" // Not allowed + " <include domain=\"file\" path=\"//wrong\"/>\n" // Not allowed + " <include domain=\"external\" path=\"dd\"/>\n" // OK + " <exclude domain=\"external\" path=\"dd\"/>\n" // same as included + " <exclude domain=\"unknown-domain\" path=\"dd\"/>\n" + " <include path=\"dd\"/>\n" // No domain + " <include domain=\"root\" />\n" // OK (means include everything + " <wrongtag />\n" + "</full-backup-content>"))); } }