1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.cts.net.hostside; 17 18 import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG; 19 20 import android.text.TextUtils; 21 import android.util.ArraySet; 22 import android.util.Log; 23 24 import com.android.compatibility.common.util.BeforeAfterRule; 25 26 import org.junit.Assume; 27 import org.junit.runner.Description; 28 import org.junit.runners.model.Statement; 29 30 import java.util.ArrayList; 31 import java.util.Collections; 32 33 public class RequiredPropertiesRule extends BeforeAfterRule { 34 35 private static ArraySet<Property> mRequiredProperties; 36 37 @Override onBefore(Statement base, Description description)38 public void onBefore(Statement base, Description description) { 39 mRequiredProperties = getAllRequiredProperties(description); 40 41 final String testName = description.getClassName() + "#" + description.getMethodName(); 42 assertTestIsValid(testName, mRequiredProperties); 43 Log.i(TAG, "Running test " + testName + " with required properties: " 44 + propertiesToString(mRequiredProperties)); 45 } 46 getAllRequiredProperties(Description description)47 private ArraySet<Property> getAllRequiredProperties(Description description) { 48 final ArraySet<Property> allRequiredProperties = new ArraySet<>(); 49 RequiredProperties requiredProperties = description.getAnnotation(RequiredProperties.class); 50 if (requiredProperties != null) { 51 Collections.addAll(allRequiredProperties, requiredProperties.value()); 52 } 53 54 for (Class<?> clazz = description.getTestClass(); 55 clazz != null; clazz = clazz.getSuperclass()) { 56 requiredProperties = clazz.getDeclaredAnnotation(RequiredProperties.class); 57 if (requiredProperties == null) { 58 continue; 59 } 60 for (Property requiredProperty : requiredProperties.value()) { 61 for (Property p : Property.values()) { 62 if (p.getValue() == ~requiredProperty.getValue() 63 && allRequiredProperties.contains(p)) { 64 continue; 65 } 66 } 67 allRequiredProperties.add(requiredProperty); 68 } 69 } 70 return allRequiredProperties; 71 } 72 assertTestIsValid(String testName, ArraySet<Property> requiredProperies)73 private void assertTestIsValid(String testName, ArraySet<Property> requiredProperies) { 74 if (requiredProperies == null) { 75 return; 76 } 77 final ArrayList<Property> unsupportedProperties = new ArrayList<>(); 78 for (Property property : requiredProperies) { 79 if (!property.isSupported()) { 80 unsupportedProperties.add(property); 81 } 82 } 83 Assume.assumeTrue("Unsupported properties: " 84 + propertiesToString(unsupportedProperties), unsupportedProperties.isEmpty()); 85 } 86 getRequiredProperties()87 public static ArraySet<Property> getRequiredProperties() { 88 return mRequiredProperties; 89 } 90 propertiesToString(Iterable<Property> properties)91 private static String propertiesToString(Iterable<Property> properties) { 92 return "[" + TextUtils.join(",", properties) + "]"; 93 } 94 } 95