def test_process_report_invalid(self):
        """Verifies the conformance validation for a single valid UGC block."""
        invalid_rows = [
            ['XX01', 'YY01'],
            # MW01 must be preceded by 'AS01'
            ['MW01', 'RU01', 'SU03'],
            ['AS02', 'MW01', 'MW01', 'RU01', 'SU03'],
        ]

        for invalid_row in invalid_rows:
            _write_block_to_queue(invalid_row)

            # Step 2: Read block from queue and perform validation.
            dsrf_xsd_file = path.join(
                path.dirname(__file__),
                '../testdata/profile_for_conformance.xsd')
            report_processor = conformance_processor.ConformanceReportProcessor(
                dsrf_xsd_file)
            # Need to set this manually since we're not passing a HEAD block.
            report_processor.profile_name = 'UgcProfile'

            expected_error = (
                'Expected structure:\nSequence (Sequence (Sequence ([Sequence (AS01 '
                'and MW01*) or AS02]+))+ and [RU01 or RU02]* and Sequence (SU03 and '
                'LI01*)*)\nActual structure:')
            try:
                report_processor.process_report()
                raise Exception('Row should be invalid but was not: %r' %
                                invalid_row)
            except error.BlockConformanceFailure as e:
                self.assertIn(expected_error, str(e))
    def test_process_report_valid(self):
        """Verifies the conformance validation for a single valid UGC block."""
        valid_rows = [
            ['AS01', 'MW01', 'RU01', 'SU03', 'LI01', 'LI01', 'LI01'],
            ['AS01', 'MW01', 'RU01', 'SU03', 'LI01', 'LI01'],
            ['AS01', 'MW01', 'RU02', 'SU03', 'LI01', 'LI01', 'LI01'],
            ['AS02'] * 15 + ['RU02'] * 2 + ['SU03'] * 6,
            ['AS01', 'MW01', 'RU01', 'SU03'],
            ['AS01', 'MW01', 'SU03', 'LI01', 'LI01', 'LI01'],
        ]

        for valid_row in valid_rows:
            # Step 1: Write the UGC Block to the "queue".
            _write_block_to_queue(valid_row)

            # Step 2: Read block from queue and perform validation.
            dsrf_xsd_file = path.join(
                path.dirname(__file__),
                '../testdata/profile_for_conformance.xsd')
            report_processor = conformance_processor.ConformanceReportProcessor(
                dsrf_xsd_file)
            # Need to set this manually since we're not passing a HEAD block.
            report_processor.profile_name = 'UgcProfile'

            nr_blocks_validated, nr_rows_validated = report_processor.process_report(
            )

            self.assertEquals(nr_blocks_validated, 1)
            self.assertEquals(nr_rows_validated, len(valid_row))
 def test_conformance_end2end_minoccurs_zero(self):
     """Tests the case where an element in a sequence may be omitted."""
     self._parse_file(
         '../testdata/DSR_TEST2_YouTube_AdSupport-music_2015-Q4_IS_1of1_'
         '20160121T150926.tsv')
     report_processor = conformance_processor.ConformanceReportProcessor(
         UGC_XSD_1_0)
     sys.stdin = open('/tmp/queue.txt', 'rb')
     nr_blocks_validated, nr_rows_validated = report_processor.process_report(
     )
     self.assertEquals(nr_blocks_validated, 4)
     self.assertEquals(nr_rows_validated, 20)
    def test_conformance_end2end(self):
        """Tests the full flow, from tsv parsing to conformance validation."""
        self._parse_file(
            '../testdata/DSR_TEST_YouTube_AdSupport-music_2015-Q4_IS_1of1_'
            '20160121T150926.tsv')
        report_processor = conformance_processor.ConformanceReportProcessor(
            UGC_XSD_1_0)

        sys.stdin = open('/tmp/queue.txt', 'rb')
        nr_blocks_validated, nr_rows_validated = report_processor.process_report(
        )
        self.assertEquals(nr_blocks_validated, 4)
        self.assertEquals(nr_rows_validated, 21)