ScriptLanguagesInfoTests.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
  3. * or more contributor license agreements. Licensed under the Elastic License
  4. * 2.0 and the Server Side Public License, v 1; you may not use this file except
  5. * in compliance with, at your election, the Elastic License 2.0 or the Server
  6. * Side Public License, v 1.
  7. */
  8. package org.elasticsearch.script;
  9. import org.elasticsearch.common.settings.Settings;
  10. import org.elasticsearch.test.ESTestCase;
  11. import java.util.ArrayList;
  12. import java.util.Arrays;
  13. import java.util.Collections;
  14. import java.util.HashMap;
  15. import java.util.HashSet;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.function.Function;
  19. import java.util.stream.Collectors;
  20. public class ScriptLanguagesInfoTests extends ESTestCase {
  21. public void testEmptyTypesAllowedReturnsAllTypes() {
  22. ScriptService ss = getMockScriptService(Settings.EMPTY);
  23. ScriptLanguagesInfo info = ss.getScriptLanguages();
  24. ScriptType[] types = ScriptType.values();
  25. assertEquals(types.length, info.typesAllowed.size());
  26. for (ScriptType type : types) {
  27. assertTrue("[" + type.getName() + "] is allowed", info.typesAllowed.contains(type.getName()));
  28. }
  29. }
  30. public void testSingleTypesAllowedReturnsThatType() {
  31. for (ScriptType type : ScriptType.values()) {
  32. ScriptService ss = getMockScriptService(Settings.builder().put("script.allowed_types", type.getName()).build());
  33. ScriptLanguagesInfo info = ss.getScriptLanguages();
  34. assertEquals(1, info.typesAllowed.size());
  35. assertTrue("[" + type.getName() + "] is allowed", info.typesAllowed.contains(type.getName()));
  36. }
  37. }
  38. public void testBothTypesAllowedReturnsBothTypes() {
  39. List<String> types = Arrays.stream(ScriptType.values()).map(ScriptType::getName).toList();
  40. Settings.Builder settings = Settings.builder().putList("script.allowed_types", types);
  41. ScriptService ss = getMockScriptService(settings.build());
  42. ScriptLanguagesInfo info = ss.getScriptLanguages();
  43. assertEquals(types.size(), info.typesAllowed.size());
  44. for (String type : types) {
  45. assertTrue("[" + type + "] is allowed", info.typesAllowed.contains(type));
  46. }
  47. }
  48. private ScriptService getMockScriptService(Settings settings) {
  49. MockScriptEngine scriptEngine = new MockScriptEngine(
  50. MockScriptEngine.NAME,
  51. Collections.singletonMap("test_script", script -> 1),
  52. Collections.emptyMap()
  53. );
  54. Map<String, ScriptEngine> engines = Collections.singletonMap(scriptEngine.getType(), scriptEngine);
  55. return new ScriptService(settings, engines, ScriptModule.CORE_CONTEXTS, () -> 1L);
  56. }
  57. public interface MiscContext {
  58. void execute();
  59. Object newInstance();
  60. }
  61. public void testOnlyScriptEngineContextsReturned() {
  62. MockScriptEngine scriptEngine = new MockScriptEngine(
  63. MockScriptEngine.NAME,
  64. Collections.singletonMap("test_script", script -> 1),
  65. Collections.emptyMap()
  66. );
  67. Map<String, ScriptEngine> engines = Collections.singletonMap(scriptEngine.getType(), scriptEngine);
  68. Map<String, ScriptContext<?>> mockContexts = scriptEngine.getSupportedContexts()
  69. .stream()
  70. .collect(Collectors.toMap(c -> c.name, Function.identity()));
  71. String miscContext = "misc_context";
  72. assertFalse(mockContexts.containsKey(miscContext));
  73. Map<String, ScriptContext<?>> mockAndMiscContexts = new HashMap<>(mockContexts);
  74. mockAndMiscContexts.put(miscContext, new ScriptContext<>(miscContext, MiscContext.class));
  75. ScriptService ss = new ScriptService(Settings.EMPTY, engines, mockAndMiscContexts, () -> 1L);
  76. ScriptLanguagesInfo info = ss.getScriptLanguages();
  77. assertTrue(info.languageContexts.containsKey(MockScriptEngine.NAME));
  78. assertEquals(1, info.languageContexts.size());
  79. assertEquals(mockContexts.keySet(), info.languageContexts.get(MockScriptEngine.NAME));
  80. }
  81. public void testContextsAllowedSettingRespected() {
  82. MockScriptEngine scriptEngine = new MockScriptEngine(
  83. MockScriptEngine.NAME,
  84. Collections.singletonMap("test_script", script -> 1),
  85. Collections.emptyMap()
  86. );
  87. Map<String, ScriptEngine> engines = Collections.singletonMap(scriptEngine.getType(), scriptEngine);
  88. Map<String, ScriptContext<?>> mockContexts = scriptEngine.getSupportedContexts()
  89. .stream()
  90. .collect(Collectors.toMap(c -> c.name, Function.identity()));
  91. List<String> allContexts = new ArrayList<>(mockContexts.keySet());
  92. List<String> allowed = new ArrayList<>(allContexts.subList(0, allContexts.size() / 2));
  93. String miscContext = "misc_context";
  94. allowed.add(miscContext);
  95. // check that allowing more than available doesn't pollute the returned contexts
  96. Settings.Builder settings = Settings.builder().putList("script.allowed_contexts", allowed);
  97. Map<String, ScriptContext<?>> mockAndMiscContexts = new HashMap<>(mockContexts);
  98. mockAndMiscContexts.put(miscContext, new ScriptContext<>(miscContext, MiscContext.class));
  99. ScriptService ss = new ScriptService(settings.build(), engines, mockAndMiscContexts, () -> 1L);
  100. ScriptLanguagesInfo info = ss.getScriptLanguages();
  101. assertTrue(info.languageContexts.containsKey(MockScriptEngine.NAME));
  102. assertEquals(1, info.languageContexts.size());
  103. assertEquals(new HashSet<>(allContexts.subList(0, allContexts.size() / 2)), info.languageContexts.get(MockScriptEngine.NAME));
  104. }
  105. }