def test_generate_xferspec_download_invalid(patched_azure_request): args = MagicMock() args.storageaccount = "blobep" args.container = "container" args.storageaccountkey = "saskey" args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() with requests_mock.mock() as m: m.head("mock://blobepcontainer/blob?saskey", headers={"content-length": "-1", "content-md5": "md5"}) sbs = blobxfer.SasBlobService("mock://blobep", "saskey", None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, "tmppath", "blob", None, None, True)
def test_generate_xferspec_download(tmpdir): lpath = str(tmpdir.join('test.tmp')) args = MagicMock() args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() session = requests.Session() adapter = requests_mock.Adapter() session.mount('mock', adapter) with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5' }) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', None, None, True) m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': 'md5' }) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, True) assert 6 == cl assert 2 == nsops assert 'md5' == md5 assert None != fd fd.close() cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, False) assert None == fd with open(lpath, 'wt') as f: f.write('012345') m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': '1qmpM8iq/FHlWsBmK25NSg==' }) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, True) assert cl is None
def test_generate_xferspec_download_invalid(patched_azure_request): args = MagicMock() args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5'}) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, 'tmppath', 'blob', None, None, True)
def test_generate_xferspec_download_invalid(patched_azure_request): args = MagicMock() args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5'}) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, 'tmppath', 'blob', None, None, True)
def test_generate_xferspec_download(tmpdir): lpath = str(tmpdir.join("test.tmp")) args = MagicMock() args.storageaccount = "blobep" args.container = "container" args.storageaccountkey = "saskey" args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() session = requests.Session() adapter = requests_mock.Adapter() session.mount("mock", adapter) with requests_mock.mock() as m: m.head("mock://blobepcontainer/blob?saskey", headers={"content-length": "-1", "content-md5": "md5"}) sbs = blobxfer.SasBlobService("mock://blobep", "saskey", None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, "blob", None, None, True) m.head("mock://blobepcontainer/blob?saskey", headers={"content-length": "6", "content-md5": "md5"}) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, "blob", None, None, True ) assert 6 == cl assert 2 == nsops assert "md5" == md5 assert None != fd fd.close() cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, "blob", None, None, False ) assert None == fd with open(lpath, "wt") as f: f.write("012345") m.head( "mock://blobepcontainer/blob?saskey", headers={"content-length": "6", "content-md5": "1qmpM8iq/FHlWsBmK25NSg=="}, ) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, "blob", None, None, True ) assert cl is None
def test_generate_xferspec_download(tmpdir): lpath = str(tmpdir.join('test.tmp')) args = MagicMock() args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.Queue() session = requests.Session() adapter = requests_mock.Adapter() session.mount('mock', adapter) with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5'}) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, True) m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': 'md5'}) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, True) assert 6 == cl assert 2 == nsops assert 'md5' == md5 assert None != fd fd.close() cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, False) assert None == fd with open(lpath, 'wt') as f: f.write('012345') m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': '1qmpM8iq/FHlWsBmK25NSg=='}) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', None, None, True) assert cl is None
def test_generate_xferspec_download(tmpdir): lpath = str(tmpdir.join('test.tmp')) args = MagicMock() args.rsakey = None args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.PriorityQueue() session = requests.Session() adapter = requests_mock.Adapter() session.mount('mock', adapter) with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5'}) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert sa_in_queue.qsize() == 0 m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': 'md5'}) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert sa_in_queue.qsize() == 2 assert 2 == nsops assert 6 == cl assert 2 == nsops assert 'md5' == md5 assert fd is not None fd.close() cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) assert 2 == nsops assert fd is None assert sa_in_queue.qsize() == 4 with open(lpath, 'wt') as f: f.write('012345') m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': '1qmpM8iq/FHlWsBmK25NSg=='}) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert nsops is None assert cl is None assert sa_in_queue.qsize() == 4 sa_in_queue = queue.PriorityQueue() args.rsaprivatekey = _RSAKEY args.rsapublickey = None symkey, signkey = blobxfer.generate_aes256_keys() args.encmode = blobxfer._ENCRYPTION_MODE_CHUNKEDBLOB metajson = blobxfer.EncryptionMetadataJson( args, symkey, signkey, iv=b'0', encdata_signature=b'0', preencrypted_md5=None) encmeta = metajson.construct_metadata_json() goodencjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) goodauthjson = json.loads( encmeta[blobxfer._ENCRYPTION_METADATA_AUTH_NAME]) metajson2 = blobxfer.EncryptionMetadataJson( args, None, None, None, None, None) metajson2.parse_metadata_json( 'blob', args.rsaprivatekey, args.rsapublickey, encmeta) assert metajson2.symkey == symkey assert metajson2.signkey == signkey assert metajson2.encmode == args.encmode assert metajson2.chunksizebytes == args.chunksizebytes + \ blobxfer._AES256CBC_HMACSHA256_OVERHEAD_BYTES + 1 encjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) encjson[blobxfer._ENCRYPTION_METADATA_LAYOUT][ blobxfer._ENCRYPTION_METADATA_CHUNKSTRUCTURE] = 'X' headers = { 'content-length': '64', 'content-md5': 'md5', 'x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME: json.dumps(encjson), 'x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME: json.dumps(goodauthjson), } m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) # switch to full blob mode tests args.encmode = blobxfer._ENCRYPTION_MODE_FULLBLOB metajson = blobxfer.EncryptionMetadataJson( args, symkey, signkey, iv=b'0', encdata_signature=b'0', preencrypted_md5=None) encmeta = metajson.construct_metadata_json() goodencjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) goodauthjson = json.loads( encmeta[blobxfer._ENCRYPTION_METADATA_AUTH_NAME]) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(goodauthjson) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_AGENT][ blobxfer._ENCRYPTION_METADATA_PROTOCOL] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_AGENT][ blobxfer._ENCRYPTION_METADATA_ENCRYPTION_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_INTEGRITY_AUTH][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_WRAPPEDCONTENTKEY][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson.pop(blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH, None) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH].pop( blobxfer._ENCRYPTION_METADATA_AUTH_ENCODING, None) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH][ blobxfer._ENCRYPTION_METADATA_MAC] = blobxfer.base64encode(b'X') headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) args.chunksizebytes = 5 metajson.chunksizebytes = args.chunksizebytes metajson.md5 = headers['content-md5'] args.encmode = blobxfer._ENCRYPTION_MODE_FULLBLOB encjson = copy.deepcopy(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(goodauthjson) hcl = int(headers['content-length']) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [hcl, headers['content-md5'], metajson]) assert hcl == cl calcops = hcl // args.chunksizebytes hclmod = hcl % args.chunksizebytes if hclmod > 0: calcops += 1 assert calcops == nsops assert headers['content-md5'] == md5 assert fd is None assert sa_in_queue.qsize() == nsops data = sa_in_queue.get() assert data is not None
def test_generate_xferspec_download(tmpdir): lpath = str(tmpdir.join('test.tmp')) args = MagicMock() args.rsakey = None args.storageaccount = 'blobep' args.container = 'container' args.storageaccountkey = 'saskey' args.chunksizebytes = 5 args.timeout = None sa_in_queue = queue.PriorityQueue() session = requests.Session() adapter = requests_mock.Adapter() session.mount('mock', adapter) with requests_mock.mock() as m: m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '-1', 'content-md5': 'md5' }) sbs = blobxfer.SasBlobService('mock://blobep', 'saskey', None) with pytest.raises(ValueError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert sa_in_queue.qsize() == 0 m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': 'md5' }) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert sa_in_queue.qsize() == 2 assert 2 == nsops assert 6 == cl assert 2 == nsops assert 'md5' == md5 assert fd is not None fd.close() cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) assert 2 == nsops assert fd is None assert sa_in_queue.qsize() == 4 with open(lpath, 'wt') as f: f.write('012345') m.head('mock://blobepcontainer/blob?saskey', headers={ 'content-length': '6', 'content-md5': '1qmpM8iq/FHlWsBmK25NSg==' }) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', True, [None, None, None]) assert nsops is None assert cl is None assert sa_in_queue.qsize() == 4 sa_in_queue = queue.PriorityQueue() args.rsaprivatekey = _RSAKEY args.rsapublickey = None symkey, signkey = blobxfer.generate_aes256_keys() args.encmode = blobxfer._ENCRYPTION_MODE_CHUNKEDBLOB metajson = blobxfer.EncryptionMetadataJson(args, symkey, signkey, iv=b'0', encdata_signature=b'0', preencrypted_md5=None) encmeta = metajson.construct_metadata_json() goodencjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) goodauthjson = json.loads( encmeta[blobxfer._ENCRYPTION_METADATA_AUTH_NAME]) metajson2 = blobxfer.EncryptionMetadataJson(args, None, None, None, None, None) metajson2.parse_metadata_json('blob', args.rsaprivatekey, args.rsapublickey, encmeta) assert metajson2.symkey == symkey assert metajson2.signkey == signkey assert metajson2.encmode == args.encmode assert metajson2.chunksizebytes == args.chunksizebytes + \ blobxfer._AES256CBC_HMACSHA256_OVERHEAD_BYTES + 1 encjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) encjson[blobxfer._ENCRYPTION_METADATA_LAYOUT][ blobxfer._ENCRYPTION_METADATA_CHUNKSTRUCTURE] = 'X' headers = { 'content-length': '64', 'content-md5': 'md5', 'x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME: json.dumps(encjson), 'x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME: json.dumps(goodauthjson), } m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) # switch to full blob mode tests args.encmode = blobxfer._ENCRYPTION_MODE_FULLBLOB metajson = blobxfer.EncryptionMetadataJson(args, symkey, signkey, iv=b'0', encdata_signature=b'0', preencrypted_md5=None) encmeta = metajson.construct_metadata_json() goodencjson = json.loads(encmeta[blobxfer._ENCRYPTION_METADATA_NAME]) goodauthjson = json.loads( encmeta[blobxfer._ENCRYPTION_METADATA_AUTH_NAME]) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(goodauthjson) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_AGENT][ blobxfer._ENCRYPTION_METADATA_PROTOCOL] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_AGENT][ blobxfer._ENCRYPTION_METADATA_ENCRYPTION_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_INTEGRITY_AUTH][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) encjson = copy.deepcopy(goodencjson) encjson[blobxfer._ENCRYPTION_METADATA_WRAPPEDCONTENTKEY][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson.pop(blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH, None) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH].pop( blobxfer._ENCRYPTION_METADATA_AUTH_ENCODING, None) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH][ blobxfer._ENCRYPTION_METADATA_ALGORITHM] = 'X' headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) authjson = copy.deepcopy(goodauthjson) authjson[blobxfer._ENCRYPTION_METADATA_AUTH_METAAUTH][ blobxfer._ENCRYPTION_METADATA_MAC] = blobxfer.base64encode(b'X') headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(authjson) m.head('mock://blobepcontainer/blob?saskey', headers=headers) with pytest.raises(RuntimeError): blobxfer.generate_xferspec_download(sbs, args, sa_in_queue, lpath, 'blob', False, [None, None, None]) args.chunksizebytes = 5 metajson.chunksizebytes = args.chunksizebytes metajson.md5 = headers['content-md5'] args.encmode = blobxfer._ENCRYPTION_MODE_FULLBLOB encjson = copy.deepcopy(goodencjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_NAME] = \ json.dumps(encjson) headers['x-ms-meta-' + blobxfer._ENCRYPTION_METADATA_AUTH_NAME] = \ json.dumps(goodauthjson) hcl = int(headers['content-length']) cl, nsops, md5, fd = blobxfer.generate_xferspec_download( sbs, args, sa_in_queue, lpath, 'blob', False, [hcl, headers['content-md5'], metajson]) assert hcl == cl calcops = hcl // args.chunksizebytes hclmod = hcl % args.chunksizebytes if hclmod > 0: calcops += 1 assert calcops == nsops assert headers['content-md5'] == md5 assert fd is None assert sa_in_queue.qsize() == nsops data = sa_in_queue.get() assert data is not None