PageRenderTime 84ms CodeModel.GetById 41ms RepoModel.GetById 4ms app.codeStats 0ms

/modules/core/petra/petra-io/src/test/java/com/liferay/petra/io/SerializerTest.java

http://github.com/liferay/liferay-portal
Java | 1159 lines | 782 code | 351 blank | 26 comment | 28 complexity | 1843af0f1a9fa7c88ae074599f6eec12 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.io;
  15. import com.liferay.petra.io.constants.SerializationConstants;
  16. import com.liferay.petra.io.unsync.UnsyncByteArrayInputStream;
  17. import com.liferay.petra.io.unsync.UnsyncByteArrayOutputStream;
  18. import com.liferay.petra.lang.ClassLoaderPool;
  19. import com.liferay.petra.string.StringPool;
  20. import com.liferay.portal.kernel.test.ReflectionTestUtil;
  21. import com.liferay.portal.kernel.test.rule.AggregateTestRule;
  22. import com.liferay.portal.kernel.test.rule.CodeCoverageAssertor;
  23. import com.liferay.portal.kernel.test.rule.NewEnv;
  24. import com.liferay.portal.test.rule.LiferayUnitTestRule;
  25. import java.io.IOException;
  26. import java.io.ObjectInputStream;
  27. import java.io.ObjectOutputStream;
  28. import java.io.Serializable;
  29. import java.io.UnsupportedEncodingException;
  30. import java.lang.reflect.Constructor;
  31. import java.lang.reflect.Field;
  32. import java.lang.reflect.InvocationTargetException;
  33. import java.lang.reflect.Method;
  34. import java.nio.ByteBuffer;
  35. import java.nio.ByteOrder;
  36. import java.nio.CharBuffer;
  37. import java.nio.DoubleBuffer;
  38. import java.nio.FloatBuffer;
  39. import java.nio.IntBuffer;
  40. import java.nio.LongBuffer;
  41. import java.nio.ShortBuffer;
  42. import java.util.Arrays;
  43. import java.util.Date;
  44. import java.util.List;
  45. import java.util.Random;
  46. import org.junit.Assert;
  47. import org.junit.Before;
  48. import org.junit.ClassRule;
  49. import org.junit.Rule;
  50. import org.junit.Test;
  51. /**
  52. * @author Shuyang Zhou
  53. */
  54. public class SerializerTest {
  55. @ClassRule
  56. @Rule
  57. public static final AggregateTestRule aggregateTestRule =
  58. new AggregateTestRule(
  59. new CodeCoverageAssertor() {
  60. @Override
  61. public void appendAssertClasses(List<Class<?>> assertClasses) {
  62. assertClasses.add(AnnotatedObjectInputStream.class);
  63. assertClasses.add(AnnotatedObjectOutputStream.class);
  64. assertClasses.add(SerializationConstants.class);
  65. }
  66. },
  67. LiferayUnitTestRule.INSTANCE);
  68. @Before
  69. public void setUp() {
  70. System.clearProperty(
  71. Serializer.class.getName() + ".thread.local.buffer.count.limit");
  72. System.clearProperty(
  73. Serializer.class.getName() + ".thread.local.buffer.size.limit");
  74. }
  75. @Test
  76. public void testBufferOutputStream() throws Exception {
  77. byte[] data = new byte[1024];
  78. _random.nextBytes(data);
  79. Serializer serializer = new Serializer();
  80. BufferOutputStream bufferOutputStream = new BufferOutputStream(
  81. serializer);
  82. for (byte b : data) {
  83. bufferOutputStream.write(b);
  84. }
  85. ByteBuffer byteBuffer = serializer.toByteBuffer();
  86. Assert.assertArrayEquals(data, byteBuffer.array());
  87. serializer = new Serializer();
  88. bufferOutputStream = new BufferOutputStream(serializer);
  89. bufferOutputStream.write(data);
  90. byteBuffer = serializer.toByteBuffer();
  91. Assert.assertArrayEquals(data, byteBuffer.array());
  92. }
  93. @Test
  94. public void testBufferQueue() throws Exception {
  95. BufferQueue bufferQueue = new BufferQueue();
  96. // Insert into empty queue
  97. byte[] buffer2 = new byte[2];
  98. bufferQueue.enqueue(buffer2);
  99. BufferNode bufferNode1 = bufferQueue.getHeadBufferNode();
  100. Assert.assertSame(buffer2, bufferNode1.getBuffer());
  101. Assert.assertNull(bufferNode1.getNext());
  102. // Insert to head
  103. byte[] buffer4 = new byte[4];
  104. bufferQueue.enqueue(buffer4);
  105. bufferNode1 = bufferQueue.getHeadBufferNode();
  106. BufferNode bufferNode2 = bufferNode1.getNext();
  107. Assert.assertSame(buffer4, bufferNode1.getBuffer());
  108. Assert.assertNotNull(bufferNode1.getNext());
  109. Assert.assertSame(buffer2, bufferNode2.getBuffer());
  110. Assert.assertNull(bufferNode2.getNext());
  111. // Insert to second
  112. byte[] buffer3 = new byte[3];
  113. bufferQueue.enqueue(buffer3);
  114. bufferNode1 = bufferQueue.getHeadBufferNode();
  115. bufferNode2 = bufferNode1.getNext();
  116. BufferNode bufferNode3 = bufferNode2.getNext();
  117. Assert.assertSame(buffer4, bufferNode1.getBuffer());
  118. Assert.assertNotNull(bufferNode1.getNext());
  119. Assert.assertSame(buffer3, bufferNode2.getBuffer());
  120. Assert.assertNotNull(bufferNode2.getNext());
  121. Assert.assertSame(buffer2, bufferNode3.getBuffer());
  122. Assert.assertNull(bufferNode3.getNext());
  123. // Insert to last
  124. byte[] buffer1 = new byte[1];
  125. bufferQueue.enqueue(buffer1);
  126. bufferNode1 = bufferQueue.getHeadBufferNode();
  127. bufferNode2 = bufferNode1.getNext();
  128. bufferNode3 = bufferNode2.getNext();
  129. BufferNode bufferNode4 = bufferNode3.getNext();
  130. Assert.assertSame(buffer4, bufferNode1.getBuffer());
  131. Assert.assertNotNull(bufferNode1.getNext());
  132. Assert.assertSame(buffer3, bufferNode2.getBuffer());
  133. Assert.assertNotNull(bufferNode2.getNext());
  134. Assert.assertSame(buffer2, bufferNode3.getBuffer());
  135. Assert.assertNotNull(bufferNode3.getNext());
  136. Assert.assertSame(buffer1, bufferNode4.getBuffer());
  137. Assert.assertNull(bufferNode4.getNext());
  138. // Fill up queue to default count limit
  139. byte[] buffer5 = new byte[5];
  140. byte[] buffer6 = new byte[6];
  141. byte[] buffer7 = new byte[7];
  142. byte[] buffer8 = new byte[8];
  143. bufferQueue.enqueue(buffer5);
  144. bufferQueue.enqueue(buffer6);
  145. bufferQueue.enqueue(buffer7);
  146. bufferQueue.enqueue(buffer8);
  147. // Automatically release smallest on insert to head
  148. byte[] buffer10 = new byte[10];
  149. bufferQueue.enqueue(buffer10);
  150. bufferNode1 = bufferQueue.getHeadBufferNode();
  151. bufferNode2 = bufferNode1.getNext();
  152. bufferNode3 = bufferNode2.getNext();
  153. bufferNode4 = bufferNode3.getNext();
  154. BufferNode bufferNode5 = bufferNode4.getNext();
  155. BufferNode bufferNode6 = bufferNode5.getNext();
  156. BufferNode bufferNode7 = bufferNode6.getNext();
  157. BufferNode bufferNode8 = bufferNode7.getNext();
  158. Assert.assertSame(buffer10, bufferNode1.getBuffer());
  159. Assert.assertNotNull(bufferNode1.getNext());
  160. Assert.assertSame(buffer8, bufferNode2.getBuffer());
  161. Assert.assertNotNull(bufferNode2.getNext());
  162. Assert.assertSame(buffer7, bufferNode3.getBuffer());
  163. Assert.assertNotNull(bufferNode3.getNext());
  164. Assert.assertSame(buffer6, bufferNode4.getBuffer());
  165. Assert.assertNotNull(bufferNode4.getNext());
  166. Assert.assertSame(buffer5, bufferNode5.getBuffer());
  167. Assert.assertNotNull(bufferNode5.getNext());
  168. Assert.assertSame(buffer4, bufferNode6.getBuffer());
  169. Assert.assertNotNull(bufferNode6.getNext());
  170. Assert.assertSame(buffer3, bufferNode7.getBuffer());
  171. Assert.assertNotNull(bufferNode7.getNext());
  172. Assert.assertSame(buffer2, bufferNode8.getBuffer());
  173. Assert.assertNull(bufferNode8.getNext());
  174. // Automatically release smallest on insert to second
  175. byte[] buffer9 = new byte[9];
  176. bufferQueue.enqueue(buffer9);
  177. bufferNode1 = bufferQueue.getHeadBufferNode();
  178. bufferNode2 = bufferNode1.getNext();
  179. bufferNode3 = bufferNode2.getNext();
  180. bufferNode4 = bufferNode3.getNext();
  181. bufferNode5 = bufferNode4.getNext();
  182. bufferNode6 = bufferNode5.getNext();
  183. bufferNode7 = bufferNode6.getNext();
  184. bufferNode8 = bufferNode7.getNext();
  185. Assert.assertSame(buffer10, bufferNode1.getBuffer());
  186. Assert.assertNotNull(bufferNode1.getNext());
  187. Assert.assertSame(buffer9, bufferNode2.getBuffer());
  188. Assert.assertNotNull(bufferNode2.getNext());
  189. Assert.assertSame(buffer8, bufferNode3.getBuffer());
  190. Assert.assertNotNull(bufferNode3.getNext());
  191. Assert.assertSame(buffer7, bufferNode4.getBuffer());
  192. Assert.assertNotNull(bufferNode4.getNext());
  193. Assert.assertSame(buffer6, bufferNode5.getBuffer());
  194. Assert.assertNotNull(bufferNode5.getNext());
  195. Assert.assertSame(buffer5, bufferNode6.getBuffer());
  196. Assert.assertNotNull(bufferNode6.getNext());
  197. Assert.assertSame(buffer4, bufferNode7.getBuffer());
  198. Assert.assertNotNull(bufferNode7.getNext());
  199. Assert.assertSame(buffer3, bufferNode8.getBuffer());
  200. Assert.assertNull(bufferNode8.getNext());
  201. }
  202. @Test
  203. public void testConstructor() {
  204. new SerializationConstants();
  205. }
  206. @NewEnv(type = NewEnv.Type.CLASSLOADER)
  207. @Test
  208. public void testCustomizedClassInitialization() throws Exception {
  209. System.setProperty(
  210. Serializer.class.getName() + ".thread.local.buffer.count.limit",
  211. String.valueOf(_THREADLOCAL_BUFFER_COUNT_MIN + 1));
  212. System.setProperty(
  213. Serializer.class.getName() + ".thread.local.buffer.size.limit",
  214. String.valueOf(_THREADLOCAL_BUFFER_SIZE_MIN + 1));
  215. Assert.assertEquals(
  216. _THREADLOCAL_BUFFER_COUNT_MIN + 1,
  217. _threadLocalBufferCountLimitField.getInt(null));
  218. Assert.assertEquals(
  219. _THREADLOCAL_BUFFER_SIZE_MIN + 1,
  220. _threadLocalBufferSizeLimitField.getInt(null));
  221. }
  222. @Test
  223. public void testDefaultClassInitialization() throws Exception {
  224. Assert.assertEquals(
  225. _THREADLOCAL_BUFFER_COUNT_MIN,
  226. _threadLocalBufferCountLimitField.getInt(null));
  227. Assert.assertEquals(
  228. _THREADLOCAL_BUFFER_SIZE_MIN,
  229. _threadLocalBufferSizeLimitField.getInt(null));
  230. }
  231. @NewEnv(type = NewEnv.Type.CLASSLOADER)
  232. @Test
  233. public void testDefendedClassInitialization() throws Exception {
  234. System.setProperty(
  235. Serializer.class.getName() + ".thread.local.buffer.count.limit",
  236. String.valueOf(_THREADLOCAL_BUFFER_COUNT_MIN - 1));
  237. System.setProperty(
  238. Serializer.class.getName() + ".thread.local.buffer.size.limit",
  239. String.valueOf(_THREADLOCAL_BUFFER_SIZE_MIN - 1));
  240. Assert.assertEquals(
  241. _THREADLOCAL_BUFFER_COUNT_MIN,
  242. _threadLocalBufferCountLimitField.getInt(null));
  243. Assert.assertEquals(
  244. _THREADLOCAL_BUFFER_SIZE_MIN,
  245. _threadLocalBufferSizeLimitField.getInt(null));
  246. }
  247. @Test
  248. public void testGetBufferGrow() throws Exception {
  249. Serializer serializer = new Serializer();
  250. // OOME
  251. _indexField.set(serializer, 1);
  252. try {
  253. _getBufferMethod.invoke(serializer, Integer.MAX_VALUE);
  254. Assert.fail();
  255. }
  256. catch (InvocationTargetException invocationTargetException) {
  257. Throwable throwable = invocationTargetException.getCause();
  258. Assert.assertTrue(
  259. throwable.toString(), throwable instanceof OutOfMemoryError);
  260. }
  261. // Normal doubling size
  262. byte[] bytes = new byte[_COUNT];
  263. _random.nextBytes(bytes);
  264. _bufferField.set(serializer, bytes);
  265. _indexField.set(serializer, bytes.length);
  266. byte[] newBytes = (byte[])_getBufferMethod.invoke(serializer, 1);
  267. Assert.assertEquals(
  268. Arrays.toString(newBytes), bytes.length * 2, newBytes.length);
  269. for (int i = 0; i < bytes.length; i++) {
  270. Assert.assertEquals(bytes[i], newBytes[i]);
  271. }
  272. for (int i = bytes.length; i < newBytes.length; i++) {
  273. Assert.assertEquals(0, newBytes[i]);
  274. }
  275. // Doubling size is still less than minimum size
  276. _bufferField.set(serializer, bytes);
  277. _indexField.set(serializer, bytes.length);
  278. newBytes = (byte[])_getBufferMethod.invoke(serializer, _COUNT + 1);
  279. Assert.assertEquals(
  280. Arrays.toString(newBytes), (bytes.length * 2) + 1, newBytes.length);
  281. for (int i = 0; i < bytes.length; i++) {
  282. Assert.assertEquals(bytes[i], newBytes[i]);
  283. }
  284. for (int i = bytes.length; i < newBytes.length; i++) {
  285. Assert.assertEquals(0, newBytes[i]);
  286. }
  287. }
  288. @Test
  289. public void testReleaseLargeBuffer() throws Exception {
  290. ThreadLocal<?> bufferQueueThreadLocal =
  291. ReflectionTestUtil.getFieldValue(
  292. Serializer.class, "_bufferQueueThreadLocal");
  293. bufferQueueThreadLocal.remove();
  294. Serializer serializer = new Serializer();
  295. char[] chars = new char[_THREADLOCAL_BUFFER_SIZE_MIN];
  296. serializer.writeString(new String(chars));
  297. serializer.toByteBuffer();
  298. BufferQueue bufferQueue = new BufferQueue(
  299. ReflectionTestUtil.invoke(
  300. serializer, "_getBufferQueue", new Class<?>[0]));
  301. Assert.assertEquals(0, bufferQueue.getCount());
  302. serializer = new Serializer();
  303. serializer.writeString(new String(chars));
  304. UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
  305. new UnsyncByteArrayOutputStream();
  306. serializer.writeTo(unsyncByteArrayOutputStream);
  307. Assert.assertEquals(0, bufferQueue.getCount());
  308. Assert.assertEquals(
  309. (chars.length * 2) + 5, unsyncByteArrayOutputStream.size());
  310. }
  311. @Test
  312. public void testWriteBoolean() throws Exception {
  313. Serializer serializer = new Serializer();
  314. boolean[] booleans = new boolean[_COUNT];
  315. for (int i = 0; i < _COUNT; i++) {
  316. booleans[i] = _random.nextBoolean();
  317. serializer.writeBoolean(booleans[i]);
  318. }
  319. ByteBuffer byteBuffer = serializer.toByteBuffer();
  320. byte[] bytes = byteBuffer.array();
  321. Assert.assertNull(_bufferField.get(serializer));
  322. for (int i = 0; i < _COUNT; i++) {
  323. if (booleans[i]) {
  324. Assert.assertEquals(1, bytes[i]);
  325. }
  326. else {
  327. Assert.assertEquals(0, bytes[i]);
  328. }
  329. }
  330. }
  331. @Test
  332. public void testWriteByte() {
  333. Serializer serializer = new Serializer();
  334. byte[] bytes = new byte[_COUNT];
  335. _random.nextBytes(bytes);
  336. for (int i = 0; i < _COUNT; i++) {
  337. serializer.writeByte(bytes[i]);
  338. }
  339. ByteBuffer byteBuffer = serializer.toByteBuffer();
  340. Assert.assertArrayEquals(bytes, byteBuffer.array());
  341. }
  342. @Test
  343. public void testWriteChar() {
  344. Serializer serializer = new Serializer();
  345. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 2);
  346. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  347. CharBuffer charBuffer = byteBuffer.asCharBuffer();
  348. char[] chars = new char[_COUNT];
  349. for (int i = 0; i < _COUNT; i++) {
  350. chars[i] = (char)_random.nextInt();
  351. serializer.writeChar(chars[i]);
  352. charBuffer.put(chars[i]);
  353. }
  354. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  355. Assert.assertArrayEquals(
  356. byteBuffer.array(), serializerByteBuffer.array());
  357. }
  358. @Test
  359. public void testWriteDouble() {
  360. Serializer serializer = new Serializer();
  361. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 8);
  362. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  363. DoubleBuffer doubleBuffer = byteBuffer.asDoubleBuffer();
  364. double[] doubles = new double[_COUNT];
  365. for (int i = 0; i < _COUNT; i++) {
  366. doubles[i] = _random.nextDouble();
  367. serializer.writeDouble(doubles[i]);
  368. doubleBuffer.put(doubles[i]);
  369. }
  370. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  371. Assert.assertArrayEquals(
  372. byteBuffer.array(), serializerByteBuffer.array());
  373. }
  374. @Test
  375. public void testWriteFloat() {
  376. Serializer serializer = new Serializer();
  377. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 4);
  378. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  379. FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
  380. float[] floats = new float[_COUNT];
  381. for (int i = 0; i < _COUNT; i++) {
  382. floats[i] = _random.nextFloat();
  383. serializer.writeFloat(floats[i]);
  384. floatBuffer.put(floats[i]);
  385. }
  386. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  387. Assert.assertArrayEquals(
  388. byteBuffer.array(), serializerByteBuffer.array());
  389. }
  390. @Test
  391. public void testWriteInt() {
  392. Serializer serializer = new Serializer();
  393. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 4);
  394. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  395. IntBuffer intBuffer = byteBuffer.asIntBuffer();
  396. int[] ints = new int[_COUNT];
  397. for (int i = 0; i < _COUNT; i++) {
  398. ints[i] = _random.nextInt();
  399. serializer.writeInt(ints[i]);
  400. intBuffer.put(ints[i]);
  401. }
  402. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  403. Assert.assertArrayEquals(
  404. byteBuffer.array(), serializerByteBuffer.array());
  405. }
  406. @Test
  407. public void testWriteLong() {
  408. Serializer serializer = new Serializer();
  409. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 8);
  410. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  411. LongBuffer longBuffer = byteBuffer.asLongBuffer();
  412. long[] longs = new long[_COUNT];
  413. for (int i = 0; i < _COUNT; i++) {
  414. longs[i] = _random.nextLong();
  415. serializer.writeLong(longs[i]);
  416. longBuffer.put(longs[i]);
  417. }
  418. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  419. Assert.assertArrayEquals(
  420. byteBuffer.array(), serializerByteBuffer.array());
  421. }
  422. @Test
  423. public void testWriteObjectBoolean() {
  424. Serializer serializer = new Serializer();
  425. serializer.writeObject(Boolean.TRUE);
  426. ByteBuffer byteBuffer = serializer.toByteBuffer();
  427. Assert.assertEquals(2, byteBuffer.limit());
  428. Assert.assertEquals(
  429. SerializationConstants.TC_BOOLEAN, byteBuffer.get());
  430. Assert.assertEquals(1, byteBuffer.get());
  431. }
  432. @Test
  433. public void testWriteObjectByte() {
  434. Serializer serializer = new Serializer();
  435. serializer.writeObject((byte)101);
  436. ByteBuffer byteBuffer = serializer.toByteBuffer();
  437. Assert.assertEquals(2, byteBuffer.limit());
  438. Assert.assertEquals(SerializationConstants.TC_BYTE, byteBuffer.get());
  439. Assert.assertEquals(101, byteBuffer.get());
  440. }
  441. @Test
  442. public void testWriteObjectCharacter() {
  443. Serializer serializer = new Serializer();
  444. serializer.writeObject('a');
  445. ByteBuffer byteBuffer = serializer.toByteBuffer();
  446. Assert.assertEquals(3, byteBuffer.limit());
  447. Assert.assertEquals(
  448. SerializationConstants.TC_CHARACTER, byteBuffer.get());
  449. Assert.assertEquals('a', byteBuffer.getChar());
  450. }
  451. @Test
  452. public void testWriteObjectClassWithBlankContextName()
  453. throws UnsupportedEncodingException {
  454. Serializer serializer = new Serializer();
  455. Class<?> clazz = getClass();
  456. ClassLoaderPool.register(StringPool.BLANK, clazz.getClassLoader());
  457. try {
  458. serializer.writeObject(clazz);
  459. }
  460. finally {
  461. ClassLoaderPool.unregister(clazz.getClassLoader());
  462. }
  463. ByteBuffer byteBuffer = serializer.toByteBuffer();
  464. String className = clazz.getName();
  465. Assert.assertEquals(className.length() + 11, byteBuffer.limit());
  466. Assert.assertEquals(SerializationConstants.TC_CLASS, byteBuffer.get());
  467. Assert.assertEquals(1, byteBuffer.get());
  468. Assert.assertEquals(0, byteBuffer.getInt());
  469. Assert.assertEquals(1, byteBuffer.get());
  470. Assert.assertEquals(className.length(), byteBuffer.getInt());
  471. Assert.assertEquals(
  472. className,
  473. new String(
  474. byteBuffer.array(), byteBuffer.position(),
  475. byteBuffer.remaining(), StringPool.UTF8));
  476. }
  477. @Test
  478. public void testWriteObjectClassWithNullContextName()
  479. throws UnsupportedEncodingException {
  480. Serializer serializer = new Serializer();
  481. Class<?> clazz = getClass();
  482. serializer.writeObject(clazz);
  483. ByteBuffer byteBuffer = serializer.toByteBuffer();
  484. String className = clazz.getName();
  485. String contextName = StringPool.NULL;
  486. byte[] contextNameBytes = contextName.getBytes(StringPool.UTF8);
  487. Assert.assertEquals(
  488. className.length() + contextName.length() + 11, byteBuffer.limit());
  489. Assert.assertEquals(SerializationConstants.TC_CLASS, byteBuffer.get());
  490. Assert.assertEquals(1, byteBuffer.get());
  491. Assert.assertEquals(contextName.length(), byteBuffer.getInt());
  492. Assert.assertEquals(
  493. contextName,
  494. new String(
  495. byteBuffer.array(), byteBuffer.position(),
  496. contextNameBytes.length, StringPool.UTF8));
  497. byteBuffer.position(byteBuffer.position() + contextNameBytes.length);
  498. Assert.assertEquals(1, byteBuffer.get());
  499. Assert.assertEquals(className.length(), byteBuffer.getInt());
  500. Assert.assertEquals(
  501. className,
  502. new String(
  503. byteBuffer.array(), byteBuffer.position(),
  504. byteBuffer.remaining(), StringPool.UTF8));
  505. }
  506. @Test
  507. public void testWriteObjectDouble() {
  508. Serializer serializer = new Serializer();
  509. serializer.writeObject(17.58D);
  510. ByteBuffer byteBuffer = serializer.toByteBuffer();
  511. Assert.assertEquals(9, byteBuffer.limit());
  512. Assert.assertEquals(SerializationConstants.TC_DOUBLE, byteBuffer.get());
  513. Assert.assertTrue(byteBuffer.getDouble() == 17.58D);
  514. }
  515. @Test
  516. public void testWriteObjectFloat() {
  517. Serializer serializer = new Serializer();
  518. serializer.writeObject(17.58F);
  519. ByteBuffer byteBuffer = serializer.toByteBuffer();
  520. Assert.assertEquals(5, byteBuffer.limit());
  521. Assert.assertEquals(SerializationConstants.TC_FLOAT, byteBuffer.get());
  522. Assert.assertTrue(byteBuffer.getFloat() == 17.58F);
  523. }
  524. @Test
  525. public void testWriteObjectInteger() {
  526. Serializer serializer = new Serializer();
  527. serializer.writeObject(101);
  528. ByteBuffer byteBuffer = serializer.toByteBuffer();
  529. Assert.assertEquals(5, byteBuffer.limit());
  530. Assert.assertEquals(
  531. SerializationConstants.TC_INTEGER, byteBuffer.get());
  532. Assert.assertEquals(101, byteBuffer.getInt());
  533. }
  534. @Test
  535. public void testWriteObjectLong() {
  536. Serializer serializer = new Serializer();
  537. serializer.writeObject(Long.valueOf(101));
  538. ByteBuffer byteBuffer = serializer.toByteBuffer();
  539. Assert.assertEquals(9, byteBuffer.limit());
  540. Assert.assertEquals(SerializationConstants.TC_LONG, byteBuffer.get());
  541. Assert.assertEquals(101, byteBuffer.getLong());
  542. }
  543. @Test
  544. public void testWriteObjectNull() {
  545. Serializer serializer = new Serializer();
  546. serializer.writeObject(null);
  547. ByteBuffer byteBuffer = serializer.toByteBuffer();
  548. Assert.assertEquals(1, byteBuffer.limit());
  549. Assert.assertEquals(SerializationConstants.TC_NULL, byteBuffer.get());
  550. }
  551. @Test
  552. public void testWriteObjectOrdinary() throws Exception {
  553. Serializer serializer = new Serializer();
  554. Date date = new Date(123456);
  555. serializer.writeObject(date);
  556. ByteBuffer byteBuffer = serializer.toByteBuffer();
  557. Assert.assertEquals(SerializationConstants.TC_OBJECT, byteBuffer.get());
  558. UnsyncByteArrayInputStream unsyncByteArrayInputStream =
  559. new UnsyncByteArrayInputStream(
  560. byteBuffer.array(), byteBuffer.position(),
  561. byteBuffer.remaining());
  562. ObjectInputStream objectInputStream = new AnnotatedObjectInputStream(
  563. unsyncByteArrayInputStream);
  564. Object object = objectInputStream.readObject();
  565. Assert.assertTrue(object instanceof Date);
  566. Assert.assertEquals(date, object);
  567. }
  568. @Test
  569. public void testWriteObjectOrdinaryNPE() throws Exception {
  570. Serializer serializer = new Serializer();
  571. Serializable serializable = new Serializable() {
  572. private void writeObject(ObjectOutputStream objectOutputStream)
  573. throws IOException {
  574. throw new IOException("Forced IOException");
  575. }
  576. };
  577. try {
  578. serializer.writeObject(serializable);
  579. Assert.fail();
  580. }
  581. catch (RuntimeException runtimeException) {
  582. String message = runtimeException.getMessage();
  583. Assert.assertTrue(
  584. message.startsWith(
  585. "Unable to write ordinary serializable object "));
  586. Throwable throwable = runtimeException.getCause();
  587. Assert.assertTrue(throwable instanceof IOException);
  588. Assert.assertEquals("Forced IOException", throwable.getMessage());
  589. }
  590. }
  591. @Test
  592. public void testWriteObjectShort() {
  593. Serializer serializer = new Serializer();
  594. serializer.writeObject((short)101);
  595. ByteBuffer byteBuffer = serializer.toByteBuffer();
  596. Assert.assertEquals(3, byteBuffer.limit());
  597. Assert.assertEquals(SerializationConstants.TC_SHORT, byteBuffer.get());
  598. Assert.assertEquals(101, byteBuffer.getShort());
  599. }
  600. @Test
  601. public void testWriteObjectString() {
  602. String asciiString = "abcdefghijklmn";
  603. Serializer serializer = new Serializer();
  604. serializer.writeObject(asciiString);
  605. ByteBuffer byteBuffer = serializer.toByteBuffer();
  606. Assert.assertEquals(6 + asciiString.length(), byteBuffer.limit());
  607. Assert.assertEquals(SerializationConstants.TC_STRING, byteBuffer.get());
  608. Assert.assertEquals(1, byteBuffer.get());
  609. Assert.assertEquals(asciiString.length(), byteBuffer.getInt());
  610. for (int i = 0; i < asciiString.length(); i++) {
  611. Assert.assertEquals(asciiString.charAt(i), (char)byteBuffer.get());
  612. }
  613. String nonasciiString = "非ASCII Code中文测试";
  614. serializer = new Serializer();
  615. serializer.writeObject(nonasciiString);
  616. byteBuffer = serializer.toByteBuffer();
  617. Assert.assertEquals(
  618. 6 + (nonasciiString.length() * 2), byteBuffer.limit());
  619. Assert.assertEquals(SerializationConstants.TC_STRING, byteBuffer.get());
  620. Assert.assertEquals(0, byteBuffer.get());
  621. Assert.assertEquals(nonasciiString.length(), byteBuffer.getInt());
  622. for (int i = 0; i < nonasciiString.length(); i++) {
  623. Assert.assertEquals(nonasciiString.charAt(i), byteBuffer.getChar());
  624. }
  625. }
  626. @Test
  627. public void testWriteShort() {
  628. Serializer serializer = new Serializer();
  629. ByteBuffer byteBuffer = ByteBuffer.allocate(_COUNT * 2);
  630. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  631. ShortBuffer shortBuffer = byteBuffer.asShortBuffer();
  632. short[] shorts = new short[_COUNT];
  633. for (int i = 0; i < _COUNT; i++) {
  634. shorts[i] = (short)_random.nextInt();
  635. serializer.writeShort(shorts[i]);
  636. shortBuffer.put(shorts[i]);
  637. }
  638. ByteBuffer serializerByteBuffer = serializer.toByteBuffer();
  639. Assert.assertArrayEquals(
  640. byteBuffer.array(), serializerByteBuffer.array());
  641. }
  642. @Test
  643. public void testWriteString() throws Exception {
  644. String asciiString = "abcdefghijklmn";
  645. Serializer serializer = new Serializer();
  646. _bufferField.set(serializer, new byte[0]);
  647. serializer.writeString(asciiString);
  648. Assert.assertEquals(
  649. _indexField.getInt(serializer), 5 + asciiString.length());
  650. Assert.assertTrue(
  651. BigEndianCodec.getBoolean((byte[])_bufferField.get(serializer), 0));
  652. int length = BigEndianCodec.getInt(
  653. (byte[])_bufferField.get(serializer), 1);
  654. Assert.assertEquals(asciiString.length(), length);
  655. ByteBuffer byteBuffer = ByteBuffer.allocate(asciiString.length());
  656. for (int i = 0; i < asciiString.length(); i++) {
  657. byteBuffer.put((byte)asciiString.charAt(i));
  658. }
  659. byteBuffer.flip();
  660. UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
  661. new UnsyncByteArrayOutputStream();
  662. serializer.writeTo(unsyncByteArrayOutputStream);
  663. byte[] data = unsyncByteArrayOutputStream.toByteArray();
  664. for (int i = 5; i < data.length; i++) {
  665. Assert.assertEquals(byteBuffer.get(), data[i]);
  666. }
  667. String nonasciiString = "非ASCII Code中文测试";
  668. serializer = new Serializer();
  669. serializer.writeString(nonasciiString);
  670. Assert.assertEquals(
  671. _indexField.getInt(serializer), 5 + (nonasciiString.length() * 2));
  672. Assert.assertFalse(
  673. BigEndianCodec.getBoolean((byte[])_bufferField.get(serializer), 0));
  674. length = BigEndianCodec.getInt((byte[])_bufferField.get(serializer), 1);
  675. Assert.assertEquals(nonasciiString.length(), length);
  676. byteBuffer = ByteBuffer.allocate(nonasciiString.length() * 2);
  677. byteBuffer.order(ByteOrder.BIG_ENDIAN);
  678. CharBuffer charBuffer = byteBuffer.asCharBuffer();
  679. for (int i = 0; i < nonasciiString.length(); i++) {
  680. charBuffer.put(nonasciiString.charAt(i));
  681. }
  682. unsyncByteArrayOutputStream = new UnsyncByteArrayOutputStream();
  683. serializer.writeTo(unsyncByteArrayOutputStream);
  684. data = unsyncByteArrayOutputStream.toByteArray();
  685. for (int i = 5; i < data.length; i++) {
  686. Assert.assertEquals(byteBuffer.get(), data[i]);
  687. }
  688. }
  689. private static final int _COUNT = 1024;
  690. private static final int _THREADLOCAL_BUFFER_COUNT_MIN = 8;
  691. private static final int _THREADLOCAL_BUFFER_SIZE_MIN = 16 * 1024;
  692. private static final Field _bufferField = ReflectionTestUtil.getField(
  693. Serializer.class, "_buffer");
  694. private static final Method _getBufferMethod = ReflectionTestUtil.getMethod(
  695. Serializer.class, "_getBuffer", int.class);
  696. private static final Field _indexField = ReflectionTestUtil.getField(
  697. Serializer.class, "_index");
  698. private static final Field _threadLocalBufferCountLimitField =
  699. ReflectionTestUtil.getField(
  700. Serializer.class, "_THREADLOCAL_BUFFER_COUNT_LIMIT");
  701. private static final Field _threadLocalBufferSizeLimitField =
  702. ReflectionTestUtil.getField(
  703. Serializer.class, "_THREADLOCAL_BUFFER_SIZE_LIMIT");
  704. private final Random _random = new Random();
  705. private static class BufferNode {
  706. public byte[] getBuffer() throws Exception {
  707. return (byte[])_bufferField.get(_bufferNode);
  708. }
  709. public BufferNode getNext() throws Exception {
  710. Object next = _nextField.get(_bufferNode);
  711. if (next == null) {
  712. return null;
  713. }
  714. return new BufferNode(next);
  715. }
  716. private BufferNode(Object bufferNode) throws Exception {
  717. _bufferNode = bufferNode;
  718. }
  719. private static final Field _bufferField;
  720. private static final Field _nextField;
  721. static {
  722. try {
  723. Class<?> clazz = Class.forName(
  724. Serializer.class.getName() + "$BufferNode");
  725. _bufferField = ReflectionTestUtil.getField(clazz, "_buffer");
  726. _nextField = ReflectionTestUtil.getField(clazz, "_next");
  727. }
  728. catch (ClassNotFoundException classNotFoundException) {
  729. throw new ExceptionInInitializerError(classNotFoundException);
  730. }
  731. }
  732. private final Object _bufferNode;
  733. }
  734. private static class BufferOutputStream {
  735. public void write(byte[] bytes) throws Exception {
  736. _writeBytesMethod.invoke(_bufferOutputStream, new Object[] {bytes});
  737. }
  738. public void write(int b) throws Exception {
  739. _writeByteMethod.invoke(_bufferOutputStream, b);
  740. }
  741. private BufferOutputStream(Serializer serializer) throws Exception {
  742. _bufferOutputStream = _constructor.newInstance(serializer);
  743. }
  744. private static final Constructor<?> _constructor;
  745. private static final Method _writeByteMethod;
  746. private static final Method _writeBytesMethod;
  747. static {
  748. try {
  749. Class<?> clazz = Class.forName(
  750. Serializer.class.getName() + "$BufferOutputStream");
  751. _constructor = clazz.getDeclaredConstructor(Serializer.class);
  752. _constructor.setAccessible(true);
  753. _writeByteMethod = ReflectionTestUtil.getMethod(
  754. clazz, "write", int.class);
  755. _writeBytesMethod = ReflectionTestUtil.getMethod(
  756. clazz, "write", byte[].class);
  757. }
  758. catch (ReflectiveOperationException reflectiveOperationException) {
  759. throw new ExceptionInInitializerError(
  760. reflectiveOperationException);
  761. }
  762. }
  763. private final Object _bufferOutputStream;
  764. }
  765. private static class BufferQueue {
  766. public void enqueue(byte[] bytes) throws Exception {
  767. _enqueueMethod.invoke(_bufferQueue, new Object[] {bytes});
  768. }
  769. public int getCount() throws Exception {
  770. return _countField.getInt(_bufferQueue);
  771. }
  772. public BufferNode getHeadBufferNode() throws Exception {
  773. Object bufferNode = _headBufferNodeField.get(_bufferQueue);
  774. if (bufferNode == null) {
  775. return null;
  776. }
  777. return new BufferNode(bufferNode);
  778. }
  779. private BufferQueue() throws Exception {
  780. _bufferQueue = _constructor.newInstance();
  781. }
  782. private BufferQueue(Object bufferQueue) throws Exception {
  783. _bufferQueue = bufferQueue;
  784. }
  785. private static final Constructor<?> _constructor;
  786. private static final Field _countField;
  787. private static final Method _enqueueMethod;
  788. private static final Field _headBufferNodeField;
  789. static {
  790. try {
  791. Class<?> clazz = Class.forName(
  792. Serializer.class.getName() + "$BufferQueue");
  793. _constructor = clazz.getDeclaredConstructor();
  794. _constructor.setAccessible(true);
  795. _countField = ReflectionTestUtil.getField(clazz, "_count");
  796. _headBufferNodeField = ReflectionTestUtil.getField(
  797. clazz, "_headBufferNode");
  798. _enqueueMethod = ReflectionTestUtil.getMethod(
  799. clazz, "enqueue", byte[].class);
  800. }
  801. catch (ReflectiveOperationException reflectiveOperationException) {
  802. throw new ExceptionInInitializerError(
  803. reflectiveOperationException);
  804. }
  805. }
  806. private final Object _bufferQueue;
  807. }
  808. }