PageRenderTime 55ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/core/petra/petra-concurrent/src/test/java/com/liferay/petra/concurrent/ConcurrentMapperHashMapTest.java

http://github.com/liferay/liferay-portal
Java | 1220 lines | 824 code | 380 blank | 16 comment | 14 complexity | f22b64fe6e00bb6e7574b7cfbdc3068c MD5 | raw file
Possible License(s): LGPL-2.0
  1. /**
  2. * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
  3. *
  4. * This library is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU Lesser General Public License as published by the Free
  6. * Software Foundation; either version 2.1 of the License, or (at your option)
  7. * any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  12. * details.
  13. */
  14. package com.liferay.petra.concurrent;
  15. import com.liferay.portal.kernel.test.ReflectionTestUtil;
  16. import com.liferay.portal.kernel.test.rule.AggregateTestRule;
  17. import com.liferay.portal.kernel.test.rule.CodeCoverageAssertor;
  18. import com.liferay.portal.test.rule.LiferayUnitTestRule;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.ByteArrayOutputStream;
  21. import java.io.ObjectInputStream;
  22. import java.io.ObjectOutputStream;
  23. import java.io.Serializable;
  24. import java.util.AbstractMap;
  25. import java.util.Collection;
  26. import java.util.Collections;
  27. import java.util.HashMap;
  28. import java.util.Iterator;
  29. import java.util.LinkedList;
  30. import java.util.Map;
  31. import java.util.Queue;
  32. import java.util.Set;
  33. import java.util.concurrent.ConcurrentHashMap;
  34. import java.util.concurrent.ConcurrentMap;
  35. import org.junit.After;
  36. import org.junit.Assert;
  37. import org.junit.ClassRule;
  38. import org.junit.Rule;
  39. import org.junit.Test;
  40. /**
  41. * @author Shuyang Zhou
  42. */
  43. public class ConcurrentMapperHashMapTest {
  44. @ClassRule
  45. @Rule
  46. public static final AggregateTestRule aggregateTestRule =
  47. new AggregateTestRule(
  48. CodeCoverageAssertor.INSTANCE, LiferayUnitTestRule.INSTANCE);
  49. @After
  50. public void tearDown() {
  51. _eventQueue.clear();
  52. }
  53. @Test
  54. public void testClear() {
  55. Assert.assertTrue(_concurrentMap.isEmpty());
  56. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  57. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  58. Assert.assertFalse(_concurrentMap.isEmpty());
  59. _concurrentMap.clear();
  60. Assert.assertTrue(_concurrentMap.isEmpty());
  61. }
  62. @Test
  63. public void testCompute() {
  64. try {
  65. _concurrentMap.compute(null, null);
  66. Assert.fail("Should throw NullPointerException");
  67. }
  68. catch (NullPointerException nullPointerException) {
  69. Assert.assertEquals(
  70. "Key is null", nullPointerException.getMessage());
  71. }
  72. try {
  73. _concurrentMap.compute(_testKey, null);
  74. Assert.fail("Should throw NullPointerException");
  75. }
  76. catch (NullPointerException nullPointerException) {
  77. Assert.assertEquals(
  78. "Remapping function is null",
  79. nullPointerException.getMessage());
  80. }
  81. Assert.assertNull(
  82. _concurrentMap.compute(_testKey, (key, value) -> null));
  83. _assertEventQueue(Event.MAP_KEY, Event.UNMAP_KEY);
  84. Assert.assertSame(
  85. _testValue1,
  86. _concurrentMap.compute(_testKey, (key, value) -> _testValue1));
  87. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  88. Assert.assertSame(
  89. _testValue2,
  90. _concurrentMap.compute(_testKey, (key, value) -> _testValue2));
  91. _assertEventQueue(
  92. Event.MAP_KEY, Event.UNMAP_VALUE, Event.MAP_VALUE, Event.UNMAP_KEY);
  93. Assert.assertSame(_testValue2, _concurrentMap.get(_testKey));
  94. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  95. }
  96. @Test
  97. public void testComputeIfAbsent() {
  98. try {
  99. _concurrentMap.computeIfAbsent(null, null);
  100. Assert.fail("Should throw NullPointerException");
  101. }
  102. catch (NullPointerException nullPointerException) {
  103. Assert.assertEquals(
  104. "Key is null", nullPointerException.getMessage());
  105. }
  106. try {
  107. _concurrentMap.computeIfAbsent(_testKey, null);
  108. Assert.fail("Should throw NullPointerException");
  109. }
  110. catch (NullPointerException nullPointerException) {
  111. Assert.assertEquals(
  112. "Mapping function is null", nullPointerException.getMessage());
  113. }
  114. Assert.assertNull(
  115. _concurrentMap.computeIfAbsent(_testKey, key -> null));
  116. _assertEventQueue(Event.MAP_KEY, Event.UNMAP_KEY);
  117. Assert.assertSame(
  118. _testValue1,
  119. _concurrentMap.computeIfAbsent(_testKey, key -> _testValue1));
  120. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  121. Assert.assertSame(
  122. _testValue1,
  123. _concurrentMap.computeIfAbsent(_testKey, key -> _testValue2));
  124. _assertEventQueue(
  125. Event.MAP_KEY, Event.UNMAP_KEY, Event.UNMAP_VALUE_FOR_QUERY);
  126. Assert.assertSame(_testValue1, _concurrentMap.get(_testKey));
  127. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  128. ConcurrentMap<KeyReference, ValueReference> innerConcurrentMap =
  129. ReflectionTestUtil.getFieldValue(
  130. _concurrentMap, "innerConcurrentMap");
  131. Assert.assertEquals(
  132. innerConcurrentMap.toString(), 1, innerConcurrentMap.size());
  133. Collection<ValueReference> valueReferences =
  134. innerConcurrentMap.values();
  135. Iterator<ValueReference> iterator = valueReferences.iterator();
  136. ValueReference valueReference = iterator.next();
  137. ReflectionTestUtil.setFieldValue(valueReference, "_value", null);
  138. Assert.assertSame(
  139. _testValue2,
  140. _concurrentMap.computeIfAbsent(_testKey, key -> _testValue2));
  141. _assertEventQueue(
  142. Event.MAP_KEY, Event.UNMAP_KEY, Event.UNMAP_VALUE_FOR_QUERY,
  143. Event.MAP_KEY, Event.MAP_VALUE);
  144. }
  145. @Test
  146. public void testComputeIfPresent() {
  147. try {
  148. _concurrentMap.computeIfPresent(null, null);
  149. Assert.fail("Should throw NullPointerException");
  150. }
  151. catch (NullPointerException nullPointerException) {
  152. Assert.assertEquals(
  153. "Key is null", nullPointerException.getMessage());
  154. }
  155. try {
  156. _concurrentMap.computeIfPresent(_testKey, null);
  157. Assert.fail("Should throw NullPointerException");
  158. }
  159. catch (NullPointerException nullPointerException) {
  160. Assert.assertEquals(
  161. "Remapping function is null",
  162. nullPointerException.getMessage());
  163. }
  164. Assert.assertNull(
  165. _concurrentMap.computeIfPresent(_testKey, (key, value) -> null));
  166. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  167. Assert.assertNull(
  168. _concurrentMap.computeIfPresent(
  169. _testKey, (key, value) -> _testValue1));
  170. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  171. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  172. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  173. Assert.assertSame(
  174. _testValue2,
  175. _concurrentMap.computeIfPresent(
  176. _testKey, (key, value) -> _testValue2));
  177. _assertEventQueue(
  178. Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE, Event.MAP_VALUE);
  179. Assert.assertNull(
  180. _concurrentMap.computeIfPresent(_testKey, (key, value) -> null));
  181. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE);
  182. Assert.assertNull(_concurrentMap.get(_testKey));
  183. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  184. }
  185. @Test
  186. public void testContainsKey() {
  187. try {
  188. _concurrentMap.containsKey(null);
  189. Assert.fail();
  190. }
  191. catch (NullPointerException nullPointerException) {
  192. Assert.assertEquals(
  193. "Key is null", nullPointerException.getMessage());
  194. }
  195. Assert.assertFalse(_concurrentMap.containsKey(_testKey));
  196. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  197. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  198. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  199. Assert.assertTrue(_concurrentMap.containsKey(_testKey));
  200. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  201. }
  202. @Test
  203. public void testContainsValue() {
  204. try {
  205. _concurrentMap.containsValue(null);
  206. Assert.fail();
  207. }
  208. catch (NullPointerException nullPointerException) {
  209. Assert.assertEquals(
  210. "Value is null", nullPointerException.getMessage());
  211. }
  212. Assert.assertFalse(_concurrentMap.containsValue(_testValue1));
  213. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  214. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  215. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  216. Assert.assertTrue(_concurrentMap.containsValue(_testValue1));
  217. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  218. }
  219. @Test
  220. public void testEntrySet() {
  221. Set<Map.Entry<Key, Value>> entrySet = _concurrentMap.entrySet();
  222. Assert.assertSame(entrySet, _concurrentMap.entrySet());
  223. Assert.assertTrue(entrySet.toString(), entrySet.isEmpty());
  224. Assert.assertFalse(
  225. entrySet.toString(), entrySet.contains(new Object()));
  226. Assert.assertFalse(entrySet.remove(new Object()));
  227. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  228. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  229. Assert.assertEquals(entrySet.toString(), 1, entrySet.size());
  230. Assert.assertTrue(
  231. entrySet.toString(),
  232. entrySet.contains(
  233. new AbstractMap.SimpleEntry<Key, Value>(
  234. _testKey, _testValue1)));
  235. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  236. Assert.assertFalse(
  237. entrySet.toString(),
  238. entrySet.contains(
  239. new AbstractMap.SimpleEntry<Key, Value>(
  240. _testKey, new Value(""))));
  241. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  242. Assert.assertFalse(
  243. entrySet.remove(
  244. new AbstractMap.SimpleEntry<Key, Value>(
  245. _testKey, new Value(""))));
  246. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY);
  247. Assert.assertTrue(
  248. entrySet.remove(
  249. new AbstractMap.SimpleEntry<Key, Value>(
  250. _testKey, _testValue1)));
  251. _assertEventQueue(
  252. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY,
  253. Event.UNMAP_VALUE);
  254. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  255. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  256. Iterator<Map.Entry<Key, Value>> iterator = entrySet.iterator();
  257. Assert.assertTrue(iterator.hasNext());
  258. Map.Entry<Key, Value> entry = iterator.next();
  259. Assert.assertEquals(entry, entry);
  260. Assert.assertNotEquals(entry, new Object());
  261. Assert.assertNotEquals(
  262. entry,
  263. new AbstractMap.SimpleEntry<Key, Value>(
  264. new Key("someKey"), _testValue1));
  265. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  266. Assert.assertNotEquals(
  267. entry,
  268. new AbstractMap.SimpleEntry<Key, Value>(_testKey, new Value("")));
  269. _assertEventQueue(
  270. Event.UNMAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  271. Assert.assertEquals(
  272. entry,
  273. new AbstractMap.SimpleEntry<Key, Value>(_testKey, _testValue1));
  274. _assertEventQueue(
  275. Event.UNMAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  276. Assert.assertEquals(
  277. _testKey.hashCode() ^ _testValue1.hashCode(), entry.hashCode());
  278. Assert.assertFalse(iterator.hasNext());
  279. Assert.assertSame(_testKey, entry.getKey());
  280. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  281. Assert.assertSame(_testValue1, entry.getValue());
  282. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  283. Assert.assertTrue(entrySet.toString(), entrySet.contains(entry));
  284. _assertEventQueue(
  285. Event.UNMAP_KEY_FOR_QUERY, Event.MAP_KEY_FOR_QUERY,
  286. Event.UNMAP_VALUE_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  287. entry.setValue(_testValue2);
  288. _assertEventQueue(
  289. Event.UNMAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY,
  290. Event.UNMAP_VALUE_FOR_QUERY, Event.MAP_KEY, Event.MAP_VALUE,
  291. Event.UNMAP_KEY, Event.UNMAP_VALUE);
  292. Assert.assertSame(_testValue2, _concurrentMap.get(_testKey));
  293. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  294. iterator.remove();
  295. Assert.assertTrue(entrySet.toString(), entrySet.isEmpty());
  296. Assert.assertFalse(entrySet.toString(), entrySet.contains(entry));
  297. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY, Event.MAP_KEY_FOR_QUERY);
  298. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  299. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  300. Assert.assertEquals(entrySet.toString(), 1, entrySet.size());
  301. entrySet.clear();
  302. Assert.assertTrue(entrySet.toString(), entrySet.isEmpty());
  303. }
  304. @Test
  305. public void testGet() {
  306. try {
  307. _concurrentMap.get(null);
  308. Assert.fail();
  309. }
  310. catch (NullPointerException nullPointerException) {
  311. Assert.assertEquals(
  312. "Key is null", nullPointerException.getMessage());
  313. }
  314. Assert.assertNull(_concurrentMap.get(_testKey));
  315. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  316. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  317. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  318. Assert.assertSame(_testValue1, _concurrentMap.get(_testKey));
  319. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  320. }
  321. @Test
  322. public void testKeySet() {
  323. Set<Key> keySet = _concurrentMap.keySet();
  324. Assert.assertSame(keySet, _concurrentMap.keySet());
  325. Assert.assertTrue(keySet.toString(), keySet.isEmpty());
  326. Assert.assertFalse(keySet.toString(), keySet.contains(_testKey));
  327. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  328. Assert.assertFalse(keySet.remove(_testKey));
  329. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  330. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  331. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  332. String keySetString = keySet.toString();
  333. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  334. Assert.assertEquals(keySetString, 1, keySet.size());
  335. Assert.assertTrue(keySetString, keySet.contains(_testKey));
  336. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  337. Assert.assertTrue(keySet.remove(_testKey));
  338. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE);
  339. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  340. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  341. keySetString = keySet.toString();
  342. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  343. Assert.assertEquals(keySetString, 1, keySet.size());
  344. Assert.assertEquals(Collections.singleton(_testKey), keySet);
  345. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  346. Iterator<Key> iterator = keySet.iterator();
  347. Assert.assertTrue(iterator.hasNext());
  348. Key key = iterator.next();
  349. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  350. keySetString = keySet.toString();
  351. _assertEventQueue(Event.UNMAP_KEY_FOR_QUERY);
  352. Assert.assertEquals(_testKey, key);
  353. Assert.assertFalse(iterator.hasNext());
  354. Assert.assertTrue(keySetString, keySet.contains(key));
  355. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  356. iterator.remove();
  357. Assert.assertTrue(keySet.toString(), keySet.isEmpty());
  358. Assert.assertFalse(keySet.toString(), keySet.contains(key));
  359. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  360. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  361. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  362. Assert.assertEquals(keySet.toString(), 1, keySet.size());
  363. keySet.clear();
  364. Assert.assertTrue(_concurrentMap.isEmpty());
  365. }
  366. @Test
  367. public void testPut() {
  368. try {
  369. _concurrentMap.put(null, null);
  370. Assert.fail();
  371. }
  372. catch (NullPointerException nullPointerException) {
  373. Assert.assertEquals(
  374. "Key is null", nullPointerException.getMessage());
  375. }
  376. try {
  377. _concurrentMap.put(_testKey, null);
  378. Assert.fail();
  379. }
  380. catch (NullPointerException nullPointerException) {
  381. Assert.assertEquals(
  382. "Value is null", nullPointerException.getMessage());
  383. }
  384. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  385. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  386. Assert.assertSame(
  387. _testValue1, _concurrentMap.put(_testKey, _testValue1));
  388. _assertEventQueue(
  389. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE);
  390. Assert.assertSame(
  391. _testValue1, _concurrentMap.put(_testKey, _testValue2));
  392. _assertEventQueue(
  393. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE);
  394. Assert.assertSame(
  395. _testValue2, _concurrentMap.put(_testKey, _testValue2));
  396. _assertEventQueue(
  397. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE);
  398. Assert.assertSame(_testValue2, _concurrentMap.get(_testKey));
  399. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  400. }
  401. @Test
  402. public void testPutAll() {
  403. Map<Key, Value> map = createDataMap();
  404. _concurrentMap.putAll(map);
  405. Assert.assertEquals(map, _concurrentMap);
  406. }
  407. @Test
  408. public void testPutIfAbsent() {
  409. try {
  410. _concurrentMap.putIfAbsent(null, null);
  411. Assert.fail();
  412. }
  413. catch (NullPointerException nullPointerException) {
  414. Assert.assertEquals(
  415. "Key is null", nullPointerException.getMessage());
  416. }
  417. try {
  418. _concurrentMap.putIfAbsent(_testKey, null);
  419. Assert.fail();
  420. }
  421. catch (NullPointerException nullPointerException) {
  422. Assert.assertEquals(
  423. "Value is null", nullPointerException.getMessage());
  424. }
  425. Assert.assertNull(_concurrentMap.putIfAbsent(_testKey, _testValue1));
  426. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  427. Assert.assertSame(
  428. _testValue1, _concurrentMap.putIfAbsent(_testKey, _testValue1));
  429. _assertEventQueue(
  430. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE,
  431. Event.UNMAP_VALUE_FOR_QUERY);
  432. Assert.assertSame(
  433. _testValue1, _concurrentMap.putIfAbsent(_testKey, _testValue2));
  434. _assertEventQueue(
  435. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE,
  436. Event.UNMAP_VALUE_FOR_QUERY);
  437. Assert.assertSame(
  438. _testValue1, _concurrentMap.putIfAbsent(_testKey, _testValue2));
  439. _assertEventQueue(
  440. Event.MAP_KEY, Event.MAP_VALUE, Event.UNMAP_KEY, Event.UNMAP_VALUE,
  441. Event.UNMAP_VALUE_FOR_QUERY);
  442. Assert.assertSame(_testValue1, _concurrentMap.get(_testKey));
  443. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  444. }
  445. @Test
  446. public void testRemove() {
  447. try {
  448. _concurrentMap.remove(null);
  449. Assert.fail();
  450. }
  451. catch (NullPointerException nullPointerException) {
  452. Assert.assertEquals(
  453. "Key is null", nullPointerException.getMessage());
  454. }
  455. Assert.assertNull(_concurrentMap.remove(_testKey));
  456. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  457. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  458. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  459. Assert.assertSame(_testValue1, _concurrentMap.remove(_testKey));
  460. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE);
  461. Assert.assertNull(_concurrentMap.remove(_testKey));
  462. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  463. Assert.assertNull(_concurrentMap.get(_testKey));
  464. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  465. }
  466. @Test
  467. public void testRemoveWithValue() {
  468. try {
  469. _concurrentMap.remove(null, null);
  470. Assert.fail();
  471. }
  472. catch (NullPointerException nullPointerException) {
  473. Assert.assertEquals(
  474. "Key is null", nullPointerException.getMessage());
  475. }
  476. try {
  477. _concurrentMap.remove(_testKey, null);
  478. Assert.fail();
  479. }
  480. catch (NullPointerException nullPointerException) {
  481. Assert.assertEquals(
  482. "Value is null", nullPointerException.getMessage());
  483. }
  484. Assert.assertFalse(_concurrentMap.remove(_testKey, _testValue1));
  485. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY);
  486. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  487. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  488. Assert.assertFalse(_concurrentMap.remove(_testKey, new Value("")));
  489. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY);
  490. Assert.assertTrue(_concurrentMap.remove(_testKey, _testValue1));
  491. _assertEventQueue(
  492. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY,
  493. Event.UNMAP_VALUE);
  494. Assert.assertFalse(_concurrentMap.remove(_testKey, _testValue1));
  495. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY);
  496. Assert.assertNull(_concurrentMap.get(_testKey));
  497. _assertEventQueue(Event.MAP_KEY_FOR_QUERY);
  498. }
  499. @Test
  500. public void testRemoveWithValueConcurrentModification() {
  501. ConcurrentMap<Key, Value> concurrentMap =
  502. new ConcurrentTypeReferenceHashMap(
  503. new ConcurrentHashMap<KeyReference, ValueReference>() {
  504. @Override
  505. public ValueReference get(Object key) {
  506. KeyReference keyReference = (KeyReference)key;
  507. ValueReference valueReference = super.get(keyReference);
  508. if (_testKey.equals(keyReference._key)) {
  509. put(
  510. new KeyReference(_testKey),
  511. new ValueReference(_testValue2));
  512. }
  513. return valueReference;
  514. }
  515. });
  516. Assert.assertNull(concurrentMap.put(_testKey, _testValue1));
  517. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  518. Assert.assertFalse(concurrentMap.remove(_testKey, _testValue1));
  519. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE_FOR_QUERY);
  520. }
  521. @Test
  522. public void testReplace() {
  523. try {
  524. _concurrentMap.replace(null, null);
  525. Assert.fail();
  526. }
  527. catch (NullPointerException nullPointerException) {
  528. Assert.assertEquals(
  529. "Key is null", nullPointerException.getMessage());
  530. }
  531. try {
  532. _concurrentMap.replace(_testKey, null);
  533. Assert.fail();
  534. }
  535. catch (NullPointerException nullPointerException) {
  536. Assert.assertEquals(
  537. "Value is null", nullPointerException.getMessage());
  538. }
  539. Assert.assertNull(_concurrentMap.replace(_testKey, _testValue1));
  540. _assertEventQueue(
  541. Event.MAP_VALUE, Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE);
  542. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  543. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  544. Assert.assertSame(
  545. _testValue1, _concurrentMap.replace(_testKey, _testValue2));
  546. _assertEventQueue(
  547. Event.MAP_VALUE, Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE);
  548. Assert.assertSame(_testValue2, _concurrentMap.get(_testKey));
  549. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  550. }
  551. @Test
  552. public void testReplaceWithValue() {
  553. try {
  554. _concurrentMap.replace(null, null, null);
  555. Assert.fail();
  556. }
  557. catch (NullPointerException nullPointerException) {
  558. Assert.assertEquals(
  559. "Key is null", nullPointerException.getMessage());
  560. }
  561. try {
  562. _concurrentMap.replace(_testKey, null, null);
  563. Assert.fail();
  564. }
  565. catch (NullPointerException nullPointerException) {
  566. Assert.assertEquals(
  567. "Old value is null", nullPointerException.getMessage());
  568. }
  569. try {
  570. _concurrentMap.replace(_testKey, _testValue1, null);
  571. Assert.fail();
  572. }
  573. catch (NullPointerException nullPointerException) {
  574. Assert.assertEquals(
  575. "New value is null", nullPointerException.getMessage());
  576. }
  577. Assert.assertFalse(
  578. _concurrentMap.replace(_testKey, _testValue1, _testValue2));
  579. _assertEventQueue(
  580. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE, Event.UNMAP_VALUE);
  581. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  582. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  583. Assert.assertTrue(
  584. _concurrentMap.replace(_testKey, _testValue1, _testValue2));
  585. _assertEventQueue(
  586. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE,
  587. Event.UNMAP_VALUE_FOR_QUERY, Event.UNMAP_VALUE);
  588. Assert.assertSame(_testValue2, _concurrentMap.get(_testKey));
  589. _assertEventQueue(Event.MAP_KEY_FOR_QUERY, Event.UNMAP_VALUE_FOR_QUERY);
  590. Assert.assertFalse(
  591. _concurrentMap.replace(_testKey, _testValue1, _testValue2));
  592. _assertEventQueue(
  593. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE,
  594. Event.UNMAP_VALUE_FOR_QUERY, Event.UNMAP_VALUE);
  595. }
  596. @Test
  597. public void testReplaceWithValueConcurrentModification() {
  598. ConcurrentMap<Key, Value> concurrentMap =
  599. new ConcurrentTypeReferenceHashMap(
  600. new ConcurrentHashMap<KeyReference, ValueReference>() {
  601. @Override
  602. public ValueReference get(Object key) {
  603. KeyReference keyReference = (KeyReference)key;
  604. ValueReference valueReference = super.get(keyReference);
  605. if (_testKey.equals(keyReference._key)) {
  606. put(
  607. new KeyReference(_testKey),
  608. new ValueReference(_testValue2));
  609. }
  610. return valueReference;
  611. }
  612. });
  613. Assert.assertNull(concurrentMap.put(_testKey, _testValue1));
  614. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  615. Assert.assertFalse(
  616. concurrentMap.replace(_testKey, _testValue1, _testValue2));
  617. _assertEventQueue(
  618. Event.MAP_KEY_FOR_QUERY, Event.MAP_VALUE,
  619. Event.UNMAP_VALUE_FOR_QUERY, Event.UNMAP_VALUE);
  620. }
  621. @Test
  622. public void testSerialization() throws Exception {
  623. Map<Key, Value> map = createDataMap();
  624. _concurrentMap.putAll(map);
  625. ByteArrayOutputStream byteArrayOutputStream =
  626. new ByteArrayOutputStream();
  627. try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(
  628. byteArrayOutputStream)) {
  629. objectOutputStream.writeObject(_concurrentMap);
  630. }
  631. ObjectInputStream objectInputStream = new ObjectInputStream(
  632. new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
  633. Assert.assertEquals(_concurrentMap, objectInputStream.readObject());
  634. }
  635. @Test
  636. public void testValues() {
  637. Collection<Value> values = _concurrentMap.values();
  638. Assert.assertSame(values, _concurrentMap.values());
  639. Assert.assertTrue(values.toString(), values.isEmpty());
  640. Assert.assertFalse(values.toString(), values.contains(new Value("")));
  641. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  642. Assert.assertFalse(values.remove(new Value("")));
  643. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  644. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  645. String valuesString = values.toString();
  646. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  647. Assert.assertEquals(valuesString, 1, values.size());
  648. Assert.assertTrue(valuesString, values.contains(_testValue1));
  649. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  650. Assert.assertFalse(valuesString, values.contains(_testValue2));
  651. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  652. Assert.assertFalse(values.remove(_testValue2));
  653. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  654. Assert.assertTrue(values.remove(_testValue1));
  655. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  656. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  657. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  658. Iterator<Value> iterator = values.iterator();
  659. Assert.assertTrue(iterator.hasNext());
  660. Value value = iterator.next();
  661. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  662. valuesString = values.toString();
  663. _assertEventQueue(Event.UNMAP_VALUE_FOR_QUERY);
  664. Assert.assertSame(_testValue1, value);
  665. Assert.assertFalse(iterator.hasNext());
  666. Assert.assertTrue(valuesString, values.contains(value));
  667. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  668. iterator.remove();
  669. Assert.assertTrue(values.toString(), values.isEmpty());
  670. Assert.assertFalse(values.toString(), values.contains(value));
  671. _assertEventQueue(Event.MAP_VALUE_FOR_QUERY);
  672. Assert.assertNull(_concurrentMap.put(_testKey, _testValue1));
  673. _assertEventQueue(Event.MAP_KEY, Event.MAP_VALUE);
  674. Assert.assertEquals(values.toString(), 1, values.size());
  675. values.clear();
  676. Assert.assertTrue(_concurrentMap.isEmpty());
  677. }
  678. public static class Key implements Serializable {
  679. public Key(String id) {
  680. if (id == null) {
  681. throw new NullPointerException("Id is null");
  682. }
  683. _id = id;
  684. }
  685. @Override
  686. public boolean equals(Object object) {
  687. if (!(object instanceof Key)) {
  688. return false;
  689. }
  690. Key key = (Key)object;
  691. return _id.equals(key._id);
  692. }
  693. @Override
  694. public int hashCode() {
  695. return _id.hashCode();
  696. }
  697. private static final long serialVersionUID = 1L;
  698. private final String _id;
  699. }
  700. public static class KeyReference implements Serializable {
  701. public KeyReference(Key key) {
  702. if (key == null) {
  703. throw new NullPointerException("Type is null");
  704. }
  705. _key = key;
  706. }
  707. @Override
  708. public boolean equals(Object object) {
  709. if (!(object instanceof KeyReference)) {
  710. return false;
  711. }
  712. KeyReference keyReference = (KeyReference)object;
  713. return _key.equals(keyReference._key);
  714. }
  715. @Override
  716. public int hashCode() {
  717. return _key.hashCode();
  718. }
  719. private static final long serialVersionUID = 1L;
  720. private final Key _key;
  721. }
  722. public static class Value implements Serializable {
  723. public Value(String valueId) {
  724. if (valueId == null) {
  725. throw new NullPointerException("Value id is null");
  726. }
  727. _valueId = valueId;
  728. }
  729. @Override
  730. public boolean equals(Object object) {
  731. if (!(object instanceof Value)) {
  732. return false;
  733. }
  734. Value value = (Value)object;
  735. return _valueId.equals(value._valueId);
  736. }
  737. @Override
  738. public int hashCode() {
  739. return _valueId.hashCode();
  740. }
  741. private static final long serialVersionUID = 1L;
  742. private final String _valueId;
  743. }
  744. public static class ValueReference implements Serializable {
  745. public ValueReference(Value value) {
  746. if (value == null) {
  747. throw new NullPointerException("Value is null");
  748. }
  749. _value = value;
  750. }
  751. @Override
  752. public boolean equals(Object object) {
  753. if (!(object instanceof ValueReference)) {
  754. return false;
  755. }
  756. ValueReference valueReference = (ValueReference)object;
  757. return _value.equals(valueReference._value);
  758. }
  759. @Override
  760. public int hashCode() {
  761. return _value.hashCode();
  762. }
  763. private static final long serialVersionUID = 1L;
  764. private final Value _value;
  765. }
  766. protected Map<Key, Value> createDataMap() {
  767. Map<Key, Value> map = new HashMap<>();
  768. map.put(new Key("testKey1"), _testValue1);
  769. map.put(new Key("testKey2"), _testValue2);
  770. map.put(new Key("testKey3"), new Value("testValue3"));
  771. return map;
  772. }
  773. private void _assertEventQueue(Event... expectedEvents) {
  774. Assert.assertArrayEquals(
  775. _eventQueue.toString(), expectedEvents,
  776. _eventQueue.toArray(new Event[0]));
  777. _eventQueue.clear();
  778. }
  779. private static final Queue<Event> _eventQueue = new LinkedList<>();
  780. private final ConcurrentMap<Key, Value> _concurrentMap =
  781. new ConcurrentTypeReferenceHashMap();
  782. private final Key _testKey = new Key("testKey");
  783. private final Value _testValue1 = new Value("testValue1");
  784. private final Value _testValue2 = new Value("testValue2");
  785. private static class ConcurrentTypeReferenceHashMap
  786. extends ConcurrentMapperHashMap
  787. <Key, KeyReference, Value, ValueReference> {
  788. public ConcurrentTypeReferenceHashMap() {
  789. super(new ConcurrentHashMap<KeyReference, ValueReference>());
  790. }
  791. public ConcurrentTypeReferenceHashMap(
  792. ConcurrentMap<KeyReference, ValueReference> innerConcurrentMap) {
  793. super(innerConcurrentMap);
  794. }
  795. @Override
  796. public KeyReference mapKey(Key key) {
  797. _eventQueue.offer(Event.MAP_KEY);
  798. return new KeyReference(key);
  799. }
  800. @Override
  801. public KeyReference mapKeyForQuery(Key key) {
  802. _eventQueue.offer(Event.MAP_KEY_FOR_QUERY);
  803. return new KeyReference(key);
  804. }
  805. @Override
  806. public ValueReference mapValue(Key key, Value value) {
  807. _eventQueue.offer(Event.MAP_VALUE);
  808. return new ValueReference(value);
  809. }
  810. @Override
  811. public ValueReference mapValueForQuery(Value value) {
  812. _eventQueue.offer(Event.MAP_VALUE_FOR_QUERY);
  813. return new ValueReference(value);
  814. }
  815. @Override
  816. public Key unmapKey(KeyReference keyReference) {
  817. _eventQueue.offer(Event.UNMAP_KEY);
  818. return keyReference._key;
  819. }
  820. @Override
  821. public Key unmapKeyForQuery(KeyReference keyReference) {
  822. _eventQueue.offer(Event.UNMAP_KEY_FOR_QUERY);
  823. return keyReference._key;
  824. }
  825. @Override
  826. public Value unmapValue(ValueReference valueReference) {
  827. _eventQueue.offer(Event.UNMAP_VALUE);
  828. return valueReference._value;
  829. }
  830. @Override
  831. public Value unmapValueForQuery(ValueReference valueReference) {
  832. _eventQueue.offer(Event.UNMAP_VALUE_FOR_QUERY);
  833. return valueReference._value;
  834. }
  835. }
  836. private enum Event {
  837. MAP_KEY, MAP_KEY_FOR_QUERY, MAP_VALUE, MAP_VALUE_FOR_QUERY, UNMAP_KEY,
  838. UNMAP_KEY_FOR_QUERY, UNMAP_VALUE, UNMAP_VALUE_FOR_QUERY
  839. }
  840. }