| 
18 | 18 |  */  | 
19 | 19 | package org.apache.maven.plugins.surefire.report;  | 
20 | 20 | 
 
  | 
21 |  | -import java.io.ByteArrayInputStream;  | 
22 |  | -import java.io.File;  | 
23 |  | -import java.io.InputStream;  | 
24 |  | -import java.io.InputStreamReader;  | 
 | 21 | +import java.io.*;  | 
 | 22 | +import java.nio.file.Files;  | 
 | 23 | +import java.nio.file.Path;  | 
25 | 24 | import java.util.ArrayList;  | 
26 | 25 | import java.util.Collection;  | 
27 | 26 | import java.util.List;  | 
@@ -632,4 +631,81 @@ public void shouldTestIsNumeric() {  | 
632 | 631 |         assertTrue(TestSuiteXmlParser.isNumeric(new StringBuilder("0?51M2"), 2, 4));  | 
633 | 632 |         assertFalse(TestSuiteXmlParser.isNumeric(new StringBuilder("0?51M2"), 2, 5));  | 
634 | 633 |     }  | 
 | 634 | + | 
 | 635 | +    @Test  | 
 | 636 | +    public void shouldParseLargeFile() throws Exception {  | 
 | 637 | +        // Create test file  | 
 | 638 | +        Path tempFile = Files.createTempFile("largeReport", ".xml");  | 
 | 639 | + | 
 | 640 | +        try (BufferedWriter w = Files.newBufferedWriter(tempFile)) {  | 
 | 641 | +            w.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"  | 
 | 642 | +                    + "<testsuite failures=\"1\" time=\"2.413\" errors=\"0\" skipped=\"0\" tests=\"2\" name=\"largeFile.TestSurefire3\">\n"  | 
 | 643 | +                    + "  <properties></properties>\n"  | 
 | 644 | +                    + "  <testcase time=\"0.005\" classname=\"largeFile.TestSurefire3\" name=\"testSuccess\" />\n"  | 
 | 645 | +                    + "  <testcase time=\"2.20\" classname=\"largeFile.TestSurefire3\" name=\"testFailure\">\n"  | 
 | 646 | +                    + "    <failure message=\"test failure\" type=\"junit.framework.AssertionFailedError\">junit.framework.AssertionFailedError:  \n"  | 
 | 647 | +                    + "\tat junit.framework.Assert.fail(Assert.java:47)\n"  | 
 | 648 | +                    + "\tat largeFile.TestSurefire3.testFailure(TestSurefire3.java:40)\n"  | 
 | 649 | +                    + "</failure>\n"  | 
 | 650 | +                    + "    <system-err><![CDATA[\n");  | 
 | 651 | + | 
 | 652 | +            // Adding CDATA which should be ignored during parsing and not cause memory issues  | 
 | 653 | +            for (int i = 0; i < 100000; i++) {  | 
 | 654 | +                w.write(  | 
 | 655 | +                        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n");  | 
 | 656 | +                w.flush();  | 
 | 657 | +            }  | 
 | 658 | +            w.write("]]></system-err>\n" + "  </testcase>\n" + "</testsuite>\n");  | 
 | 659 | +            w.flush();  | 
 | 660 | +        }  | 
 | 661 | + | 
 | 662 | +        System.err.println(Files.size(tempFile));  | 
 | 663 | + | 
 | 664 | +        // Parse test file  | 
 | 665 | +        TestSuiteXmlParser testSuiteXmlParser = new TestSuiteXmlParser(consoleLogger);  | 
 | 666 | + | 
 | 667 | +        try (InputStreamReader is = new InputStreamReader(Files.newInputStream(tempFile), UTF_8)) {  | 
 | 668 | +            List<ReportTestSuite> parse = testSuiteXmlParser.parse(is);  | 
 | 669 | + | 
 | 670 | +            assertThat(parse.size(), is(1));  | 
 | 671 | +            ReportTestSuite report = parse.get(0);  | 
 | 672 | +            assertThat(report.getFullClassName(), is("largeFile.TestSurefire3"));  | 
 | 673 | +            assertThat(report.getName(), is("TestSurefire3"));  | 
 | 674 | +            assertThat(report.getPackageName(), is("largeFile"));  | 
 | 675 | +            assertThat(report.getNumberOfTests(), is(2));  | 
 | 676 | +            assertThat(report.getNumberOfSkipped(), is(0));  | 
 | 677 | +            assertThat(report.getNumberOfErrors(), is(0));  | 
 | 678 | +            assertThat(report.getNumberOfFailures(), is(1));  | 
 | 679 | +            assertThat(report.getNumberOfFlakes(), is(0));  | 
 | 680 | +            assertThat(report.getTimeElapsed(), is(2.413f));  | 
 | 681 | +            assertThat(report.getTestCases().size(), is(2));  | 
 | 682 | + | 
 | 683 | +            List<ReportTestCase> tests = report.getTestCases();  | 
 | 684 | +            assertThat(tests.get(0).getFullClassName(), is("largeFile.TestSurefire3"));  | 
 | 685 | +            assertThat(tests.get(0).getName(), is("testSuccess"));  | 
 | 686 | +            assertNull(tests.get(0).getFailureDetail());  | 
 | 687 | +            assertThat(tests.get(0).getClassName(), is("TestSurefire3"));  | 
 | 688 | +            assertThat(tests.get(0).getTime(), is(0.005f));  | 
 | 689 | +            assertThat(tests.get(0).getFullName(), is("largeFile.TestSurefire3.testSuccess"));  | 
 | 690 | +            assertThat(tests.get(0).hasError(), is(false));  | 
 | 691 | + | 
 | 692 | +            assertThat(tests.get(1).getFullClassName(), is("largeFile.TestSurefire3"));  | 
 | 693 | +            assertThat(tests.get(1).getName(), is("testFailure"));  | 
 | 694 | +            assertThat(  | 
 | 695 | +                    tests.get(1).getFailureDetail(),  | 
 | 696 | +                    is("junit.framework.AssertionFailedError:  \n"  | 
 | 697 | +                            + "\tat junit.framework.Assert.fail(Assert.java:47)\n"  | 
 | 698 | +                            + "\tat largeFile.TestSurefire3.testFailure(TestSurefire3.java:40)\n"));  | 
 | 699 | +            assertThat(tests.get(1).getClassName(), is("TestSurefire3"));  | 
 | 700 | +            assertThat(tests.get(1).getTime(), is(2.20f));  | 
 | 701 | +            assertThat(tests.get(1).getFailureErrorLine(), is("40"));  | 
 | 702 | +            assertThat(tests.get(1).getFailureMessage(), is("test failure"));  | 
 | 703 | +            assertThat(tests.get(1).getFullName(), is("largeFile.TestSurefire3.testFailure"));  | 
 | 704 | +            assertThat(tests.get(1).getFailureType(), is("junit.framework.AssertionFailedError"));  | 
 | 705 | +            assertThat(tests.get(1).hasError(), is(false));  | 
 | 706 | +        }  | 
 | 707 | + | 
 | 708 | +        // Delete test file  | 
 | 709 | +        Files.delete(tempFile);  | 
 | 710 | +    }  | 
635 | 711 | }  | 
0 commit comments