package org.infinispan.client.hotrod; import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.withClientListener; import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.withScript; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration; import static org.testng.AssertJUnit.assertEquals; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import org.infinispan.client.hotrod.event.EventLogListener; import org.infinispan.client.hotrod.test.InternalRemoteCacheManager; import org.infinispan.client.hotrod.test.MultiHotRodServersTest; import org.infinispan.commons.marshall.StringMarshaller; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.testng.AssertJUnit; import org.testng.annotations.Test; /** * These tests mimic how Javascript clients remotely execute typed scripts. * To help bridge the gap between the Javascript client and these tests, the * scripts are added by remotely storing them via the script cache, and the * execution is done with a String marshaller. */ @Test(groups = "functional", testName = "client.hotrod.ExecTypedTest") public class ExecTypedTest extends MultiHotRodServersTest { private static final String SCRIPT_CACHE = "___script_cache"; private static final int NUM_SERVERS = 2; static final String NAME = "exec-typed-cache"; RemoteCacheManager execClient; RemoteCacheManager addScriptClient; @Override protected void createCacheManagers() throws Throwable { createHotRodServers(NUM_SERVERS, new ConfigurationBuilder()); ConfigurationBuilder builder = hotRodCacheConfiguration( getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false)); defineInAll(NAME, builder); execClient = createExecClient(); addScriptClient = createAddScriptClient(); } private RemoteCacheManager createExecClient() { org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder = super.createHotRodClientConfigurationBuilder(servers.get(0).getPort()); clientBuilder.marshaller(new StringMarshaller(Charset.forName("UTF-8"))); return new InternalRemoteCacheManager(clientBuilder.build()); } private RemoteCacheManager createAddScriptClient() { org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder = super.createHotRodClientConfigurationBuilder(servers.get(0).getPort()); return new InternalRemoteCacheManager(clientBuilder.build()); } public void testLocalTypedExecPutGet() { execPutGet("/typed-put-get.js", ExecMode.LOCAL, "local-typed-key", "local-typed-value"); } public void testLocalTypedExecPutGetCyrillic() { execPutGet("/typed-put-get.js", ExecMode.LOCAL, "բարև", "привет"); } public void testLocalTypedExecPutGetEmptyString() { withScript(addScriptClient.getCache(SCRIPT_CACHE), "/typed-put-get.js", scriptName -> { Map<String, String> params = new HashMap<>(); params.put("k", "empty-key"); params.put("v", ""); String result = execClient.getCache(NAME).execute(scriptName, params); assertEquals(null, result); }); } public void testLocalTypedExecSize() { withScript(addScriptClient.getCache(SCRIPT_CACHE), "/typed-size.js", scriptName -> { execClient.getCache(NAME).clear(); String result = execClient.getCache(NAME).execute(scriptName, new HashMap<>()); assertEquals("0", result); }); } public void testLocalTypedExecWithCacheManager() { withScript(addScriptClient.getCache(SCRIPT_CACHE), "/typed-cachemanager-put-get.js", scriptName -> { String result = execClient.getCache(NAME).execute(scriptName, new HashMap<>()); assertEquals("a", result); }); } public void testLocalTypedExecNullReturn() { withScript(addScriptClient.getCache(SCRIPT_CACHE), "/typed-null-return.js", scriptName -> { String result = execClient.getCache(NAME).execute(scriptName, new HashMap<>()); assertEquals(null, result); }); } public void testDistTypedExecPutGet() { execPutGet("/typed-put-get-dist.js", ExecMode.DIST, "dist-typed-key", "dist-typed-value"); } public void testLocalTypedExecPutGetWithListener() { EventLogListener<String> l = new EventLogListener<>(execClient.getCache(NAME)); withClientListener(l, remote -> { withScript(addScriptClient.getCache(SCRIPT_CACHE), "/typed-put-get.js", scriptName -> { Map<String, String> params = new HashMap<>(); params.put("k", "local-typed-key-listen"); params.put("v", "local-typed-value-listen"); String result = remote.execute(scriptName, params); l.expectOnlyCreatedEvent("local-typed-key-listen"); assertEquals("local-typed-value-listen", result); }); }); } private void execPutGet(String path, ExecMode mode, String key, String value) { withScript(addScriptClient.getCache(SCRIPT_CACHE), path, scriptName -> { Map<String, String> params = new HashMap<>(); params.put("k", key); params.put("v", value); String result = execClient.getCache(NAME).execute(scriptName, params); mode.assertResult.accept(value, result); }); } enum ExecMode { LOCAL(AssertJUnit::assertEquals), DIST((v, r) -> assertEquals(String.format("[\"%1$s\", \"%1$s\"]", v), r)); final BiConsumer<String, String> assertResult; ExecMode(BiConsumer<String, String> assertResult) { this.assertResult = assertResult; } } }