You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by mb...@apache.org on 2021/03/22 15:25:00 UTC
[daffodil] branch master updated: Add tests for DAF-2486 discr and
DAF-2487 hang bugs
This is an automated email from the ASF dual-hosted git repository.
mbeckerle pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/daffodil.git
The following commit(s) were added to refs/heads/master by this push:
new 78bcc3b Add tests for DAF-2486 discr and DAF-2487 hang bugs
78bcc3b is described below
commit 78bcc3b61ee176bba3bd98878aafba2484035aed
Author: Michael Beckerle <mb...@tresys.com>
AuthorDate: Fri Mar 19 13:10:03 2021 -0600
Add tests for DAF-2486 discr and DAF-2487 hang bugs
Tests include:
A negative test for malformed date in the first row. That works.
A test using terminators, not separators, works
A negative test using terminators, not separators, also detects bad date, even in later rows.
Also added tests to characterize parser hang bug on CSV-like data.
This bug also found playing with CSV.
The problem is related to separated sequences containing an array when minOccurs="0" so that all elements are optional.
When an initial field is empty on a line, the tests hang.
DAFFODIL-2486, DAFFODIL-2487
---
.../section07/discriminators/discriminator2.tdml | 226 ++++++++++++++++
.../sequence_groups/SequenceGroupNestedArray.tdml | 287 +++++++++++++++++++++
.../discriminators/TestDiscriminators.scala | 8 +
.../TestSequenceGroupNestedArray.scala | 47 ++++
4 files changed, 568 insertions(+)
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml
new file mode 100644
index 0000000..14d380d
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<testSuite suiteName="NameDOB"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:fn="http://www.w3.org/2005/xpath-functions"
+ xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+ xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData"
+ xmlns:ex="http://example.com"
+ xmlns:tns="http://example.com"
+ defaultRoundTrip="none">
+
+ <tdml:defineSchema name="s1">
+
+ <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd" />
+
+ <dfdl:format
+ ref="tns:GeneralFormat"
+ representation="text"
+ encoding="ASCII"
+ lengthKind="delimited"
+ separator=""
+ separatorPosition="infix"
+ />
+
+ <!--
+ Schema for simple CSV-like file containing 4 columns, the last of which is a date.
+
+ What makes this non-trivial is use of discriminator after the first column.
+ If we can parse a first column, then the remaining columns MUST be present, and an error
+ in parsing them should be fatal.
+
+ -->
+ <xs:element name="file" dfdl:initiator="last,first,middle,DOB%NL;%WSP*;">
+ <xs:complexType>
+ <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+ <xs:element name="record" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="lastName" type="xs:string"
+ dfdl:terminator=","/>
+ <xs:sequence>
+ <xs:annotation>
+ <xs:appinfo source="http://www.ogf.org/dfdl/">
+ <!--
+ This discriminator should discriminate the closest
+ point of uncertainty, which should be the record array element.
+
+ If we parse the record to this discriminator, then
+ any subsequent error parsing the remaining fields (e.g., such as
+ the date being incorrect format, should fail the whole parse, not
+ just terminate the array.
+ -->
+ <dfdl:discriminator test="{ fn:true() }"/>
+ </xs:appinfo>
+ </xs:annotation>
+ </xs:sequence>
+ <xs:sequence dfdl:separator=",">
+ <xs:element name="firstName" type="xs:string"/>
+ <xs:element name="middleName" type="xs:string"/>
+ <xs:element name="DOB" type="xs:date"
+ dfdl:calendarPattern="MM/dd/yyyy"
+ dfdl:calendarPatternKind="explicit"/>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="file2" dfdl:initiator="last,first,middle,DOB%NL;%WSP*;">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="record" maxOccurs="unbounded" dfdl:terminator="%NL;">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="lastName" type="xs:string"
+ dfdl:terminator=","/>
+ <xs:sequence>
+ <xs:annotation>
+ <xs:appinfo source="http://www.ogf.org/dfdl/">
+ <!--
+ This discriminator should discriminate the closest
+ point of uncertainty, which should be the record array element.
+
+ If we parse the record to this discriminator, then
+ any subsequent error parsing the remaining fields (e.g., such as
+ the date being incorrect format, should fail the whole parse, not
+ just terminate the array.
+ -->
+ <dfdl:discriminator test="{ fn:true() }"/>
+ </xs:appinfo>
+ </xs:annotation>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:element name="firstName" type="xs:string" dfdl:terminator="," />
+ <xs:element name="middleName" type="xs:string" dfdl:terminator=","/>
+ <xs:element name="DOB" type="xs:date"
+ dfdl:calendarPattern="MM/dd/yyyy"
+ dfdl:calendarPatternKind="explicit"/>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <!--
+ This test just illustrates that the above schema does parse well-formed CSV-like data
+ including the final date element.
+ -->
+ <tdml:parserTestCase name="nameDOB_test1" model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,02/19/1986
+]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:file2 xmlns:ex="http://example.com">
+ <record>
+ <lastName>smith</lastName>
+ <firstName>robert</firstName>
+ <middleName>brandon</middleName>
+ <DOB>1988-03-24</DOB>
+ </record>
+ <record>
+ <lastName>johnson</lastName>
+ <firstName>john</firstName>
+ <middleName>henry</middleName>
+ <DOB>1986-01-23</DOB>
+ </record>
+ <record>
+ <lastName>jones</lastName>
+ <firstName>arya</firstName>
+ <middleName>cat</middleName>
+ <DOB>1986-02-19</DOB>
+ </record>
+ </ex:file2>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <!--
+ Shows that the discriminator causes a malformed date in
+ the first row of data to be detected and an error diagnostic about
+ the date field reported.
+ -->
+ <tdml:parserTestCase name="nameDOB_test_bad_date_first_row" root="file"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,1986-02-19
+johnson,john,henry,01/23/1986
+jones,arya,cat,02/19/1986
+]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>xs:date</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <!--
+ This test illustrates that because of the malformed date in the
+ final row of data, the schema should deem the whole file malformed.
+
+ Bug DAFFODIL-2486 reports that the discriminator in the schema
+ for this data does not seem to work.
+
+ There is a problem related to separator suppression which is introducing an
+ additional point of uncertainty, which renders the discriminator ineffective
+ for rows after the first one.
+
+ The test should end with a complaint about the DOB element, which is a date.
+ Until that bug is fixed, this ends with "left over data".
+ Because it backtracks and terminates the record array based on the failure
+ to parse the date.
+ That shouldn't happen because of the discriminator.
+ -->
+ <tdml:parserTestCase name="nameDOB_test_bad_1" root="file"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,1986-02-19
+]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>xs:date</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <!--
+ This test shows that if you model this CSV-like data using
+ only terminators, not separators, then the discriminator works
+ as expected.
+ -->
+ <tdml:parserTestCase name="nameDOB_test_bad_using_terminators" root="file2"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,1986-02-19
+]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>xs:date</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+</testSuite>
\ No newline at end of file
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml
new file mode 100644
index 0000000..5de3f30
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<tdml:testSuite
+ xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:ex="http://example.com"
+ xmlns:tns="http://example.com"
+ defaultRoundTrip="none">
+
+ <tdml:defineSchema name="s1">
+ <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format
+ ref="ex:GeneralFormat"
+ representation="text"
+ encoding="ASCII"
+ lengthKind="delimited"
+ separator=""
+ separatorPosition="infix"
+ />
+
+ <!--
+ A very basic CSV-like data.
+
+ Of note: the item array inside has minOccurs="1"
+ The point is to contrast behavior of this (which seems working)
+ to that of a variant that has minOccurs="0".
+ -->
+ <xs:element name="file">
+ <xs:complexType>
+ <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+ <xs:element name="header" minOccurs="0" maxOccurs="1"
+ dfdl:occursCountKind="implicit">
+ <xs:complexType>
+ <xs:sequence dfdl:separator=",">
+ <xs:element name="title" type="xs:string" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="record" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence dfdl:separator=",">
+ <xs:element name="item" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!--
+ Identical to element file above, excepting that the item array has
+ minOccurs="0", not "1".
+
+ This should allow rows containing things like
+
+ ,a,b,
+
+ To work. Bug DAFFODIL-2487 is that this hangs.
+ -->
+ <xs:element name="file2">
+ <xs:complexType>
+ <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+ <xs:element name="header" minOccurs="0" maxOccurs="1"
+ dfdl:occursCountKind="implicit">
+ <xs:complexType>
+ <xs:sequence dfdl:separator=",">
+ <xs:element name="title" type="xs:string" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="record" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence dfdl:separator=",">
+ <!--
+ Note: This is the difference. This element below has
+ minOccurs="0"
+ -->
+ <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <!--
+ Test shows that with the item array having minOccurs="1"
+ The parse works on this data.
+ Including suppressing trailing separators.
+ It does not suppress leading empty elements that have separators, because one
+ such element is required.
+ -->
+ <tdml:parserTestCase name="csv_nohang_1"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+this line has excess separators,,,,,,,,
+smith,robert,brandon,1988-03-24
+,preceded by an empty field,
+,,preceded by two empty fields,
+notice lines of all commas are not skipped
+,,,,,,,
+notice blank lines are not skipped
+
+johnson,john,henry,1986-01-23
+
+jones,arya,cat,1986-02-19
+
+]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:file xmlns:ex="http://example.com">
+ <ex:header>
+ <ex:title>last</ex:title>
+ <ex:title>first</ex:title>
+ <ex:title>middle</ex:title>
+ <ex:title>DOB</ex:title>
+ </ex:header>
+ <ex:record>
+ <ex:item>this line has excess separators</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>smith</ex:item>
+ <ex:item>robert</ex:item>
+ <ex:item>brandon</ex:item>
+ <ex:item>1988-03-24</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item><!-- Notice 1 empty field here -->
+ <ex:item>preceded by an empty field</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item><!-- Notice 1 (not 2) empty field here -->
+ <ex:item>preceded by two empty fields</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>notice lines of all commas are not skipped</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>notice blank lines are not skipped</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>johnson</ex:item>
+ <ex:item>john</ex:item>
+ <ex:item>henry</ex:item>
+ <ex:item>1986-01-23</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>jones</ex:item>
+ <ex:item>arya</ex:item>
+ <ex:item>cat</ex:item>
+ <ex:item>1986-02-19</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item></ex:item>
+ </ex:record>
+ </ex:file>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <!--
+ Test shows that if we just change minOccurs on the item array to 0
+ then the test hangs.
+ -->
+ <tdml:parserTestCase name="csv_hang_1"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+,,preceded by two empty fields,
+notice lines of all commas are skipped
+,,,,,,,
+notice blank lines are skipped
+
+]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:file2 xmlns:ex="http://example.com">
+ <ex:header>
+ <ex:title>last</ex:title>
+ <ex:title>first</ex:title>
+ <ex:title>middle</ex:title>
+ <ex:title>DOB</ex:title>
+ </ex:header>
+ <ex:record>
+ <ex:item>preceded by an empty field</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>preceded by two empty fields</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>notice lines of all commas are skipped</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>notice blank lines are skipped</ex:item>
+ </ex:record>
+ </ex:file2>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <!--
+ Test shows that if we just change minOccurs on the item array to 0
+ then the test hangs.
+ -->
+ <tdml:parserTestCase name="csv_hang_2"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+,,preceded by two empty fields,
+]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:file2 xmlns:ex="http://example.com">
+ <ex:header>
+ <ex:title>last</ex:title>
+ <ex:title>first</ex:title>
+ <ex:title>middle</ex:title>
+ <ex:title>DOB</ex:title>
+ </ex:header>
+ <ex:record>
+ <ex:item>preceded by an empty field</ex:item>
+ </ex:record>
+ <ex:record>
+ <ex:item>preceded by two empty fields</ex:item>
+ </ex:record>
+ </ex:file2>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <!--
+Test shows that if we just change minOccurs on the item array to 0
+then the test hangs.
+-->
+ <tdml:parserTestCase name="csv_hang_3"
+ model="s1">
+ <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:file2 xmlns:ex="http://example.com">
+ <ex:header>
+ <ex:title>last</ex:title>
+ <ex:title>first</ex:title>
+ <ex:title>middle</ex:title>
+ <ex:title>DOB</ex:title>
+ </ex:header>
+ <ex:record>
+ <ex:item>preceded by an empty field</ex:item>
+ </ex:record>
+ </ex:file2>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+
+</tdml:testSuite>
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
index c19f503..9d6598f 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
@@ -25,6 +25,7 @@ object TestDiscriminators {
val testDir = "/org/apache/daffodil/section07/discriminators/"
val runner = Runner(testDir, "discriminator.tdml")
val runner2 = Runner(testDir, "multipleDiscriminators.tdml")
+ val runner3 = Runner(testDir, "discriminator2.tdml")
@AfterClass def shutDown(): Unit = {
runner.reset
@@ -83,4 +84,11 @@ class TestDiscriminators {
@Test def test_discrimPlacementSDW(): Unit = { runner.runOneTest("discrimPlacementSDW") }
@Test def test_assertPlacementSDW(): Unit = { runner.runOneTest("assertPlacementSDW") }
+ @Test def test_nameDOB_test1(): Unit = { runner3.runOneTest("nameDOB_test1") }
+ @Test def test_nameDOB_test_bad_date_first_row(): Unit = { runner3.runOneTest("nameDOB_test_bad_date_first_row") }
+
+ // DAFFODIL-2486 - discriminator bug - interaction with separators
+ // @Test def test_nameDOB_test_bad_1(): Unit = { runner3.runOneTest("nameDOB_test_bad_1") }
+
+ @Test def test_nameDOB_test_bad_using_terminators(): Unit = { runner3.runOneTest("nameDOB_test_bad_using_terminators") }
}
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala
new file mode 100644
index 0000000..7271d8e
--- /dev/null
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.daffodil.section14.sequence_groups
+
+import org.junit.Test
+import org.apache.daffodil.tdml.Runner
+import org.junit.AfterClass
+
+object TestSequenceGroupNestedArray {
+
+ val testDir_01 = "/org/apache/daffodil/section14/sequence_groups/"
+
+ val runner = Runner(testDir_01, "SequenceGroupNestedArray.tdml")
+
+ @AfterClass def shutDown: Unit = {
+ runner.reset
+ }
+
+}
+
+class TestSequenceGroupNestedArray {
+
+ import TestSequenceGroupNestedArray._
+
+ @Test def test_csv_nohang_1(): Unit = { runner.runOneTest("csv_nohang_1") }
+ // DAFFODIL-2487 hang when minOccurs="0"
+ // @Test def test_csv_hang_1(): Unit = { runner.runOneTest("csv_hang_1") }
+ // @Test def test_csv_hang_2(): Unit = { runner.runOneTest("csv_hang_2") }
+ // @Test def test_csv_hang_3(): Unit = { runner.runOneTest("csv_hang_3") }
+
+
+}