Skip to content

Commit d7104a0

Browse files
committed
unit tests
1 parent a65deae commit d7104a0

File tree

2 files changed

+174
-41
lines changed

2 files changed

+174
-41
lines changed

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyUtils.java

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -41,47 +41,6 @@ public class PolicyUtils {
4141

4242
private static final Logger logger = LogManager.getLogger(PolicyUtils.class);
4343

44-
public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additionalScopes) {
45-
var result = new ArrayList<Scope>();
46-
var additionalScopesMap = additionalScopes.stream().collect(Collectors.toMap(Scope::moduleName, Scope::entitlements));
47-
for (var mainScope : mainScopes) {
48-
List<Entitlement> additionalEntitlements = additionalScopesMap.remove(mainScope.moduleName());
49-
if (additionalEntitlements == null) {
50-
result.add(mainScope);
51-
} else {
52-
result.add(new Scope(mainScope.moduleName(), mergeEntitlements(mainScope.entitlements(), additionalEntitlements)));
53-
}
54-
}
55-
56-
for (var remainingEntry : additionalScopesMap.entrySet()) {
57-
result.add(new Scope(remainingEntry.getKey(), remainingEntry.getValue()));
58-
}
59-
return result;
60-
}
61-
62-
static List<Entitlement> mergeEntitlements(List<Entitlement> a, List<Entitlement> b) {
63-
Map<Class<? extends Entitlement>, Entitlement> entitlementMap = a.stream()
64-
.collect(Collectors.toMap(Entitlement::getClass, Function.identity()));
65-
66-
for (var entitlement : b) {
67-
entitlementMap.merge(entitlement.getClass(), entitlement, PolicyUtils::mergeEntitlement);
68-
}
69-
return entitlementMap.values().stream().toList();
70-
}
71-
72-
static Entitlement mergeEntitlement(Entitlement entitlement1, Entitlement entitlement2) {
73-
return switch (entitlement1) {
74-
case FilesEntitlement e -> new FilesEntitlement(
75-
Stream.concat(e.filesData().stream(), ((FilesEntitlement) entitlement2).filesData().stream()).toList()
76-
);
77-
case WriteSystemPropertiesEntitlement e -> new WriteSystemPropertiesEntitlement(
78-
Stream.concat(e.properties().stream(), ((WriteSystemPropertiesEntitlement) entitlement2).properties().stream())
79-
.collect(Collectors.toUnmodifiableSet())
80-
);
81-
default -> entitlement1;
82-
};
83-
}
84-
8544
public record PluginData(Path pluginPath, boolean isModular, boolean isExternalPlugin) {
8645
public PluginData {
8746
requireNonNull(pluginPath);
@@ -193,4 +152,49 @@ private static Set<String> getModuleNames(Path pluginRoot, boolean isModular) {
193152
return Set.of(ALL_UNNAMED);
194153
}
195154

155+
public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additionalScopes) {
156+
var result = new ArrayList<Scope>();
157+
var additionalScopesMap = additionalScopes.stream().collect(Collectors.toMap(Scope::moduleName, Scope::entitlements));
158+
for (var mainScope : mainScopes) {
159+
List<Entitlement> additionalEntitlements = additionalScopesMap.remove(mainScope.moduleName());
160+
if (additionalEntitlements == null) {
161+
result.add(mainScope);
162+
} else {
163+
result.add(new Scope(mainScope.moduleName(), mergeEntitlements(mainScope.entitlements(), additionalEntitlements)));
164+
}
165+
}
166+
167+
for (var remainingEntry : additionalScopesMap.entrySet()) {
168+
result.add(new Scope(remainingEntry.getKey(), remainingEntry.getValue()));
169+
}
170+
return result;
171+
}
172+
173+
static List<Entitlement> mergeEntitlements(List<Entitlement> a, List<Entitlement> b) {
174+
Map<Class<? extends Entitlement>, Entitlement> entitlementMap = a.stream()
175+
.collect(Collectors.toMap(Entitlement::getClass, Function.identity()));
176+
177+
for (var entitlement : b) {
178+
entitlementMap.merge(entitlement.getClass(), entitlement, PolicyUtils::mergeEntitlement);
179+
}
180+
return entitlementMap.values().stream().toList();
181+
}
182+
183+
static Entitlement mergeEntitlement(Entitlement entitlement1, Entitlement entitlement2) {
184+
return switch (entitlement1) {
185+
case FilesEntitlement e -> merge(e, (FilesEntitlement) entitlement2);
186+
case WriteSystemPropertiesEntitlement e -> merge(e, (WriteSystemPropertiesEntitlement) entitlement2);
187+
default -> entitlement1;
188+
};
189+
}
190+
191+
private static FilesEntitlement merge(FilesEntitlement a, FilesEntitlement b) {
192+
return new FilesEntitlement(Stream.concat(a.filesData().stream(), b.filesData().stream()).distinct().toList());
193+
}
194+
195+
private static WriteSystemPropertiesEntitlement merge(WriteSystemPropertiesEntitlement a, WriteSystemPropertiesEntitlement b) {
196+
return new WriteSystemPropertiesEntitlement(
197+
Stream.concat(a.properties().stream(), b.properties().stream()).collect(Collectors.toUnmodifiableSet())
198+
);
199+
}
196200
}

