1 // Copyright 2017 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.test.params; 6 7 import org.junit.runners.model.FrameworkMethod; 8 9 import java.lang.annotation.Annotation; 10 import java.lang.reflect.Method; 11 import java.util.ArrayList; 12 import java.util.Collection; 13 import java.util.List; 14 15 /** 16 * Custom FrameworkMethod that includes a {@code ParameterSet} that 17 * represents the parameters for this test method 18 */ 19 public class ParameterizedFrameworkMethod extends FrameworkMethod { 20 private ParameterSet mParameterSet; 21 private String mName; 22 ParameterizedFrameworkMethod( Method method, ParameterSet parameterSet, String classParameterSetName)23 public ParameterizedFrameworkMethod( 24 Method method, ParameterSet parameterSet, String classParameterSetName) { 25 super(method); 26 mParameterSet = parameterSet; 27 String postFix = ""; 28 if (classParameterSetName != null && !classParameterSetName.isEmpty()) { 29 postFix += "_" + classParameterSetName; 30 } 31 if (parameterSet != null && !parameterSet.getName().isEmpty()) { 32 postFix += "_" + parameterSet.getName(); 33 } 34 mName = postFix.isEmpty() ? method.getName() : method.getName() + "_" + postFix; 35 } 36 37 @Override getName()38 public String getName() { 39 return mName; 40 } 41 42 @Override invokeExplosively(Object target, Object... params)43 public Object invokeExplosively(Object target, Object... params) throws Throwable { 44 if (mParameterSet != null) { 45 return super.invokeExplosively(target, mParameterSet.getValues().toArray()); 46 } 47 return super.invokeExplosively(target, params); 48 } 49 wrapAllFrameworkMethods( Collection<FrameworkMethod> frameworkMethods, String classParameterSetName)50 static List<FrameworkMethod> wrapAllFrameworkMethods( 51 Collection<FrameworkMethod> frameworkMethods, String classParameterSetName) { 52 List<FrameworkMethod> results = new ArrayList<>(); 53 for (FrameworkMethod frameworkMethod : frameworkMethods) { 54 results.add(new ParameterizedFrameworkMethod( 55 frameworkMethod.getMethod(), null, classParameterSetName)); 56 } 57 return results; 58 } 59 60 @Override equals(Object obj)61 public boolean equals(Object obj) { 62 if (obj instanceof ParameterizedFrameworkMethod) { 63 ParameterizedFrameworkMethod method = (ParameterizedFrameworkMethod) obj; 64 return super.equals(obj) && method.getParameterSet().equals(getParameterSet()) 65 && method.getName().equals(getName()); 66 } 67 return false; 68 } 69 70 /** 71 * Override hashCode method to distinguish two ParameterizedFrameworkmethod with same 72 * Method object. 73 */ 74 @Override hashCode()75 public int hashCode() { 76 int result = 17; 77 result = 31 * result + super.hashCode(); 78 result = 31 * result + getName().hashCode(); 79 if (getParameterSet() != null) { 80 result = 31 * result + getParameterSet().hashCode(); 81 } 82 return result; 83 } 84 getTestAnnotations()85 Annotation[] getTestAnnotations() { 86 // TODO(yolandyan): add annotation from the ParameterSet, enable 87 // test writing to add SkipCheck for an individual parameter 88 return getMethod().getAnnotations(); 89 } 90 getParameterSet()91 public ParameterSet getParameterSet() { 92 return mParameterSet; 93 } 94 } 95