Revision b4e29772

b/kamaki/clients/test/pithos.py
119 119
        x_object_hash="0afdf29f71cd53126225c3f54ca",
120 120
        x_object_version=17737,
121 121
        x_object_modified_by=user_id)]
122
object_hashmap = dict(
123
    block_hash="sha256", block_size=4194304, bytes=33554432,
124
    hashes=[
125
        "4988438cc1c0292c085d289649b28cf547ba3db71c6efaac9f2df7e193d4d0af",
126
        "b214244aa56df7d1df7c6cac066e7cef268d9c2beb4dcf7ce68af667b0626f91",
127
        "17f365f25e0682565ded30576066bb13377a3d306967e4d74e06bb6bbc20f75f",
128
        "2524ae208932669fff89adf8a2fc0df3b67736ca0d3aadce7a2ce640f142af37",
129
        "5d807a2129d2fcd3c221c3da418ed52af3fc48d0817b62e0bb437acffccd3514",
130
        "609de22ce842d997f645fc49d5f14e0e3766dd51a6cbe66383b2bab82c8dfcd0",
131
        "3102851ac168c78be70e35ff5178c7b1ebebd589e5106d565ca1094d1ca8ff59",
132
        "bfe306dd24e92a8d85caf7055643f250fd319e8c4cdd4755ddabbf3ff97e83c7"])
122 133

  
123 134

  
124 135
class Pithos(TestCase):
......
167 178
        self.FR.headers = dict()
168 179
        self.FR.status_code = 200
169 180
        self.FR.json = dict()
181
        self.FR.content = self.FR.json
170 182
        for f in self.files:
171 183
            f.close()
172 184

  
......
614 626
            expected.update(kwargs)
615 627
            expected['permissions'] = expected.pop('sharing')
616 628
            self.assertEqual(put.mock_calls[-1], call(obj, **expected))
629

  
630
    def test_download_object(self):
631
        PC.get_object_hashmap = Mock(return_value=object_hashmap)
632
        tmpFile = self._create_temp_file()
633
        self.FR.content = tmpFile.read(4 * 1024 * 1024)
634
        tmpFile = self._create_temp_file()
635
        PC.object_get = Mock(return_value=self.FR())
636
        GET = PC.object_get
637
        obj = 'obj3c7N4m3'
638
        num_of_blocks = len(object_hashmap['hashes'])
639

  
640
        kwargs = dict(
641
            version='version',
642
            resume=True,
643
            range_str='10-20',
644
            if_match='if and only if',
645
            if_none_match='if and only not',
646
            if_modified_since='what if not?',
647
            if_unmodified_since='this happens if not!',
648
            async_headers=dict(Range='bytes=0-88888888'))
649

  
650
        self.client.download_object(obj, tmpFile)
651
        self.assertEqual(len(GET.mock_calls), num_of_blocks)
652
        self.assertEqual(GET.mock_calls[-1][1], (obj,))
653
        for k, v in kwargs.items():
654
            if k == 'async_headers':
655
                self.assertTrue('Range' in GET.mock_calls[-1][2][k])
656
            elif k in ('resume', 'range_str'):
657
                continue
658
            else:
659
                self.assertEqual(GET.mock_calls[-1][2][k], None)
660

  
661
        #  Check ranges are consecutive
662
        starts = []
663
        ends = []
664
        for c in GET.mock_calls:
665
            rng_str = c[2]['async_headers']['Range']
666
            (start, rng_str) = rng_str.split('=')
667
            (start, end) = rng_str.split('-')
668
            starts.append(start)
669
            ends.append(end)
670
        ends = sorted(ends)
671
        for i, start in enumerate(sorted(starts)):
672
            if i:
673
                int(ends[i - 1]) == int(start) - 1
674

  
675
        #  With progress bars
676
        try:
677
            from progress.bar import ShadyBar
678
            dl_bar = ShadyBar('Mock dl')
679
        except ImportError:
680
            dl_bar = None
681

  
682
        if dl_bar:
683

  
684
            def blck_gen(n):
685
                for i in dl_bar.iter(range(n)):
686
                    yield
687
                yield
688

  
689
            tmpFile.seek(0)
690
            self.client.download_object(obj, tmpFile, download_cb=blck_gen)
691
            self.assertEqual(len(GET.mock_calls), 2 * num_of_blocks)
692

  
693
        tmpFile.seek(0)
694
        kwargs.pop('async_headers')
695
        kwargs.pop('resume')
696
        self.client.download_object(obj, tmpFile, **kwargs)
697
        for k, v in kwargs.items():
698
            if k == 'range_str':
699
                self.assertEqual(
700
                    GET.mock_calls[-1][2]['data_range'],
701
                    'bytes=%s' % v)
702
            else:
703
                self.assertEqual(GET.mock_calls[-1][2][k], v)
704

  
705
        #  ALl options on no tty
706

  
707
        def foo():
708
            return True
709

  
710
        tmpFile.seek(0)
711
        tmpFile.isatty = foo
712
        self.client.download_object(obj, tmpFile, **kwargs)
713
        for k, v in kwargs.items():
714
            if k == 'range_str':
715
                self.assertTrue('data_range' in GET.mock_calls[-1][2])
716
            else:
717
                self.assertEqual(GET.mock_calls[-1][2][k], v)

Also available in: Unified diff