libs/entitlement/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyUtilsTests.java

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,28 @@
99

1010
package org.elasticsearch.entitlement.runtime.policy;
1111

12+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
13+
import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement;
14+
import org.elasticsearch.entitlement.runtime.policy.entitlements.InboundNetworkEntitlement;
1215
import org.elasticsearch.entitlement.runtime.policy.entitlements.LoadNativeLibrariesEntitlement;
16+
import org.elasticsearch.entitlement.runtime.policy.entitlements.ManageThreadsEntitlement;
17+
import org.elasticsearch.entitlement.runtime.policy.entitlements.OutboundNetworkEntitlement;
1318
import org.elasticsearch.entitlement.runtime.policy.entitlements.SetHttpsConnectionPropertiesEntitlement;
19+
import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteAllSystemPropertiesEntitlement;
20+
import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteSystemPropertiesEntitlement;
1421
import org.elasticsearch.test.ESTestCase;
1522

1623
import java.nio.charset.StandardCharsets;
24+
import java.nio.file.Path;
1725
import java.util.Base64;
1826
import java.util.List;
1927
import java.util.Set;
2028

29+
import static org.elasticsearch.entitlement.runtime.policy.PolicyUtils.mergeEntitlement;
30+
import static org.elasticsearch.entitlement.runtime.policy.PolicyUtils.mergeEntitlements;
31+
import static org.elasticsearch.test.LambdaMatchers.transformedMatch;
32+
import static org.hamcrest.Matchers.both;
33+
import static org.hamcrest.Matchers.containsInAnyOrder;
2134
import static org.hamcrest.Matchers.equalTo;
2235
import static org.hamcrest.Matchers.nullValue;
2336

