add additional tests with UTF-8 and UTF-16BE encoding
This commit is contained in:
@@ -110,13 +110,22 @@ public class FlatFileItemWriterTests {
|
||||
* because running the tests in a UNIX environment locks the file if it's open for writing.
|
||||
*/
|
||||
private String readLine() throws IOException {
|
||||
return readLine("UTF-8");
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a line from the output file, if the reader has not been created, recreate. This method is only necessary
|
||||
* because running the tests in a UNIX environment locks the file if it's open for writing.
|
||||
*/
|
||||
private String readLine(String encoding) throws IOException {
|
||||
|
||||
if (reader == null) {
|
||||
reader = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile), "UTF-8"));
|
||||
reader = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile), encoding));
|
||||
}
|
||||
|
||||
return reader.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Properly close the output file reader.
|
||||
*/
|
||||
@@ -434,8 +443,18 @@ public class FlatFileItemWriterTests {
|
||||
|
||||
@Test
|
||||
// BATCH-1959
|
||||
public void testTransactionalRestartWithMultiByteCharacter() throws Exception {
|
||||
public void testTransactionalRestartWithMultiByteCharacterUTF8() throws Exception {
|
||||
testTransactionalRestartWithMultiByteCharacter("UTF-8");
|
||||
}
|
||||
|
||||
@Test
|
||||
// BATCH-1959
|
||||
public void testTransactionalRestartWithMultiByteCharacterUTF16BE() throws Exception {
|
||||
testTransactionalRestartWithMultiByteCharacter("UTF-16BE");
|
||||
}
|
||||
|
||||
private void testTransactionalRestartWithMultiByteCharacter(String encoding) throws Exception {
|
||||
writer.setEncoding(encoding);
|
||||
writer.setFooterCallback(new FlatFileFooterCallback() {
|
||||
|
||||
@Override
|
||||
@@ -492,15 +511,14 @@ public class FlatFileItemWriterTests {
|
||||
|
||||
// verify what was written to the file
|
||||
for (int i = 1; i <= 8; i++) {
|
||||
assertEquals("téstLine" + i, readLine());
|
||||
assertEquals("téstLine" + i, readLine(encoding));
|
||||
}
|
||||
|
||||
assertEquals("footer", readLine());
|
||||
assertEquals("footer", readLine(encoding));
|
||||
|
||||
// 3 lines were written to the file after restart
|
||||
assertEquals(3, executionContext.getLong(ClassUtils.getShortName(FlatFileItemWriter.class) + ".written"));
|
||||
|
||||
}
|
||||
assertEquals(3, executionContext.getLong(ClassUtils.getShortName(FlatFileItemWriter.class) + ".written"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOpenWithNonWritableFile() throws Exception {
|
||||
|
||||
@@ -60,13 +60,26 @@ public class StaxEventItemWriterTests {
|
||||
|
||||
private JAXBItem jaxbItem = new JAXBItem();
|
||||
|
||||
// test item for writing to output with multi byte character
|
||||
private Object itemMultiByte = new Object() {
|
||||
@Override
|
||||
public String toString() {
|
||||
return ClassUtils.getShortName(StaxEventItemWriter.class) + "-téstStrïng";
|
||||
}
|
||||
};
|
||||
|
||||
private List<? extends Object> items = Collections.singletonList(item);
|
||||
|
||||
private List<? extends Object> itemsMultiByte = Collections.singletonList(itemMultiByte);
|
||||
|
||||
private List<? extends Object> jaxbItems = Collections.singletonList(jaxbItem);
|
||||
|
||||
private static final String TEST_STRING = "<" + ClassUtils.getShortName(StaxEventItemWriter.class)
|
||||
+ "-testString/>";
|
||||
|
||||
private static final String TEST_STRING_MULTI_BYTE = "<" + ClassUtils.getShortName(StaxEventItemWriter.class)
|
||||
+ "-téstStrïng/>";
|
||||
|
||||
private static final String NS_TEST_STRING = "<ns:" + ClassUtils.getShortName(StaxEventItemWriter.class)
|
||||
+ "-testString/>";
|
||||
|
||||
@@ -185,6 +198,68 @@ public class StaxEventItemWriterTests {
|
||||
assertTrue(outputFile.contains("<root>" + TEST_STRING + TEST_STRING + "</root>"));
|
||||
}
|
||||
|
||||
@Test
|
||||
// BATCH-1959
|
||||
public void testTransactionalRestartWithMultiByteCharacterUTF8() throws Exception {
|
||||
testTransactionalRestartWithMultiByteCharacter("UTF-8");
|
||||
}
|
||||
|
||||
@Test
|
||||
// BATCH-1959
|
||||
public void testTransactionalRestartWithMultiByteCharacterUTF16BE() throws Exception {
|
||||
testTransactionalRestartWithMultiByteCharacter("UTF-16BE");
|
||||
}
|
||||
|
||||
private void testTransactionalRestartWithMultiByteCharacter(String encoding) throws Exception {
|
||||
writer.setEncoding(encoding);
|
||||
writer.open(executionContext);
|
||||
|
||||
PlatformTransactionManager transactionManager = new ResourcelessTransactionManager();
|
||||
|
||||
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
|
||||
@Override
|
||||
public Object doInTransaction(TransactionStatus status) {
|
||||
try {
|
||||
// write item
|
||||
writer.write(itemsMultiByte);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new UnexpectedInputException("Could not write data", e);
|
||||
}
|
||||
// get restart data
|
||||
writer.update(executionContext);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
writer.close();
|
||||
|
||||
// create new writer from saved restart data and continue writing
|
||||
writer = createItemWriter();
|
||||
writer.setEncoding(encoding);
|
||||
writer.open(executionContext);
|
||||
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
|
||||
@Override
|
||||
public Object doInTransaction(TransactionStatus status) {
|
||||
try {
|
||||
writer.write(itemsMultiByte);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new UnexpectedInputException("Could not write data", e);
|
||||
}
|
||||
// get restart data
|
||||
writer.update(executionContext);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
writer.close();
|
||||
|
||||
// check the output is concatenation of 'before restart' and 'after
|
||||
// restart' writes.
|
||||
String outputFile = getOutputFileContent(encoding);
|
||||
assertEquals(2, StringUtils.countOccurrencesOf(outputFile, TEST_STRING_MULTI_BYTE));
|
||||
assertTrue(outputFile.contains("<root>" + TEST_STRING_MULTI_BYTE + TEST_STRING_MULTI_BYTE + "</root>"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public void testTransactionalRestartFailOnFirstWrite() throws Exception {
|
||||
@@ -692,11 +767,21 @@ public class StaxEventItemWriterTests {
|
||||
* @return output file content as String
|
||||
*/
|
||||
private String getOutputFileContent() throws IOException {
|
||||
String value = FileUtils.readFileToString(resource.getFile(), null);
|
||||
value = value.replace("<?xml version='1.0' encoding='UTF-8'?>", "");
|
||||
return getOutputFileContent("UTF-8");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param encoding the encoding
|
||||
* @return output file content as String
|
||||
*/
|
||||
private String getOutputFileContent(String encoding) throws IOException {
|
||||
String value = FileUtils.readFileToString(resource.getFile(), encoding);
|
||||
value = value.replace("<?xml version='1.0' encoding='" + encoding + "'?>", "");
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return new instance of fully configured writer
|
||||
*/
|
||||
|
||||
@@ -189,7 +189,7 @@ public class TransactionAwareBufferedWriterTests {
|
||||
@Test
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
// BATCH-1959
|
||||
public void testBufferSizeInTransactionWithMultiByteCharacter() throws Exception {
|
||||
public void testBufferSizeInTransactionWithMultiByteCharacterUTF8() throws Exception {
|
||||
ArgumentCaptor<ByteBuffer> bb = ArgumentCaptor.forClass(ByteBuffer.class);
|
||||
when(fileChannel.write(bb.capture())).thenReturn(5);
|
||||
|
||||
@@ -210,6 +210,32 @@ public class TransactionAwareBufferedWriterTests {
|
||||
assertEquals(0, writer.getBufferSize());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
// BATCH-1959
|
||||
public void testBufferSizeInTransactionWithMultiByteCharacterUTF16BE() throws Exception {
|
||||
writer.setEncoding("UTF-16BE");
|
||||
|
||||
ArgumentCaptor<ByteBuffer> bb = ArgumentCaptor.forClass(ByteBuffer.class);
|
||||
when(fileChannel.write(bb.capture())).thenReturn(6);
|
||||
|
||||
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
|
||||
@Override
|
||||
public Object doInTransaction(TransactionStatus status) {
|
||||
try {
|
||||
writer.write("fóó");
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new IllegalStateException("Unexpected IOException", e);
|
||||
}
|
||||
assertEquals(6, writer.getBufferSize());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals(0, writer.getBufferSize());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public void testWriteWithRollback() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user