Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f46ac0bf authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add test to verify all sysui tests extend the right stuff"

parents ff8f2cea fba8faf5
Loading
Loading
Loading
Loading
+128 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2017 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;

import static org.junit.Assert.assertFalse;

import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
import android.support.test.internal.runner.ClassPathScanner;
import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
import android.support.test.internal.runner.TestLoader;
import android.testing.AndroidTestingRunner;
import android.text.TextUtils;
import android.util.Log;

import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.SysuiTestCase;

import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;

/**
 * This is named AAAPlusPlusVerifySysuiRequiredTestPropertiesTest for two reasons.
 * a) Its so awesome it deserves an AAA++
 * b) It should run first to draw attention to itself.
 *
 * For trues though: this test verifies that all the sysui tests extend the right classes.
 * This matters because including tests with different context implementations in the same
 * test suite causes errors, such as the incorrect settings provider being cached.
 * For an example, see {@link com.android.systemui.DependencyTest}.
 */
@RunWith(AndroidTestingRunner.class)
@SmallTest
public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestCase {

    private static final String TAG = "AAA++VerifyTest";

    private static final Class[] BASE_CLS_WHITELIST = {
            SysuiTestCase.class,
            SysuiBaseFragmentTest.class,
    };

    private static final Class[] SUPPORTED_SIZES = {
            SmallTest.class,
            MediumTest.class,
            LargeTest.class,
            android.test.suitebuilder.annotation.SmallTest.class,
            android.test.suitebuilder.annotation.MediumTest.class,
            android.test.suitebuilder.annotation.LargeTest.class,
    };

    @Test
    public void testAllClassInheritance() {
        boolean anyClassWrong = false;
        TestLoader loader = new TestLoader();
        for (String className : getClassNamesFromClassPath()) {
            Class<?> cls = loader.loadIfTest(className);
            if (cls == null) continue;

            boolean hasParent = false;
            for (Class<?> parent : BASE_CLS_WHITELIST) {
                if (parent.isAssignableFrom(cls)) {
                    hasParent = true;
                    break;
                }
            }
            boolean hasSize = hasSize(cls);
            if (!hasSize) {
                anyClassWrong = true;
                Log.e(TAG, cls.getName() + " does not have size annotation, such as @SmallTest");
            }
            if (!hasParent) {
                anyClassWrong = true;
                Log.e(TAG, cls.getName() + " does not extend any of " + getClsStr());
            }
        }

        assertFalse("All sysui test classes must have size and extend one of " + getClsStr(),
                anyClassWrong);
    }

    private boolean hasSize(Class<?> cls) {
        for (int i = 0; i < SUPPORTED_SIZES.length; i++) {
            if (cls.getDeclaredAnnotation(SUPPORTED_SIZES[i]) != null) return true;
        }
        return false;
    }

    private Collection<String> getClassNamesFromClassPath() {
        ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());

        ChainedClassNameFilter filter = new ChainedClassNameFilter();

        filter.add(new ExternalClassNameFilter());
        filter.add(s -> s.startsWith("com.android.systemui")
                || s.startsWith("com.android.keyguard"));
        try {
            return scanner.getClassPathEntries(filter);
        } catch (IOException e) {
            Log.e(TAG, "Failed to scan classes", e);
        }
        return Collections.emptyList();
    }

    private String getClsStr() {
        return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
                .stream().map(cls -> cls.getSimpleName()).toArray());
    }
}
+5 −5
Original line number Original line Diff line number Diff line
@@ -19,26 +19,26 @@ package com.android.keyguard;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;


import android.content.Context;
import android.support.test.filters.SmallTest;
import android.support.test.InstrumentationRegistry;
import android.text.TextUtils;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
import android.widget.TextView;


import com.android.systemui.SysuiTestCase;

import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;


import java.util.List;
import java.util.List;


public class KeyguardClockAccessibilityDelegateTest {
@SmallTest
public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase {


    private Context mContext;
    private TextView mView;
    private TextView mView;


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        mContext = InstrumentationRegistry.getContext();
        mView = new TextView(mContext);
        mView = new TextView(mContext);
        mView.setText(R.string.keyguard_widget_12_hours_format);
        mView.setText(R.string.keyguard_widget_12_hours_format);
        mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
        mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
+2 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;


import android.os.Looper;
import android.os.Looper;
import android.support.test.filters.SmallTest;


import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.FlashlightController;
@@ -30,6 +31,7 @@ import org.junit.Test;


import java.io.PrintWriter;
import java.io.PrintWriter;


@SmallTest
public class DependencyTest extends SysuiTestCase {
public class DependencyTest extends SysuiTestCase {


    public static final DependencyKey<Dumpable> DUMPABLE = new DependencyKey<>("dumpable");
    public static final DependencyKey<Dumpable> DUMPABLE = new DependencyKey<>("dumpable");
+2 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.app.Fragment;
import android.app.Fragment;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.view.Display;
import android.view.Display;
import android.view.View;
import android.view.View;
@@ -52,6 +53,7 @@ import org.junit.runner.RunWith;


@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
@Ignore("flaking")
@Ignore("flaking")
@SmallTest
public class RoundedCornersTest extends SysuiTestCase {
public class RoundedCornersTest extends SysuiTestCase {


    private RoundedCorners mRoundedCorners;
    private RoundedCorners mRoundedCorners;
+1 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.MessageQueue;
import android.support.test.InstrumentationRegistry;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.testing.LeakCheck;
import android.testing.LeakCheck;
import android.util.Log;
import android.util.Log;


Loading