@@ -159,4 +172,120 @@ public void testNoOverriddenPolicyWithParsingError() {
159172

160173
assertThat(policy, nullValue());
161174
}
175+
176+
public void testMergeScopes() {
177+
var originalPolicy = List.of(
178+
new Scope("module1", List.of(new LoadNativeLibrariesEntitlement())),
179+
new Scope("module2", List.of(new ManageThreadsEntitlement())),
180+
new Scope("module3", List.of(new InboundNetworkEntitlement()))
181+
);
182+
183+
var patchPolicy = List.of(
184+
new Scope("module2", List.of(new ManageThreadsEntitlement())),
185+
new Scope("module3", List.of(new OutboundNetworkEntitlement())),
186+
new Scope("module4", List.of(new WriteAllSystemPropertiesEntitlement()))
187+
);
188+
189+
var resultPolicy = PolicyUtils.mergeScopes(originalPolicy, patchPolicy);
190+
assertThat(
191+
resultPolicy,
192+
containsInAnyOrder(
193+
equalTo(new Scope("module1", List.of(new LoadNativeLibrariesEntitlement()))),
194+
equalTo(new Scope("module2", List.of(new ManageThreadsEntitlement()))),
195+
both(transformedMatch(Scope::moduleName, equalTo("module3"))).and(
196+
transformedMatch(
197+
Scope::entitlements,
198+
containsInAnyOrder(new InboundNetworkEntitlement(), new OutboundNetworkEntitlement())
199+
)
200+
),
201+
equalTo(new Scope("module4", List.of(new WriteAllSystemPropertiesEntitlement())))
202+
)
203+
);
204+
}
205+
206+
public void testMergeSameFlagEntitlement() {
207+
var e1 = new InboundNetworkEntitlement();
208+
var e2 = new InboundNetworkEntitlement();
209+
210+
assertThat(mergeEntitlement(e1, e2), equalTo(new InboundNetworkEntitlement()));
211+
}
212+
213+
public void testMergeFilesEntitlement() {
214+
var e1 = new FilesEntitlement(
215+
List.of(
216+
FilesEntitlement.FileData.ofPath(Path.of("/a/b"), FilesEntitlement.Mode.READ),
217+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ_WRITE),
218+
FilesEntitlement.FileData.ofRelativePath(Path.of("c/d"), FilesEntitlement.BaseDir.CONFIG, FilesEntitlement.Mode.READ)
219+
)
220+
);
221+
var e2 = new FilesEntitlement(
222+
List.of(
223+
FilesEntitlement.FileData.ofPath(Path.of("/a/b"), FilesEntitlement.Mode.READ), // identical
224+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ), // different mode
225+
FilesEntitlement.FileData.ofPath(Path.of("/c/d"), FilesEntitlement.Mode.READ) // different type
226+
)
227+
);
228+
229+
var merged = mergeEntitlement(e1, e2);
230+
assertThat(
231+
merged,
232+
transformedMatch(
233+
x -> ((FilesEntitlement) x).filesData(),
234+
containsInAnyOrder(
235+
FilesEntitlement.FileData.ofPath(Path.of("/a/b"), FilesEntitlement.Mode.READ),
236+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ),
237+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ_WRITE),
238+
FilesEntitlement.FileData.ofRelativePath(Path.of("c/d"), FilesEntitlement.BaseDir.CONFIG, FilesEntitlement.Mode.READ),
239+
FilesEntitlement.FileData.ofPath(Path.of("/c/d"), FilesEntitlement.Mode.READ)
240+
)
241+
)
242+
);
243+
}
244+
245+
public void testMergeWritePropertyEntitlement() {
246+
var e1 = new WriteSystemPropertiesEntitlement(List.of("a", "b", "c"));
247+
var e2 = new WriteSystemPropertiesEntitlement(List.of("b", "c", "d"));
248+
249+
var merged = mergeEntitlement(e1, e2);
250+
assertThat(
251+
merged,
252+
transformedMatch(x -> ((WriteSystemPropertiesEntitlement) x).properties(), containsInAnyOrder("a", "b", "c", "d"))
253+
);
254+
}
255+
256+
public void testMergeEntitlements() {
257+
List<Entitlement> a = List.of(
258+
new InboundNetworkEntitlement(),
259+
new OutboundNetworkEntitlement(),
260+
new FilesEntitlement(
261+
List.of(
262+
FilesEntitlement.FileData.ofPath(Path.of("/a/b"), FilesEntitlement.Mode.READ),
263+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ_WRITE)
264+
)
265+
)
266+
);
267+
List<Entitlement> b = List.of(
268+
new InboundNetworkEntitlement(),
269+
new LoadNativeLibrariesEntitlement(),
270+
new FilesEntitlement(List.of()),
271+
new WriteSystemPropertiesEntitlement(List.of("a"))
272+
);
273+
274+
var merged = mergeEntitlements(a, b);
275+
assertThat(
276+
merged,
277+
containsInAnyOrder(
278+
new InboundNetworkEntitlement(),
279+
new OutboundNetworkEntitlement(),
280+
new LoadNativeLibrariesEntitlement(),
281+
new FilesEntitlement(
282+
List.of(
283+
FilesEntitlement.FileData.ofPath(Path.of("/a/b"), FilesEntitlement.Mode.READ),
284+
FilesEntitlement.FileData.ofPath(Path.of("/a/c"), FilesEntitlement.Mode.READ_WRITE)
285+
)
286+
),
287+
new WriteSystemPropertiesEntitlement(List.of("a"))
288+
)
289+
);
290+
}
162291
}

0 commit comments

Comments
 (0)