def test_get_blocks_insufficient_data_partial_block_null_data(self):

        counts = [
            2, 5, 10
        ]

        bytes_remainder = 1024

        for count in counts:
            reader = make_reader((((count - 1) * 1024 * 1024)
                                 + bytes_remainder),
                                 null_data=True)

            splitter = UniformSplitter(self.project_id,
                                       self.vault_id,
                                       reader)
            self.assertEqual(splitter.chunk_size,
                             (1024 * 1024))

            running_offset = 0
            blocks = splitter.get_blocks(count)
            self.assertIsInstance(blocks, list)
            self.assertEqual(count, len(blocks))
            for offset, block in blocks:
                self.assertIsInstance(block, api.Block)
                self.assertEqual(offset, running_offset)
                running_offset = running_offset + splitter.chunk_size
                # one block will be bytes_remainder bytes, the rest
                # will be chunk_size bytes
                if len(block) == bytes_remainder:
                    pass
                else:
                    self.assertEqual(splitter.chunk_size,
                                     len(block))
    def test_get_blocks_insufficient_null_data(self):

        counts = [
            2, 5, 10
        ]

        for count in counts:
            reader = make_reader((count - 1) * 1024 * 1024,
                                 null_data=True)

            splitter = UniformSplitter(self.project_id,
                                       self.vault_id,
                                       reader)
            self.assertEqual(splitter.chunk_size,
                             (1024 * 1024))

            running_offset = 0
            blocks = splitter.get_blocks(count)
            self.assertIsInstance(blocks, list)
            self.assertEqual((count - 1), len(blocks))
            for offset, block in blocks:
                self.assertIsInstance(block, api.Block)
                self.assertEqual(splitter.chunk_size,
                                 len(block))
                self.assertEqual(offset, running_offset)
                running_offset = running_offset + splitter.chunk_size
    def test_set_invalid_state(self):
        reader = make_reader(1)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)

        with self.assertRaises(errors.ParameterConstraintError):
            splitter._set_state('bad state')
    def test_make_block(self):
        reader = make_reader(10 * 1024 * 1024)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)
        d = os.urandom(100)
        block = splitter._make_block(d)
        self.assertIsInstance(block, api.Block)
        self.assertEqual(len(d), len(block))
    def test_get_block_fail(self):
        reader = make_reader(0)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)

        offset, block = splitter.get_block()
        self.assertEqual(offset, 0)
        self.assertIsNone(block)
    def test_set_reader_no_read(self):
        class X(object):
            def tell():
                pass

        reader = make_reader(1)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)

        with self.assertRaises(AttributeError):
            splitter.input_stream = X()
    def test_get_block(self):
        reader = make_reader(10 * 1024 * 1024)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)

        running_offset = 0
        for _ in range(2):
            offset, block = splitter.get_block()
            self.assertEqual(offset, running_offset)
            self.assertIsInstance(block, api.Block)
            self.assertEqual(splitter.chunk_size, len(block))
            running_offset = running_offset + splitter.chunk_size
    def test_configure_failed(self):
        reader = make_reader(100)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)
        self.assertEqual(1024 * 1024, splitter.chunk_size)

        config = {
            'NonUniformSplitter': {
                'non_chunk_size': 1024
            }
        }
        splitter.configure(config)
        self.assertEqual(1024 * 1024, splitter.chunk_size)
    def test_configure(self):
        reader = make_reader(100)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)
        self.assertEqual(1024 * 1024, splitter.chunk_size)

        config = {
            'UniformSplitter': {
                'chunk_size': 5
            }
        }
        splitter.configure(config)
        self.assertEqual(config['UniformSplitter']['chunk_size'],
                         splitter.chunk_size)
    def test_set_reader(self):
        reader = make_reader(1)

        splitter = UniformSplitter(self.project_id,
                                   self.vault_id,
                                   reader)

        self.assertEqual(reader, splitter.input_stream)

        new_reader = make_reader(2)
        splitter.input_stream = new_reader

        self.assertEqual(new_reader, splitter.input_stream)

        splitter._set_state('processing')

        with self.assertRaises(RuntimeError):
            splitter.input_stream = reader