View Javadoc
1   /*
2    * Copyright (C) 2010, Marc Strapetz <marc.strapetz@syntevo.com>
3    * Copyright (C) 2015, Ivan Motsch <ivan.motsch@bsiag.com>
4    * and other copyright owners as documented in the project's IP log.
5    *
6    * This program and the accompanying materials are made available
7    * under the terms of the Eclipse Distribution License v1.0 which
8    * accompanies this distribution, is reproduced below, and is
9    * available at http://www.eclipse.org/org/documents/edl-v10.php
10   *
11   * All rights reserved.
12   *
13   * Redistribution and use in source and binary forms, with or
14   * without modification, are permitted provided that the following
15   * conditions are met:
16   *
17   * - Redistributions of source code must retain the above copyright
18   *   notice, this list of conditions and the following disclaimer.
19   *
20   * - Redistributions in binary form must reproduce the above
21   *   copyright notice, this list of conditions and the following
22   *   disclaimer in the documentation and/or other materials provided
23   *   with the distribution.
24   *
25   * - Neither the name of the Eclipse Foundation, Inc. nor the
26   *   names of its contributors may be used to endorse or promote
27   *   products derived from this software without specific prior
28   *   written permission.
29   *
30   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
31   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
32   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
35   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
39   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
42   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43   */
44  
45  package org.eclipse.jgit.util.io;
46  
47  import static java.nio.charset.StandardCharsets.UTF_8;
48  import static org.junit.Assert.assertEquals;
49  
50  import java.io.ByteArrayInputStream;
51  import java.io.IOException;
52  import java.io.InputStream;
53  
54  import org.junit.Test;
55  
56  public class AutoLFInputStreamTest {
57  
58  	@Test
59  	public void testLF() throws IOException {
60  		final byte[] bytes = asBytes("1\n2\n3");
61  		test(bytes, bytes, false);
62  	}
63  
64  	@Test
65  	public void testCR() throws IOException {
66  		final byte[] bytes = asBytes("1\r2\r3");
67  		test(bytes, bytes, false);
68  	}
69  
70  	@Test
71  	public void testCRLF() throws IOException {
72  		test(asBytes("1\r\n2\r\n3"), asBytes("1\n2\n3"), false);
73  	}
74  
75  	@Test
76  	public void testLFCR() throws IOException {
77  		final byte[] bytes = asBytes("1\n\r2\n\r3");
78  		test(bytes, bytes, false);
79  	}
80  
81  	@Test
82  	public void testEmpty() throws IOException {
83  		final byte[] bytes = asBytes("");
84  		test(bytes, bytes, false);
85  	}
86  
87  	@Test
88  	public void testBinaryDetect() throws IOException {
89  		final byte[] bytes = asBytes("1\r\n2\r\n3\0");
90  		test(bytes, bytes, true);
91  	}
92  
93  	@Test
94  	public void testBinaryDontDetect() throws IOException {
95  		test(asBytes("1\r\n2\r\n3\0"), asBytes("1\n2\n3\0"), false);
96  	}
97  
98  	private static void test(byte[] input, byte[] expected,
99  			boolean detectBinary) throws IOException {
100 		try (InputStream bis1 = new ByteArrayInputStream(input);
101 				InputStream cis1 = new AutoLFInputStream(bis1, detectBinary)) {
102 			int index1 = 0;
103 			for (int b = cis1.read(); b != -1; b = cis1.read()) {
104 				assertEquals(expected[index1], (byte) b);
105 				index1++;
106 			}
107 
108 			assertEquals(expected.length, index1);
109 
110 			for (int bufferSize = 1; bufferSize < 10; bufferSize++) {
111 				final byte[] buffer = new byte[bufferSize];
112 				try (InputStream bis2 = new ByteArrayInputStream(input);
113 						InputStream cis2 = new AutoLFInputStream(bis2,
114 								detectBinary)) {
115 
116 					int read = 0;
117 					for (int readNow = cis2.read(buffer, 0,
118 							buffer.length); readNow != -1
119 									&& read < expected.length; readNow = cis2
120 											.read(buffer, 0, buffer.length)) {
121 						for (int index2 = 0; index2 < readNow; index2++) {
122 							assertEquals(expected[read + index2],
123 									buffer[index2]);
124 						}
125 						read += readNow;
126 					}
127 
128 					assertEquals(expected.length, read);
129 				}
130 			}
131 		}
132 	}
133 
134 	private static byte[] asBytes(String in) {
135 		return in.getBytes(UTF_8);
136 	}
137 }