/* * Copyright (C) 2023 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.internal.systemui.lint import com.android.tools.lint.checks.infrastructure.TestFiles import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Issue import org.junit.Test class DumpableNotRegisteredDetectorTest : SystemUILintDetectorTest() { override fun getDetector(): Detector = DumpableNotRegisteredDetector() override fun getIssues(): List = listOf(DumpableNotRegisteredDetector.ISSUE) @Test fun classIsNotDumpable_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; class SomeClass() { } """ .trimIndent() ), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } @Test fun classIsDumpable_andRegisterIsCalled_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; public class SomeClass implements Dumpable { SomeClass(DumpManager dumpManager) { dumpManager.registerDumpable(this); } @Override void dump(PrintWriter pw, String[] args) { pw.println("testDump"); } } """ .trimIndent() ), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } @Test fun classIsDumpable_andRegisterNormalIsCalled_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; public class SomeClass implements Dumpable { SomeClass(DumpManager dumpManager) { dumpManager.registerNormalDumpable(this); } @Override void dump(PrintWriter pw, String[] args) { pw.println("testDump"); } } """ .trimIndent() ), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } @Test fun classIsDumpable_andRegisterCriticalIsCalled_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; public class SomeClass implements Dumpable { SomeClass(DumpManager dumpManager) { dumpManager.registerCriticalDumpable(this); } @Override void dump(PrintWriter pw, String[] args) { pw.println("testDump"); } } """ .trimIndent() ), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } @Test fun classIsDumpable_noRegister_violation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; public class SomeClass implements Dumpable { @Override public void dump() { } } """ ) .indented(), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expect( (""" src/test/pkg/SomeClass.java:5: Warning: Any class implementing Dumpable must call DumpManager.registerNormalDumpable or DumpManager.registerCriticalDumpable [DumpableNotRegistered] public class SomeClass implements Dumpable { ~~~~~~~~~ 0 errors, 1 warnings """) .trimIndent() ) } @Test fun classIsDumpable_usesNotDumpManagerMethod_violation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; import com.android.systemui.OtherRegistrationObject; public class SomeClass implements Dumpable { public SomeClass(OtherRegistrationObject otherRegistrationObject) { otherRegistrationObject.registerDumpable(this); } @Override public void dump() { } } """ ) .indented(), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expect( (""" src/test/pkg/SomeClass.java:6: Warning: Any class implementing Dumpable must call DumpManager.registerNormalDumpable or DumpManager.registerCriticalDumpable [DumpableNotRegistered] public class SomeClass implements Dumpable { ~~~~~~~~~ 0 errors, 1 warnings """) .trimIndent() ) } @Test fun classIsDumpableAndCoreStartable_noRegister_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; import com.android.systemui.CoreStartable; public class SomeClass implements Dumpable, CoreStartable { @Override public void start() { } @Override public void dump() { } } """ ) .indented(), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } @Test fun classIsAbstract_noRegister_noViolation() { lint() .files( TestFiles.java( """ package test.pkg; import com.android.systemui.Dumpable; public abstract class SomeClass implements Dumpable { void abstractMethodHere(); @Override public void dump() { } } """ ) .indented(), *stubs, ) .issues(DumpableNotRegisteredDetector.ISSUE) .run() .expectClean() } companion object { private val DUMPABLE_STUB = TestFiles.java( """ package com.android.systemui; import com.android.systemui.dump.DumpManager; import java.io.PrintWriter; public interface Dumpable { void dump(); } """ ) .indented() private val DUMP_MANAGER_STUB = TestFiles.java( """ package com.android.systemui.dump; public interface DumpManager { void registerDumpable(Dumpable module); void registerNormalDumpable(Dumpable module); void registerCriticalDumpable(Dumpable module); } """ ) .indented() private val OTHER_REGISTRATION_OBJECT_STUB = TestFiles.java( """ package com.android.systemui; public interface OtherRegistrationObject { void registerDumpable(Dumpable module); } """ ) .indented() private val CORE_STARTABLE_STUB = TestFiles.java( """ package com.android.systemui; public interface CoreStartable { void start(); } """ ) .indented() private val stubs = arrayOf( DUMPABLE_STUB, DUMP_MANAGER_STUB, OTHER_REGISTRATION_OBJECT_STUB, CORE_STARTABLE_STUB, ) } }