/* * Copyright 2014 Red Hat, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.test.core; import io.vertx.core.Vertx; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.core.spi.cluster.ClusterManager; import io.vertx.test.fakecluster.FakeClusterManager; import org.junit.Test; import java.io.Serializable; import static io.vertx.test.core.TestUtils.*; /** * @author <a href="http://tfox.org">Tim Fox</a> */ public class ClusterWideMapTest extends VertxTestBase { protected int getNumNodes() { return 1; } protected Vertx getVertx() { return vertices[0]; } public void setUp() throws Exception { super.setUp(); startNodes(getNumNodes()); } @Override protected ClusterManager getClusterManager() { return new FakeClusterManager(); } @Test public void testMapPutGetByte() { testMapPutGet((byte)1, (byte)2); } @Test public void testMapPutGetShort() { testMapPutGet((short)1, (short)2); } @Test public void testMapPutGetInt() { testMapPutGet(1, 2); } @Test public void testMapPutGetLong() { testMapPutGet(1l, 2l); } @Test public void testMapPutGetChar() { testMapPutGet('X', 'Y'); } @Test public void testMapPutGetFloat() { testMapPutGet(1.2f, 2.2f); } @Test public void testMapPutGetDouble() { testMapPutGet(1.2d, 2.2d); } @Test public void testMapPutGetBoolean() { testMapPutGet("foo", true); } @Test public void testMapPutGetString() { testMapPutGet("foo", "bar"); } @Test public void testMapPutGetJsonObject() { testMapPutGet(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw")); } @Test public void testMapPutGetJsonArray() { testMapPutGet(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false)); } @Test public void testMapPutGetSerializableObject() { testMapPutGet(new SomeSerializableObject("bar"), new SomeSerializableObject("bar")); } @Test public void testMapPutTtl() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { map.put("pipo", "molo", 10, onSuccess(vd -> { vertx.setTimer(10, l -> { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map2 -> { map2.get("pipo", onSuccess(res -> { assertNull(res); testComplete(); })); })); }); })); })); await(); } @Test public void testMapPutIfAbsentGetByte() { testMapPutIfAbsentGet((byte)1, (byte)2); } @Test public void testMapPutIfAbsentGetShort() { testMapPutIfAbsentGet((short)1, (short)2); } @Test public void testMapPutIfAbsentGetInt() { testMapPutIfAbsentGet(1, 2); } @Test public void testMapPutIfAbsentGetLong() { testMapPutIfAbsentGet(1l, 2l); } @Test public void testMapPutIfAbsentGetChar() { testMapPutIfAbsentGet('X', 'Y'); } @Test public void testMapPutIfAbsentGetFloat() { testMapPutIfAbsentGet(1.2f, 2.2f); } @Test public void testMapPutIfAbsentGetDouble() { testMapPutIfAbsentGet(1.2d, 2.2d); } @Test public void testMapPutIfAbsentGetBoolean() { testMapPutIfAbsentGet("foo", true); } @Test public void testMapPutIfAbsentGetString() { testMapPutIfAbsentGet("foo", "bar"); } @Test public void testMapPutIfAbsentGetJsonObject() { testMapPutIfAbsentGet(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw")); } @Test public void testMapPutIfAbsentGetJsonArray() { testMapPutIfAbsentGet(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false)); } @Test public void testMapPutIfAbsentGetSerializableObject() { testMapPutIfAbsentGet(new SomeSerializableObject("bar"), new SomeSerializableObject("bar")); } @Test public void testMapPutIfAbsentTtl() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { map.putIfAbsent("pipo", "molo", 10, onSuccess(vd -> { assertNull(vd); vertx.setTimer(10, l -> { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map2 -> { map2.get("pipo", onSuccess(res -> { assertNull(res); testComplete(); })); })); }); })); })); await(); } @Test public void testMapRemoveByte() { testMapRemove((byte)1, (byte)2); } @Test public void testMapRemoveShort() { testMapRemove((short)1, (short)2); } @Test public void testMapRemoveInt() { testMapRemove(1, 2); } @Test public void testMapRemoveLong() { testMapRemove(1l, 2l); } @Test public void testMapRemoveChar() { testMapRemove('X', 'Y'); } @Test public void testMapRemoveFloat() { testMapRemove(1.2f, 2.2f); } @Test public void testMapRemoveDouble() { testMapRemove(1.2d, 2.2d); } @Test public void testMapRemoveBoolean() { testMapRemove("foo", true); } @Test public void testMapRemoveString() { testMapRemove("foo", "bar"); } @Test public void testMapRemoveJsonObject() { testMapRemove(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw")); } @Test public void testMapRemoveJsonArray() { testMapRemove(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false)); } @Test public void testMapRemoveSerializableObject() { testMapRemove(new SomeSerializableObject("bar"), new SomeSerializableObject("bar")); } @Test public void testMapRemoveIfPresentByte() { testMapRemoveIfPresent((byte)1, (byte)2, (byte)3); } @Test public void testMapRemoveIfPresentShort() { testMapRemoveIfPresent((short)1, (short)2, (short)3); } @Test public void testMapRemoveIfPresentInt() { testMapRemoveIfPresent(1, 2, 3); } @Test public void testMapRemoveIfPresentLong() { testMapRemoveIfPresent(1l, 2l, 3l); } @Test public void testMapRemoveIfPresentChar() { testMapRemoveIfPresent('X', 'Y', 'Z'); } @Test public void testMapRemoveIfPresentFloat() { testMapRemoveIfPresent(1.2f, 2.2f, 3.3f); } @Test public void testMapRemoveIfPresentDouble() { testMapRemoveIfPresent(1.2d, 2.2d, 3.3d); } @Test public void testMapRemoveIfPresentBoolean() { testMapRemoveIfPresent("foo", true, false); } @Test public void testMapRemoveIfPresentString() { testMapRemoveIfPresent("foo", "bar", "quux"); } @Test public void testMapRemoveIfPresentJsonObject() { testMapRemoveIfPresent(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw"), new JsonObject().put("regerg", "wfwef")); } @Test public void testMapRemoveIfPresentJsonArray() { testMapRemoveIfPresent(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false), new JsonArray().add("qqddq").add(true)); } @Test public void testMapRemoveIfPresentSerializableObject() { testMapRemoveIfPresent(new SomeSerializableObject("foo"), new SomeSerializableObject("bar"), new SomeSerializableObject("quux")); } @Test public void testMapReplaceByte() { testMapReplace((byte)1, (byte)2, (byte)3); } @Test public void testMapReplaceShort() { testMapReplace((short)1, (short)2, (short)3); } @Test public void testMapReplaceInt() { testMapReplace(1, 2, 3); } @Test public void testMapReplaceLong() { testMapReplace(1l, 2l, 3l); } @Test public void testMapReplaceChar() { testMapReplace('X', 'Y', 'Z'); } @Test public void testMapReplaceFloat() { testMapReplace(1.2f, 2.2f, 3.3f); } @Test public void testMapReplaceDouble() { testMapReplace(1.2d, 2.2d, 3.3d); } @Test public void testMapReplaceBoolean() { testMapReplace("foo", true, false); } @Test public void testMapReplaceString() { testMapReplace("foo", "bar", "quux"); } @Test public void testMapReplaceJsonObject() { testMapReplace(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw"), new JsonObject().put("regerg", "wfwef")); } @Test public void testMapReplaceJsonArray() { testMapReplace(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false), new JsonArray().add("qqddq").add(true)); } @Test public void testMapReplaceSerializableObject() { testMapReplace(new SomeSerializableObject("foo"), new SomeSerializableObject("bar"), new SomeSerializableObject("quux")); } @Test public void testMapReplaceIfPresentByte() { testMapReplaceIfPresent((byte)1, (byte)2, (byte)3); } @Test public void testMapReplaceIfPresentShort() { testMapReplaceIfPresent((short)1, (short)2, (short)3); } @Test public void testMapReplaceIfPresentInt() { testMapReplaceIfPresent(1, 2, 3); } @Test public void testMapReplaceIfPresentLong() { testMapReplaceIfPresent(1l, 2l, 3l); } @Test public void testMapReplaceIfPresentChar() { testMapReplaceIfPresent('X', 'Y', 'Z'); } @Test public void testMapReplaceIfPresentFloat() { testMapReplaceIfPresent(1.2f, 2.2f, 3.3f); } @Test public void testMapReplaceIfPresentDouble() { testMapReplaceIfPresent(1.2d, 2.2d, 3.3d); } @Test public void testMapReplaceIfPresentBoolean() { testMapReplaceIfPresent("foo", true, false); } @Test public void testMapReplaceIfPresentString() { testMapReplaceIfPresent("foo", "bar", "quux"); } @Test public void testMapReplaceIfPresentJsonObject() { testMapReplaceIfPresent(new JsonObject().put("foo", "bar"), new JsonObject().put("uihwqduh", "qiwiojw"), new JsonObject().put("regerg", "wfwef")); } @Test public void testMapReplaceIfPresentJsonArray() { testMapReplaceIfPresent(new JsonArray().add("foo").add(2), new JsonArray().add("uihwqduh").add(false), new JsonArray().add("qqddq").add(true)); } @Test public void testMapReplaceIfPresentSerializableObject() { testMapReplaceIfPresent(new SomeSerializableObject("foo"), new SomeSerializableObject("bar"), new SomeSerializableObject("quux")); } @Test public void testGetMapWithNullName() throws Exception { assertNullPointerException(() -> getVertx().sharedData().<String, String>getClusterWideMap(null, ar -> {})); } @Test public void testGetMapWithNullResultHandler() throws Exception { assertNullPointerException(() -> getVertx().sharedData().<String, String>getClusterWideMap("foo", null)); } @Test public void testPutNullKey() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.put(null, "foo", ar2 -> {})); testComplete(); })); await(); } @Test public void testPutNullValue() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.put("foo", null, ar2 -> {})); testComplete(); })); await(); } @Test public void testPutInvalidKey() { getVertx().sharedData().<SomeObject, String>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.put(new SomeObject(), "foo", ar2 -> {})); testComplete(); })); await(); } @Test public void testPutInvalidValue() { getVertx().sharedData().<String, SomeObject>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.put("foo", new SomeObject(), ar2 -> {})); testComplete(); })); await(); } @Test public void testPutIfAbsentInvalidKey() { getVertx().sharedData().<SomeObject, String>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.putIfAbsent(new SomeObject(), "foo", ar2 -> {})); testComplete(); })); await(); } @Test public void testPutIfAbsentInvalidValue() { getVertx().sharedData().<String, SomeObject>getClusterWideMap("foo", onSuccess(map -> { assertIllegalArgumentException(() -> map.putIfAbsent("foo", new SomeObject(), ar2 -> {})); testComplete(); })); await(); } @Test public void testMultipleMaps() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { map.put("foo", "bar", onSuccess(v -> { getVertx().sharedData().<String, String>getClusterWideMap("bar", onSuccess(map2 -> { map2.get("foo", onSuccess(res -> { assertNull(res); testComplete(); })); })); })); })); await(); } @Test public void testClear() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { map.put("foo", "bar", onSuccess(v -> { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map2 -> { map2.clear(onSuccess(v2 -> { map.get("foo", onSuccess(res -> { assertNull(res); testComplete(); })); })); })); })); })); await(); } @Test public void testSize() { getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map -> { map.size(onSuccess(size -> { assertEquals(0, size.intValue()); map.put("foo", "bar", onSuccess(v -> { map.size(onSuccess(size2 -> { assertEquals(1, size2.intValue()); getVertx().sharedData().<String, String>getClusterWideMap("foo", onSuccess(map2 -> { map2.size(onSuccess(size3 -> { assertEquals(1, size3.intValue()); testComplete(); })); })); })); })); })); })); await(); } private <K, V> void testMapPutGet(K k, V v) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.put(k, v, onSuccess(vd -> { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.get(k, onSuccess(res -> { assertEquals(v, res); testComplete(); })); })); })); })); await(); } private <K, V> void testMapPutIfAbsentGet(K k, V v) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.putIfAbsent(k, v, onSuccess(res -> { assertNull(res); getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.get(k, onSuccess(res2 -> { assertEquals(v, res2); map.putIfAbsent(k, v, onSuccess(res3 -> { assertEquals(v, res3); testComplete(); })); })); })); })); })); await(); } private <K, V> void testMapRemove(K k, V v) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.put(k, v, onSuccess(res -> { assertNull(res); getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.remove(k, onSuccess(res2 -> { assertEquals(v, res2); testComplete(); })); })); })); })); await(); } private <K, V> void testMapRemoveIfPresent(K k, V v, V other) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.put(k, v, onSuccess(res -> { assertNull(res); getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.removeIfPresent(k, other, onSuccess(res2 -> { assertFalse(res2); map2.removeIfPresent(k, v, onSuccess(res3 -> { assertTrue(res3); testComplete(); })); })); })); })); })); await(); } private <K, V> void testMapReplace(K k, V v, V other) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.put(k, v, onSuccess(res -> { assertNull(res); getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.replace(k, other, onSuccess(res2 -> { assertEquals(v, res2); map2.get(k, onSuccess(res3 -> { assertEquals(other, res3); map2.remove(k, onSuccess(res4 -> { map2.replace(k, other, onSuccess(res5 -> { assertNull(res5); map2.get(k, onSuccess(res6 -> { assertNull(res6); testComplete(); })); })); })); })); })); })); })); })); await(); } private <K, V> void testMapReplaceIfPresent(K k, V v, V other) { getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map -> { map.put(k, v, onSuccess(res -> { assertNull(res); getVertx().sharedData().<K, V>getClusterWideMap("foo", onSuccess(map2 -> { map2.replaceIfPresent(k, v, other, onSuccess(res2 -> { map2.replaceIfPresent(k, v, other, onSuccess(res3 -> { assertFalse(res3); map2.get(k, onSuccess(res4 -> { assertEquals(other, res4); testComplete(); })); })); })); })); })); })); await(); } public static final class SomeObject { } public static final class SomeSerializableObject implements Serializable { private String str; public SomeSerializableObject(String str) { this.str = str; } public SomeSerializableObject() { } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SomeSerializableObject)) return false; SomeSerializableObject that = (SomeSerializableObject) o; if (str != null ? !str.equals(that.str) : that.str != null) return false; return true; } @Override public int hashCode() { return str != null ? str.hashCode() : 0; } } }