| Index: tools/telemetry/third_party/gsutilz/third_party/boto/tests/unit/glacier/test_layer2.py
|
| diff --git a/tools/telemetry/third_party/gsutilz/third_party/boto/tests/unit/glacier/test_layer2.py b/tools/telemetry/third_party/gsutilz/third_party/boto/tests/unit/glacier/test_layer2.py
|
| deleted file mode 100644
|
| index 84b53aac774330ea5c0e1827b9946a8cd5448e4d..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/gsutilz/third_party/boto/tests/unit/glacier/test_layer2.py
|
| +++ /dev/null
|
| @@ -1,338 +0,0 @@
|
| -# -*- coding: utf-8 -*-
|
| -# Copyright (c) 2012 Thomas Parslow http://almostobsolete.net/
|
| -#
|
| -# Permission is hereby granted, free of charge, to any person obtaining a
|
| -# copy of this software and associated documentation files (the
|
| -# "Software"), to deal in the Software without restriction, including
|
| -# without limitation the rights to use, copy, modify, merge, publish, dis-
|
| -# tribute, sublicense, and/or sell copies of the Software, and to permit
|
| -# persons to whom the Software is furnished to do so, subject to the fol-
|
| -# lowing conditions:
|
| -#
|
| -# The above copyright notice and this permission notice shall be included
|
| -# in all copies or substantial portions of the Software.
|
| -#
|
| -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
| -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
| -# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
| -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
| -# IN THE SOFTWARE.
|
| -#
|
| -
|
| -from tests.unit import unittest
|
| -
|
| -from mock import call, Mock, patch, sentinel
|
| -
|
| -import codecs
|
| -from boto.glacier.layer1 import Layer1
|
| -from boto.glacier.layer2 import Layer2
|
| -import boto.glacier.vault
|
| -from boto.glacier.vault import Vault
|
| -from boto.glacier.vault import Job
|
| -
|
| -from datetime import datetime, tzinfo, timedelta
|
| -
|
| -# Some fixture data from the Glacier docs
|
| -FIXTURE_VAULT = {
|
| - "CreationDate": "2012-02-20T17:01:45.198Z",
|
| - "LastInventoryDate": "2012-03-20T17:03:43.221Z",
|
| - "NumberOfArchives": 192,
|
| - "SizeInBytes": 78088912,
|
| - "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/examplevault",
|
| - "VaultName": "examplevault"
|
| -}
|
| -
|
| -FIXTURE_VAULTS = {
|
| - 'RequestId': 'vuXO7SHTw-luynJ0Zu31AYjR3TcCn7X25r7ykpuulxY2lv8',
|
| - 'VaultList': [{'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault0',
|
| - 'VaultName': 'vault0', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:38:39.049Z'},
|
| - {'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault3',
|
| - 'VaultName': 'vault3', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:31:18.659Z'}]}
|
| -
|
| -FIXTURE_PAGINATED_VAULTS = {
|
| - 'Marker': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault2',
|
| - 'RequestId': 'vuXO7SHTw-luynJ0Zu31AYjR3TcCn7X25r7ykpuulxY2lv8',
|
| - 'VaultList': [{'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault0',
|
| - 'VaultName': 'vault0', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:38:39.049Z'},
|
| - {'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault1',
|
| - 'VaultName': 'vault1', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:31:18.659Z'}]}
|
| -FIXTURE_PAGINATED_VAULTS_CONT = {
|
| - 'Marker': None,
|
| - 'RequestId': 'vuXO7SHTw-luynJ0Zu31AYjR3TcCn7X25r7ykpuulxY2lv8',
|
| - 'VaultList': [{'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault2',
|
| - 'VaultName': 'vault2', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:38:39.049Z'},
|
| - {'SizeInBytes': 0, 'LastInventoryDate': None,
|
| - 'VaultARN': 'arn:aws:glacier:us-east-1:686406519478:vaults/vault3',
|
| - 'VaultName': 'vault3', 'NumberOfArchives': 0,
|
| - 'CreationDate': '2013-05-17T02:31:18.659Z'}]}
|
| -
|
| -FIXTURE_ARCHIVE_JOB = {
|
| - "Action": "ArchiveRetrieval",
|
| - "ArchiveId": ("NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUs"
|
| - "uhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqr"
|
| - "EXAMPLEArchiveId"),
|
| - "ArchiveSizeInBytes": 16777216,
|
| - "Completed": False,
|
| - "CreationDate": "2012-05-15T17:21:39.339Z",
|
| - "CompletionDate": "2012-05-15T17:21:43.561Z",
|
| - "InventorySizeInBytes": None,
|
| - "JobDescription": "My ArchiveRetrieval Job",
|
| - "JobId": ("HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5v"
|
| - "P54ZShjoQzQVVh7vEXAMPLEjobID"),
|
| - "SHA256TreeHash": ("beb0fe31a1c7ca8c6c04d574ea906e3f97b31fdca7571defb5b44dc"
|
| - "a89b5af60"),
|
| - "SNSTopic": "arn:aws:sns:us-east-1:012345678901:mytopic",
|
| - "StatusCode": "InProgress",
|
| - "StatusMessage": "Operation in progress.",
|
| - "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/examplevault"
|
| -}
|
| -
|
| -EXAMPLE_PART_LIST_RESULT_PAGE_1 = {
|
| - "ArchiveDescription": "archive description 1",
|
| - "CreationDate": "2012-03-20T17:03:43.221Z",
|
| - "Marker": "MfgsKHVjbQ6EldVl72bn3_n5h2TaGZQUO-Qb3B9j3TITf7WajQ",
|
| - "MultipartUploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE",
|
| - "PartSizeInBytes": 4194304,
|
| - "Parts": [{
|
| - "RangeInBytes": "4194304-8388607",
|
| - "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4"
|
| - }],
|
| - "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/demo1-vault"
|
| -}
|
| -
|
| -# The documentation doesn't say whether the non-Parts fields are defined in
|
| -# future pages, so assume they are not.
|
| -EXAMPLE_PART_LIST_RESULT_PAGE_2 = {
|
| - "ArchiveDescription": None,
|
| - "CreationDate": None,
|
| - "Marker": None,
|
| - "MultipartUploadId": None,
|
| - "PartSizeInBytes": None,
|
| - "Parts": [{
|
| - "RangeInBytes": "0-4194303",
|
| - "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4"
|
| - }],
|
| - "VaultARN": None
|
| -}
|
| -
|
| -EXAMPLE_PART_LIST_COMPLETE = {
|
| - "ArchiveDescription": "archive description 1",
|
| - "CreationDate": "2012-03-20T17:03:43.221Z",
|
| - "Marker": None,
|
| - "MultipartUploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE",
|
| - "PartSizeInBytes": 4194304,
|
| - "Parts": [{
|
| - "RangeInBytes": "4194304-8388607",
|
| - "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4"
|
| - }, {
|
| - "RangeInBytes": "0-4194303",
|
| - "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4"
|
| - }],
|
| - "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/demo1-vault"
|
| -}
|
| -
|
| -
|
| -class GlacierLayer2Base(unittest.TestCase):
|
| - def setUp(self):
|
| - self.mock_layer1 = Mock(spec=Layer1)
|
| -
|
| -
|
| -class TestGlacierLayer2Connection(GlacierLayer2Base):
|
| - def setUp(self):
|
| - GlacierLayer2Base.setUp(self)
|
| - self.layer2 = Layer2(layer1=self.mock_layer1)
|
| -
|
| - def test_create_vault(self):
|
| - self.mock_layer1.describe_vault.return_value = FIXTURE_VAULT
|
| - self.layer2.create_vault("My Vault")
|
| - self.mock_layer1.create_vault.assert_called_with("My Vault")
|
| -
|
| - def test_get_vault(self):
|
| - self.mock_layer1.describe_vault.return_value = FIXTURE_VAULT
|
| - vault = self.layer2.get_vault("examplevault")
|
| - self.assertEqual(vault.layer1, self.mock_layer1)
|
| - self.assertEqual(vault.name, "examplevault")
|
| - self.assertEqual(vault.size, 78088912)
|
| - self.assertEqual(vault.number_of_archives, 192)
|
| -
|
| - def test_list_vaults(self):
|
| - self.mock_layer1.list_vaults.return_value = FIXTURE_VAULTS
|
| - vaults = self.layer2.list_vaults()
|
| - self.assertEqual(vaults[0].name, "vault0")
|
| - self.assertEqual(len(vaults), 2)
|
| -
|
| - def test_list_vaults_paginated(self):
|
| - resps = [FIXTURE_PAGINATED_VAULTS, FIXTURE_PAGINATED_VAULTS_CONT]
|
| - def return_paginated_vaults_resp(marker=None, limit=None):
|
| - return resps.pop(0)
|
| -
|
| - self.mock_layer1.list_vaults = Mock(side_effect=return_paginated_vaults_resp)
|
| - vaults = self.layer2.list_vaults()
|
| - self.assertEqual(vaults[0].name, "vault0")
|
| - self.assertEqual(vaults[3].name, "vault3")
|
| - self.assertEqual(len(vaults), 4)
|
| -
|
| -
|
| -class TestVault(GlacierLayer2Base):
|
| - def setUp(self):
|
| - GlacierLayer2Base.setUp(self)
|
| - self.vault = Vault(self.mock_layer1, FIXTURE_VAULT)
|
| -
|
| - # TODO: Tests for the other methods of uploading
|
| -
|
| - def test_create_archive_writer(self):
|
| - self.mock_layer1.initiate_multipart_upload.return_value = {
|
| - "UploadId": "UPLOADID"}
|
| - writer = self.vault.create_archive_writer(description="stuff")
|
| - self.mock_layer1.initiate_multipart_upload.assert_called_with(
|
| - "examplevault", self.vault.DefaultPartSize, "stuff")
|
| - self.assertEqual(writer.vault, self.vault)
|
| - self.assertEqual(writer.upload_id, "UPLOADID")
|
| -
|
| - def test_delete_vault(self):
|
| - self.vault.delete_archive("archive")
|
| - self.mock_layer1.delete_archive.assert_called_with("examplevault",
|
| - "archive")
|
| -
|
| - def test_initiate_job(self):
|
| - class UTC(tzinfo):
|
| - """UTC"""
|
| -
|
| - def utcoffset(self, dt):
|
| - return timedelta(0)
|
| -
|
| - def tzname(self, dt):
|
| - return "Z"
|
| -
|
| - def dst(self, dt):
|
| - return timedelta(0)
|
| -
|
| - self.mock_layer1.initiate_job.return_value = {'JobId': 'job-id'}
|
| - self.vault.retrieve_inventory(start_date=datetime(2014, 0o1, 0o1, tzinfo=UTC()),
|
| - end_date=datetime(2014, 0o1, 0o2, tzinfo=UTC()),
|
| - limit=100)
|
| - self.mock_layer1.initiate_job.assert_called_with(
|
| - 'examplevault', {
|
| - 'Type': 'inventory-retrieval',
|
| - 'InventoryRetrievalParameters': {
|
| - 'StartDate': '2014-01-01T00:00:00Z',
|
| - 'EndDate': '2014-01-02T00:00:00Z',
|
| - 'Limit': 100
|
| - }
|
| - })
|
| -
|
| - def test_get_job(self):
|
| - self.mock_layer1.describe_job.return_value = FIXTURE_ARCHIVE_JOB
|
| - job = self.vault.get_job(
|
| - "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPA"
|
| - "dTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEA"
|
| - "rchiveId")
|
| - self.assertEqual(job.action, "ArchiveRetrieval")
|
| -
|
| - def test_list_jobs(self):
|
| - self.mock_layer1.list_jobs.return_value = {
|
| - "JobList": [FIXTURE_ARCHIVE_JOB]}
|
| - jobs = self.vault.list_jobs(False, "InProgress")
|
| - self.mock_layer1.list_jobs.assert_called_with("examplevault",
|
| - False, "InProgress")
|
| - self.assertEqual(jobs[0].archive_id,
|
| - "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z"
|
| - "8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs0"
|
| - "1MNGntHEQL8MBfGlqrEXAMPLEArchiveId")
|
| -
|
| - def test_list_all_parts_one_page(self):
|
| - self.mock_layer1.list_parts.return_value = (
|
| - dict(EXAMPLE_PART_LIST_COMPLETE)) # take a copy
|
| - parts_result = self.vault.list_all_parts(sentinel.upload_id)
|
| - expected = [call('examplevault', sentinel.upload_id)]
|
| - self.assertEquals(expected, self.mock_layer1.list_parts.call_args_list)
|
| - self.assertEquals(EXAMPLE_PART_LIST_COMPLETE, parts_result)
|
| -
|
| - def test_list_all_parts_two_pages(self):
|
| - self.mock_layer1.list_parts.side_effect = [
|
| - # take copies
|
| - dict(EXAMPLE_PART_LIST_RESULT_PAGE_1),
|
| - dict(EXAMPLE_PART_LIST_RESULT_PAGE_2)
|
| - ]
|
| - parts_result = self.vault.list_all_parts(sentinel.upload_id)
|
| - expected = [call('examplevault', sentinel.upload_id),
|
| - call('examplevault', sentinel.upload_id,
|
| - marker=EXAMPLE_PART_LIST_RESULT_PAGE_1['Marker'])]
|
| - self.assertEquals(expected, self.mock_layer1.list_parts.call_args_list)
|
| - self.assertEquals(EXAMPLE_PART_LIST_COMPLETE, parts_result)
|
| -
|
| - @patch('boto.glacier.vault.resume_file_upload')
|
| - def test_resume_archive_from_file(self, mock_resume_file_upload):
|
| - part_size = 4
|
| - mock_list_parts = Mock()
|
| - mock_list_parts.return_value = {
|
| - 'PartSizeInBytes': part_size,
|
| - 'Parts': [{
|
| - 'RangeInBytes': '0-3',
|
| - 'SHA256TreeHash': '12',
|
| - }, {
|
| - 'RangeInBytes': '4-6',
|
| - 'SHA256TreeHash': '34',
|
| - }],
|
| - }
|
| -
|
| - self.vault.list_all_parts = mock_list_parts
|
| - self.vault.resume_archive_from_file(
|
| - sentinel.upload_id, file_obj=sentinel.file_obj)
|
| - mock_resume_file_upload.assert_called_once_with(
|
| - self.vault, sentinel.upload_id, part_size, sentinel.file_obj,
|
| - {0: codecs.decode('12', 'hex_codec'), 1: codecs.decode('34', 'hex_codec')})
|
| -
|
| -
|
| -class TestJob(GlacierLayer2Base):
|
| - def setUp(self):
|
| - GlacierLayer2Base.setUp(self)
|
| - self.vault = Vault(self.mock_layer1, FIXTURE_VAULT)
|
| - self.job = Job(self.vault, FIXTURE_ARCHIVE_JOB)
|
| -
|
| - def test_get_job_output(self):
|
| - self.mock_layer1.get_job_output.return_value = "TEST_OUTPUT"
|
| - self.job.get_output((0, 100))
|
| - self.mock_layer1.get_job_output.assert_called_with(
|
| - "examplevault",
|
| - "HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP"
|
| - "54ZShjoQzQVVh7vEXAMPLEjobID", (0, 100))
|
| -
|
| -
|
| -class TestRangeStringParsing(unittest.TestCase):
|
| - def test_simple_range(self):
|
| - self.assertEquals(
|
| - Vault._range_string_to_part_index('0-3', 4), 0)
|
| -
|
| - def test_range_one_too_big(self):
|
| - # Off-by-one bug in Amazon's Glacier implementation
|
| - # See: https://forums.aws.amazon.com/thread.jspa?threadID=106866&tstart=0
|
| - # Workaround is to assume that if a (start, end] range appears to be
|
| - # returned then that is what it is.
|
| - self.assertEquals(
|
| - Vault._range_string_to_part_index('0-4', 4), 0)
|
| -
|
| - def test_range_too_big(self):
|
| - self.assertRaises(
|
| - AssertionError, Vault._range_string_to_part_index, '0-5', 4)
|
| -
|
| - def test_range_start_mismatch(self):
|
| - self.assertRaises(
|
| - AssertionError, Vault._range_string_to_part_index, '1-3', 4)
|
| -
|
| - def test_range_end_mismatch(self):
|
| - # End mismatch is OK, since the last part might be short
|
| - self.assertEquals(
|
| - Vault._range_string_to_part_index('0-2', 4), 0)
|
|
|