Skip to content

Commit 912f53b

Browse files
committed
Test isTestFrameworkClass and prevent adding redundant entries
1 parent 9e2a506 commit 912f53b

File tree

4 files changed

+86
-8
lines changed

4 files changed

+86
-8
lines changed

test/framework/src/main/java/org/elasticsearch/entitlement/bootstrap/TestEntitlementBootstrap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ public static void setTriviallyAllowingTestCode(boolean newValue) {
8787
policyManager.setTriviallyAllowingTestCode(newValue);
8888
}
8989

90-
public static void addEntitledTestPackages(String[] entitledTestPackages) {
91-
policyManager.addEntitledTestPackages(entitledTestPackages);
90+
public static void setEntitledTestPackages(String[] entitledTestPackages) {
91+
policyManager.setEntitledTestPackages(entitledTestPackages);
9292
}
9393

9494
public static void reset() {

test/framework/src/main/java/org/elasticsearch/entitlement/runtime/policy/TestPolicyManager.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ public void setTriviallyAllowingTestCode(boolean newValue) {
6363
this.isTriviallyAllowingTestCode = newValue;
6464
}
6565

66-
public void addEntitledTestPackages(String[] entitledTestPackages) {
66+
public void setEntitledTestPackages(String... entitledTestPackages) {
67+
assertNoRedundantPrefixes(TEST_FRAMEWORK_PACKAGE_PREFIXES, entitledTestPackages, false);
68+
if (entitledTestPackages.length > 1) {
69+
assertNoRedundantPrefixes(entitledTestPackages, entitledTestPackages, true);
70+
}
6771
String[] packages = ArrayUtils.concat(this.entitledTestPackages, entitledTestPackages);
6872
Arrays.sort(packages);
6973
this.entitledTestPackages = packages;
@@ -120,13 +124,44 @@ private boolean isEntitlementClass(Class<?> requestingClass) {
120124
}
121125

122126
private boolean isTestFrameworkClass(Class<?> requestingClass) {
123-
String packageName = requestingClass.getPackageName();
124-
int idx = Arrays.binarySearch(entitledTestPackages, packageName);
127+
return isTestFrameworkClass(entitledTestPackages, requestingClass.getPackageName());
128+
}
129+
130+
// no redundant entries allowed, see assertNoRedundantPrefixes
131+
static boolean isTestFrameworkClass(String[] sortedPrefixes, String packageName) {
132+
int idx = Arrays.binarySearch(sortedPrefixes, packageName);
125133
if (idx >= 0) {
126134
return true;
127135
}
128-
idx = -idx - 2; // candidate package (insertion point - 1)
129-
return idx >= 0 && idx < entitledTestPackages.length && packageName.startsWith(entitledTestPackages[idx]);
136+
idx = -idx - 2; // candidate package index (insertion point - 1)
137+
if (idx >= 0 && idx < sortedPrefixes.length) {
138+
String candidate = sortedPrefixes[idx];
139+
if (packageName.startsWith(candidate)
140+
&& (packageName.length() == candidate.length() || packageName.charAt(candidate.length()) == '.')) {
141+
return true;
142+
}
143+
}
144+
return false;
145+
}
146+
147+
private static boolean isNotPrefixMatch(String name, String prefix, boolean discardExactMatch) {
148+
assert prefix.endsWith(".") == false : "Invalid package prefix ending with '.' [" + prefix + "]";
149+
if (name == prefix || name.startsWith(prefix)) {
150+
if (name.length() == prefix.length()) {
151+
return discardExactMatch;
152+
}
153+
return false == (name.length() > prefix.length() && name.charAt(prefix.length()) == '.');
154+
}
155+
return true;
156+
}
157+
158+
static void assertNoRedundantPrefixes(String[] setA, String[] setB, boolean discardExactMatch) {
159+
for (String a : setA) {
160+
for (String b : setB) {
161+
assert isNotPrefixMatch(a, b, discardExactMatch) && isNotPrefixMatch(b, a, discardExactMatch)
162+
: "Redundant prefix entries: [" + a + ", " + b + "]";
163+
}
164+
}
130165
}
131166

132167
private boolean isTestCode(Class<?> requestingClass) {

test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ public static void setupEntitlementsForClass() {
536536
if (entitledPackages != null) {
537537
assert withEntitlementsOnTestCode == false : "Cannot use @WithEntitlementsOnTestCode together with @EntitledTestPackages";
538538
assert entitledPackages.value().length > 0 : "No test packages specified in @EntitledTestPackages";
539-
TestEntitlementBootstrap.addEntitledTestPackages(entitledPackages.value());
539+
TestEntitlementBootstrap.setEntitledTestPackages(entitledPackages.value());
540540
}
541541
} else if (withEntitlementsOnTestCode) {
542542
throw new AssertionError(

test/framework/src/test/java/org/elasticsearch/entitlement/runtime/policy/TestPolicyManagerTests.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
import org.elasticsearch.test.ESTestCase;
1414
import org.junit.Before;
1515

16+
import java.util.Arrays;
1617
import java.util.List;
1718
import java.util.Map;
1819
import java.util.concurrent.atomic.AtomicInteger;
1920

2021
import static org.elasticsearch.entitlement.runtime.policy.PolicyManager.ComponentKind.PLUGIN;
22+
import static org.hamcrest.Matchers.both;
23+
import static org.hamcrest.Matchers.containsString;
24+
import static org.hamcrest.Matchers.equalTo;
2125

2226
public class TestPolicyManagerTests extends ESTestCase {
2327
TestPolicyManager policyManager;
@@ -60,4 +64,43 @@ public void testIsTriviallyAllowed() {
6064
policyManager.setTriviallyAllowingTestCode(false);
6165
assertFalse(policyManager.isTriviallyAllowed(getClass()));
6266
}
67+
68+
public void testDefaultEntitledTestPackages() {
69+
String[] testPackages = policyManager.entitledTestPackages.clone();
70+
TestPolicyManager.assertNoRedundantPrefixes(testPackages, testPackages, true);
71+
72+
Arrays.sort(testPackages);
73+
assertThat("Entitled test framework packages are not sorted", policyManager.entitledTestPackages, equalTo(testPackages));
74+
}
75+
76+
public void testRejectSetRedundantEntitledTestPackages() {
77+
var throwable = expectThrows(AssertionError.class, () -> policyManager.setEntitledTestPackages("org.apache.lucene.tests"));
78+
var baseMatcher = both(containsString("Redundant prefix entries"));
79+
assertThat(throwable.getMessage(), baseMatcher.and(containsString("org.apache.lucene.tests, org.apache.lucene.tests")));
80+
81+
throwable = expectThrows(AssertionError.class, () -> policyManager.setEntitledTestPackages("org.apache.lucene"));
82+
assertThat(throwable.getMessage(), baseMatcher.and(containsString("org.apache.lucene.tests, org.apache.lucene")));
83+
84+
throwable = expectThrows(AssertionError.class, () -> policyManager.setEntitledTestPackages("org.apache.lucene.tests.whatever"));
85+
assertThat(throwable.getMessage(), baseMatcher.and(containsString("org.apache.lucene.tests, org.apache.lucene.tests.whatever")));
86+
87+
throwable = expectThrows(AssertionError.class, () -> policyManager.setEntitledTestPackages("my.package", "my.package.sub"));
88+
assertThat(throwable.getMessage(), baseMatcher.and(containsString("my.package, my.package.sub")));
89+
90+
throwable = expectThrows(AssertionError.class, () -> policyManager.setEntitledTestPackages("trailing.dot."));
91+
assertThat(throwable.getMessage(), containsString("Invalid package prefix ending with '.' [trailing.dot.]"));
92+
}
93+
94+
public void testIsTestFrameworkClass() {
95+
String[] sortedPrefixes = { "a.b", "a.bc", "a.c" };
96+
97+
assertTrue(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.b"));
98+
assertTrue(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.b.c"));
99+
assertTrue(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.bc"));
100+
assertTrue(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.bc.a"));
101+
102+
assertFalse(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a"));
103+
assertFalse(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.ba"));
104+
assertFalse(TestPolicyManager.isTestFrameworkClass(sortedPrefixes, "a.bcc"));
105+
}
63106
}

0 commit comments

Comments
 (0)