PageRenderTime 23ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://github.com/liferay/liferay-portal
Java | 575 lines | 350 code | 177 blank | 48 comment | 3 complexity | 704ff5446dbb045fb6a57ccefaa94ce3 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.unsync;
  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.IOException;
  21. import java.io.InputStreamReader;
  22. import java.io.Reader;
  23. import java.io.StringReader;
  24. import java.lang.reflect.Field;
  25. import java.util.Arrays;
  26. import java.util.List;
  27. import org.junit.Assert;
  28. import org.junit.ClassRule;
  29. import org.junit.Rule;
  30. import org.junit.Test;
  31. /**
  32. * @author Shuyang Zhou
  33. */
  34. public class UnsyncBufferedReaderTest extends BaseReaderTestCase {
  35. @ClassRule
  36. @Rule
  37. public static final AggregateTestRule aggregateTestRule =
  38. new AggregateTestRule(
  39. new CodeCoverageAssertor() {
  40. @Override
  41. public void appendAssertClasses(List<Class<?>> assertClasses) {
  42. assertClasses.add(BoundaryCheckerUtil.class);
  43. }
  44. },
  45. LiferayUnitTestRule.INSTANCE);
  46. @Override
  47. @Test
  48. public void testBlockRead() throws Exception {
  49. super.testBlockRead();
  50. StringReader stringReader = new StringReader("abcdefghi");
  51. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  52. stringReader, 5);
  53. char[] buffer = (char[])_bufferField.get(unsyncBufferedReader);
  54. Assert.assertEquals(Arrays.toString(buffer), 5, buffer.length);
  55. Assert.assertTrue(stringReader.ready());
  56. Assert.assertTrue(unsyncBufferedReader.ready());
  57. buffer = new char[3];
  58. // Zero length read
  59. Assert.assertEquals(0, unsyncBufferedReader.read(buffer, 0, 0));
  60. // In-memory
  61. Assert.assertEquals('a', unsyncBufferedReader.read());
  62. Assert.assertEquals(1, _indexField.getInt(unsyncBufferedReader));
  63. Assert.assertEquals(
  64. 5, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  65. int read = unsyncBufferedReader.read(buffer);
  66. Assert.assertEquals(buffer.length, read);
  67. Assert.assertEquals('b', buffer[0]);
  68. Assert.assertEquals('c', buffer[1]);
  69. Assert.assertEquals('d', buffer[2]);
  70. Assert.assertEquals(4, _indexField.getInt(unsyncBufferedReader));
  71. Assert.assertEquals(
  72. 5, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  73. // Exhaust buffer
  74. Assert.assertEquals('e', unsyncBufferedReader.read());
  75. Assert.assertEquals(5, _indexField.getInt(unsyncBufferedReader));
  76. Assert.assertEquals(
  77. 5, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  78. // Force reload
  79. read = unsyncBufferedReader.read(buffer);
  80. Assert.assertEquals(buffer.length, read);
  81. Assert.assertEquals('f', buffer[0]);
  82. Assert.assertEquals('g', buffer[1]);
  83. Assert.assertEquals('h', buffer[2]);
  84. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  85. Assert.assertEquals(
  86. 4, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  87. // Finish
  88. stringReader = new StringReader(new String(_BUFFER));
  89. unsyncBufferedReader = new UnsyncBufferedReader(stringReader, _SIZE);
  90. char[] tempBuffer = new char[_SIZE];
  91. Assert.assertEquals(_SIZE, unsyncBufferedReader.read(tempBuffer));
  92. // Mark and EOF
  93. stringReader = new StringReader(new String(_BUFFER));
  94. unsyncBufferedReader = new UnsyncBufferedReader(stringReader, 5);
  95. unsyncBufferedReader.mark(_SIZE);
  96. Assert.assertEquals(_SIZE, unsyncBufferedReader.read(tempBuffer));
  97. Assert.assertEquals(-1, unsyncBufferedReader.read(tempBuffer));
  98. }
  99. @Test
  100. public void testClose() throws Exception {
  101. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  102. new StringReader(""));
  103. unsyncBufferedReader.close();
  104. Assert.assertNull(_bufferField.get(unsyncBufferedReader));
  105. Assert.assertNull(_readerField.get(unsyncBufferedReader));
  106. try {
  107. unsyncBufferedReader.readLine();
  108. Assert.fail();
  109. }
  110. catch (IOException ioException) {
  111. Assert.assertEquals("Reader is null", ioException.getMessage());
  112. }
  113. testClose(unsyncBufferedReader, "Reader is null");
  114. }
  115. @Test
  116. public void testConstructor() throws Exception {
  117. new BoundaryCheckerUtil();
  118. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  119. new StringReader(""));
  120. char[] buffer = (char[])_bufferField.get(unsyncBufferedReader);
  121. Assert.assertEquals(Arrays.toString(buffer), 8192, buffer.length);
  122. unsyncBufferedReader = new UnsyncBufferedReader(
  123. new StringReader(""), 10);
  124. buffer = (char[])_bufferField.get(unsyncBufferedReader);
  125. Assert.assertEquals(Arrays.toString(buffer), 10, buffer.length);
  126. try {
  127. new UnsyncBufferedReader(new StringReader(""), 0);
  128. Assert.fail();
  129. }
  130. catch (IllegalArgumentException illegalArgumentException) {
  131. Assert.assertEquals(
  132. "Size is less than 1", illegalArgumentException.getMessage());
  133. }
  134. try {
  135. new UnsyncBufferedReader(new StringReader(""), -1);
  136. Assert.fail();
  137. }
  138. catch (IllegalArgumentException illegalArgumentException) {
  139. Assert.assertEquals(
  140. "Size is less than 1", illegalArgumentException.getMessage());
  141. }
  142. }
  143. @Override
  144. @Test
  145. public void testMarkAndReset() throws Exception {
  146. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  147. new StringReader("abcdefghi"), 5);
  148. Assert.assertEquals(
  149. -1, _markLimitIndexField.getInt(unsyncBufferedReader));
  150. // Zero marking
  151. unsyncBufferedReader.mark(0);
  152. Assert.assertEquals(
  153. -1, _markLimitIndexField.getInt(unsyncBufferedReader));
  154. // Negative marking
  155. try {
  156. unsyncBufferedReader.mark(-2);
  157. Assert.fail();
  158. }
  159. catch (IllegalArgumentException illegalArgumentException) {
  160. Assert.assertEquals(
  161. "Mark limit is less than 0",
  162. illegalArgumentException.getMessage());
  163. }
  164. Assert.assertEquals(
  165. -1, _markLimitIndexField.getInt(unsyncBufferedReader));
  166. // Normal
  167. int markLimit = 3;
  168. unsyncBufferedReader.mark(markLimit);
  169. Assert.assertEquals(
  170. markLimit, _markLimitIndexField.getInt(unsyncBufferedReader));
  171. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  172. Assert.assertEquals('a', unsyncBufferedReader.read());
  173. Assert.assertEquals('b', unsyncBufferedReader.read());
  174. Assert.assertEquals('c', unsyncBufferedReader.read());
  175. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  176. unsyncBufferedReader.reset();
  177. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  178. Assert.assertEquals('a', unsyncBufferedReader.read());
  179. Assert.assertEquals('b', unsyncBufferedReader.read());
  180. Assert.assertEquals('c', unsyncBufferedReader.read());
  181. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  182. // Overrun
  183. unsyncBufferedReader = new UnsyncBufferedReader(
  184. new StringReader("abcdefghi"), 5);
  185. Assert.assertEquals(
  186. -1, _markLimitIndexField.getInt(unsyncBufferedReader));
  187. unsyncBufferedReader.mark(markLimit);
  188. Assert.assertEquals(
  189. markLimit, _markLimitIndexField.getInt(unsyncBufferedReader));
  190. Assert.assertEquals('a', unsyncBufferedReader.read());
  191. Assert.assertEquals('b', unsyncBufferedReader.read());
  192. Assert.assertEquals('c', unsyncBufferedReader.read());
  193. Assert.assertEquals('d', unsyncBufferedReader.read());
  194. Assert.assertEquals('e', unsyncBufferedReader.read());
  195. Assert.assertEquals('f', unsyncBufferedReader.read());
  196. Assert.assertEquals(1, _indexField.getInt(unsyncBufferedReader));
  197. Assert.assertEquals(
  198. -1, _markLimitIndexField.getInt(unsyncBufferedReader));
  199. try {
  200. unsyncBufferedReader.reset();
  201. Assert.fail();
  202. }
  203. catch (IOException ioException) {
  204. Assert.assertEquals(
  205. "Resetting to invalid mark", ioException.getMessage());
  206. }
  207. // Shuffle
  208. unsyncBufferedReader = new UnsyncBufferedReader(
  209. new StringReader("abcdefghi"), 5);
  210. Assert.assertEquals('a', unsyncBufferedReader.read());
  211. Assert.assertEquals('b', unsyncBufferedReader.read());
  212. Assert.assertEquals('c', unsyncBufferedReader.read());
  213. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  214. unsyncBufferedReader.mark(markLimit);
  215. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  216. Assert.assertEquals('d', unsyncBufferedReader.read());
  217. Assert.assertEquals('e', unsyncBufferedReader.read());
  218. Assert.assertEquals('f', unsyncBufferedReader.read());
  219. // Reset buffer
  220. unsyncBufferedReader = new UnsyncBufferedReader(
  221. new StringReader(new String(_BUFFER)), _SIZE);
  222. char[] tempBuffer = new char[_SIZE / 2];
  223. Assert.assertEquals(_SIZE / 2, unsyncBufferedReader.read(tempBuffer));
  224. Assert.assertEquals(_SIZE / 2, unsyncBufferedReader.read(tempBuffer));
  225. Assert.assertEquals(_SIZE, _indexField.getInt(unsyncBufferedReader));
  226. Assert.assertEquals(
  227. _SIZE, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  228. unsyncBufferedReader.mark(markLimit);
  229. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  230. Assert.assertEquals(
  231. 0, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  232. // Read line without buffer
  233. unsyncBufferedReader = new UnsyncBufferedReader(
  234. new StringReader("abcdefghi"), 3);
  235. Assert.assertEquals('a', unsyncBufferedReader.read());
  236. unsyncBufferedReader.mark(3);
  237. Assert.assertEquals("bcdefghi", unsyncBufferedReader.readLine());
  238. }
  239. @Override
  240. @Test
  241. public void testRead() throws Exception {
  242. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  243. new StringReader("ab\r\nef"), 3);
  244. char[] buffer = (char[])_bufferField.get(unsyncBufferedReader);
  245. Assert.assertEquals(Arrays.toString(buffer), 3, buffer.length);
  246. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  247. Assert.assertEquals('a', unsyncBufferedReader.read());
  248. Assert.assertEquals(1, _indexField.getInt(unsyncBufferedReader));
  249. Assert.assertEquals('b', unsyncBufferedReader.read());
  250. Assert.assertEquals(2, _indexField.getInt(unsyncBufferedReader));
  251. Assert.assertEquals('\r', unsyncBufferedReader.read());
  252. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  253. Assert.assertEquals('\n', unsyncBufferedReader.read());
  254. Assert.assertEquals(1, _indexField.getInt(unsyncBufferedReader));
  255. Assert.assertEquals('e', unsyncBufferedReader.read());
  256. Assert.assertEquals(2, _indexField.getInt(unsyncBufferedReader));
  257. Assert.assertEquals('f', unsyncBufferedReader.read());
  258. Assert.assertEquals(3, _indexField.getInt(unsyncBufferedReader));
  259. Assert.assertEquals(-1, unsyncBufferedReader.read());
  260. }
  261. @Test
  262. public void testReadLine() throws Exception {
  263. // With \r
  264. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  265. new StringReader("abc\rde"), 5);
  266. Assert.assertEquals("abc", unsyncBufferedReader.readLine());
  267. Assert.assertEquals(4, _indexField.getInt(unsyncBufferedReader));
  268. // With \n
  269. unsyncBufferedReader = new UnsyncBufferedReader(
  270. new StringReader("abc\nde"), 5);
  271. Assert.assertEquals("abc", unsyncBufferedReader.readLine());
  272. Assert.assertEquals(4, _indexField.getInt(unsyncBufferedReader));
  273. // With \r\n
  274. unsyncBufferedReader = new UnsyncBufferedReader(
  275. new StringReader("abc\r\nde"), 5);
  276. Assert.assertEquals("abc", unsyncBufferedReader.readLine());
  277. Assert.assertEquals(5, _indexField.getInt(unsyncBufferedReader));
  278. // Without \r or \n
  279. unsyncBufferedReader = new UnsyncBufferedReader(
  280. new StringReader("abc"), 5);
  281. Assert.assertEquals("abc", unsyncBufferedReader.readLine());
  282. Assert.assertEquals(0, _indexField.getInt(unsyncBufferedReader));
  283. // Empty
  284. Assert.assertNull(unsyncBufferedReader.readLine());
  285. // Load multiple times for one line
  286. unsyncBufferedReader = new UnsyncBufferedReader(
  287. new StringReader("abcdefghijklmn\r"), 5);
  288. Assert.assertEquals("abcdefghijklmn", unsyncBufferedReader.readLine());
  289. Assert.assertEquals(5, _indexField.getInt(unsyncBufferedReader));
  290. unsyncBufferedReader = new UnsyncBufferedReader(
  291. new StringReader("abcdefghijklmn\r"), 5);
  292. Assert.assertEquals('a', unsyncBufferedReader.read());
  293. Assert.assertEquals('b', unsyncBufferedReader.read());
  294. unsyncBufferedReader.mark(1);
  295. }
  296. @Override
  297. @Test
  298. public void testReady() throws IOException {
  299. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  300. new StringReader(""));
  301. Assert.assertTrue(unsyncBufferedReader.ready());
  302. unsyncBufferedReader = new UnsyncBufferedReader(
  303. new InputStreamReader(new ByteArrayInputStream(new byte[0])));
  304. Assert.assertFalse(unsyncBufferedReader.ready());
  305. unsyncBufferedReader = new UnsyncBufferedReader(
  306. new StringReader("abcd") {
  307. @Override
  308. public int read(char[] chars, int offset, int length)
  309. throws IOException {
  310. _ready = false;
  311. return super.read(chars, offset, length);
  312. }
  313. @Override
  314. public boolean ready() {
  315. return _ready;
  316. }
  317. private boolean _ready = true;
  318. });
  319. char[] chars = new char[2];
  320. Assert.assertEquals(2, unsyncBufferedReader.read(chars));
  321. Assert.assertEquals("ab", new String(chars));
  322. unsyncBufferedReader.mark(2);
  323. Assert.assertTrue(unsyncBufferedReader.ready());
  324. }
  325. @Override
  326. @Test
  327. public void testSkip() throws Exception {
  328. int size = 10;
  329. UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
  330. new StringReader(new String(_BUFFER)), size);
  331. // Zero skip
  332. Assert.assertEquals(0, unsyncBufferedReader.skip(0));
  333. // Negetive skip
  334. try {
  335. unsyncBufferedReader.skip(-1);
  336. Assert.fail();
  337. }
  338. catch (IllegalArgumentException illegalArgumentException) {
  339. Assert.assertEquals(
  340. "Skip is less than 0", illegalArgumentException.getMessage());
  341. }
  342. // Load data into buffer
  343. Assert.assertEquals('a', unsyncBufferedReader.read());
  344. Assert.assertEquals(1, _indexField.getInt(unsyncBufferedReader));
  345. Assert.assertEquals(
  346. size, _firstInvalidIndexField.getInt(unsyncBufferedReader));
  347. // In-memory
  348. Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size * 2));
  349. Assert.assertEquals('a' + 10, unsyncBufferedReader.read());
  350. Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size * 2));
  351. // Underlying reader
  352. Assert.assertEquals(size * 2, unsyncBufferedReader.skip(size * 2));
  353. Assert.assertEquals('a' + (40 % 26), unsyncBufferedReader.read());
  354. // Clear out buffer
  355. Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size));
  356. // Mark
  357. unsyncBufferedReader.mark(size * 2);
  358. // Load data into buffer for skipping
  359. Assert.assertEquals(size, unsyncBufferedReader.skip(size * 2));
  360. // In-memory
  361. Assert.assertEquals(size / 2, unsyncBufferedReader.skip(size / 2));
  362. unsyncBufferedReader.reset();
  363. Assert.assertEquals('a' + (50 % 26), unsyncBufferedReader.read());
  364. // Clear out buffer
  365. Assert.assertEquals(
  366. (size * 2) - 1, unsyncBufferedReader.skip(size * 2));
  367. // Mark a large size for EOF
  368. unsyncBufferedReader.mark(_SIZE);
  369. // Consume all the data
  370. while (unsyncBufferedReader.read() != -1);
  371. // Skip on EOF
  372. Assert.assertEquals(0, unsyncBufferedReader.skip(1));
  373. }
  374. @Override
  375. protected Reader getReader(String s) {
  376. return new UnsyncBufferedReader(new StringReader(s));
  377. }
  378. private static final char[] _BUFFER =
  379. new char[UnsyncBufferedReaderTest._SIZE];
  380. private static final int _SIZE = 16 * 1024;
  381. private static final Field _bufferField = ReflectionTestUtil.getField(
  382. UnsyncBufferedReader.class, "_buffer");
  383. private static final Field _firstInvalidIndexField =
  384. ReflectionTestUtil.getField(
  385. UnsyncBufferedReader.class, "_firstInvalidIndex");
  386. private static final Field _indexField = ReflectionTestUtil.getField(
  387. UnsyncBufferedReader.class, "_index");
  388. private static final Field _markLimitIndexField =
  389. ReflectionTestUtil.getField(
  390. UnsyncBufferedReader.class, "_markLimitIndex");
  391. private static final Field _readerField = ReflectionTestUtil.getField(
  392. UnsyncBufferedReader.class, "_reader");
  393. static {
  394. for (int i = 0; i < _SIZE; i++) {
  395. _BUFFER[i] = (char)((i % 26) + 'a');
  396. }
  397. }
  398. }