bed6bbd5ef
My understanding is that it was mainly being used so we could have sane testing on py26. With py26 support being dropped, we no longer need it. Also drop discover from test-requirements.txt, as we don't seem to actually use it. Change-Id: Iee04c42890596d3b483c1473169480a3ae19aac8 Related-Change: I37116731db11449d0c374a6a83a3a43789a19d5f
250 lines
8.3 KiB
Python
250 lines
8.3 KiB
Python
# Copyright (c) 2010-2013 OpenStack, LLC.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import mock
|
|
from six import StringIO
|
|
import unittest
|
|
|
|
from swiftclient import command_helpers as h
|
|
from swiftclient.multithreading import OutputManager
|
|
|
|
|
|
class TestStatHelpers(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestStatHelpers, self).setUp()
|
|
conn_attrs = {
|
|
'url': 'http://storage/v1/a',
|
|
'token': 'tk12345',
|
|
}
|
|
self.conn = mock.MagicMock(**conn_attrs)
|
|
self.options = {'human': False, 'verbose': 1}
|
|
self.stdout = StringIO()
|
|
self.stderr = StringIO()
|
|
self.output_manager = OutputManager(self.stdout, self.stderr)
|
|
|
|
def assertOut(self, expected):
|
|
real = self.stdout.getvalue()
|
|
# commonly if we strip of blank lines we have a match
|
|
try:
|
|
self.assertEqual(expected.strip('\n'),
|
|
real.strip('\n'))
|
|
except AssertionError:
|
|
# could be anything, try to find typos line by line
|
|
expected_lines = [line.lstrip() for line in
|
|
expected.splitlines() if line.strip()]
|
|
real_lines = [line.lstrip() for line in
|
|
real.splitlines() if line.strip()]
|
|
for expected, real in zip(expected_lines, real_lines):
|
|
self.assertEqual(expected, real)
|
|
# not a typo, might be an indent thing, hopefully you can spot it
|
|
raise
|
|
|
|
def test_stat_account_human(self):
|
|
self.options['human'] = True
|
|
# stub head_account
|
|
stub_headers = {
|
|
'x-account-container-count': 42,
|
|
'x-account-object-count': 1000000,
|
|
'x-account-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_account.return_value = stub_headers
|
|
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_account(self.conn, self.options)
|
|
h.print_account_stats(items, headers, output_manager)
|
|
expected = """
|
|
Account: a
|
|
Containers: 42
|
|
Objects: 976K
|
|
Bytes: 1.0G
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_account_verbose(self):
|
|
self.options['verbose'] += 1
|
|
# stub head_account
|
|
stub_headers = {
|
|
'x-account-container-count': 42,
|
|
'x-account-object-count': 1000000,
|
|
'x-account-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_account.return_value = stub_headers
|
|
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_account(self.conn, self.options)
|
|
h.print_account_stats(items, headers, output_manager)
|
|
expected = """
|
|
StorageURL: http://storage/v1/a
|
|
Auth Token: tk12345
|
|
Account: a
|
|
Containers: 42
|
|
Objects: 1000000
|
|
Bytes: 1073741824
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_account_policy_stat(self):
|
|
# stub head_account
|
|
stub_headers = {
|
|
'x-account-container-count': 42,
|
|
'x-account-object-count': 1000000,
|
|
'x-account-bytes-used': 2 ** 30,
|
|
'x-account-storage-policy-nada-object-count': 1000000,
|
|
'x-account-storage-policy-nada-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_account.return_value = stub_headers
|
|
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_account(self.conn, self.options)
|
|
h.print_account_stats(items, headers, output_manager)
|
|
expected = """
|
|
Account: a
|
|
Containers: 42
|
|
Objects: 1000000
|
|
Bytes: 1073741824
|
|
Objects in policy "nada": 1000000
|
|
Bytes in policy "nada": 1073741824
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_account_policy_stat_with_container_counts(self):
|
|
# stub head_account
|
|
stub_headers = {
|
|
'x-account-container-count': 42,
|
|
'x-account-object-count': 1000000,
|
|
'x-account-bytes-used': 2 ** 30,
|
|
'x-account-storage-policy-nada-container-count': 10,
|
|
'x-account-storage-policy-nada-object-count': 1000000,
|
|
'x-account-storage-policy-nada-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_account.return_value = stub_headers
|
|
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_account(self.conn, self.options)
|
|
h.print_account_stats(items, headers, output_manager)
|
|
expected = """
|
|
Account: a
|
|
Containers: 42
|
|
Objects: 1000000
|
|
Bytes: 1073741824
|
|
Containers in policy "nada": 10
|
|
Objects in policy "nada": 1000000
|
|
Bytes in policy "nada": 1073741824
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_container_human(self):
|
|
self.options['human'] = True
|
|
# stub head container request
|
|
stub_headers = {
|
|
'x-container-object-count': 10 ** 6,
|
|
'x-container-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_container.return_value = stub_headers
|
|
args = ('c',)
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_container(self.conn, self.options, *args)
|
|
h.print_container_stats(items, headers, output_manager)
|
|
expected = """
|
|
Account: a
|
|
Container: c
|
|
Objects: 976K
|
|
Bytes: 1.0G
|
|
Read ACL:
|
|
Write ACL:
|
|
Sync To:
|
|
Sync Key:
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_container_verbose(self):
|
|
self.options['verbose'] += 1
|
|
# stub head container request
|
|
stub_headers = {
|
|
'x-container-object-count': 10 ** 6,
|
|
'x-container-bytes-used': 2 ** 30,
|
|
}
|
|
self.conn.head_container.return_value = stub_headers
|
|
args = ('c',)
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_container(self.conn, self.options, *args)
|
|
h.print_container_stats(items, headers, output_manager)
|
|
expected = """
|
|
URL: http://storage/v1/a/c
|
|
Auth Token: tk12345
|
|
Account: a
|
|
Container: c
|
|
Objects: 1000000
|
|
Bytes: 1073741824
|
|
Read ACL:
|
|
Write ACL:
|
|
Sync To:
|
|
Sync Key:
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_object_human(self):
|
|
self.options['human'] = True
|
|
# stub head object request
|
|
stub_headers = {
|
|
'content-length': 2 ** 20,
|
|
'x-object-meta-color': 'blue',
|
|
'etag': '68b329da9893e34099c7d8ad5cb9c940',
|
|
'content-encoding': 'gzip',
|
|
}
|
|
self.conn.head_object.return_value = stub_headers
|
|
args = ('c', 'o')
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_object(self.conn, self.options, *args)
|
|
h.print_object_stats(items, headers, output_manager)
|
|
expected = """
|
|
Account: a
|
|
Container: c
|
|
Object: o
|
|
Content Length: 1.0M
|
|
ETag: 68b329da9893e34099c7d8ad5cb9c940
|
|
Meta Color: blue
|
|
Content-Encoding: gzip
|
|
"""
|
|
self.assertOut(expected)
|
|
|
|
def test_stat_object_verbose(self):
|
|
self.options['verbose'] += 1
|
|
# stub head object request
|
|
stub_headers = {
|
|
'content-length': 2 ** 20,
|
|
'x-object-meta-color': 'blue',
|
|
'etag': '68b329da9893e34099c7d8ad5cb9c940',
|
|
'content-encoding': 'gzip',
|
|
}
|
|
self.conn.head_object.return_value = stub_headers
|
|
args = ('c', 'o')
|
|
with self.output_manager as output_manager:
|
|
items, headers = h.stat_object(self.conn, self.options, *args)
|
|
h.print_object_stats(items, headers, output_manager)
|
|
expected = """
|
|
URL: http://storage/v1/a/c/o
|
|
Auth Token: tk12345
|
|
Account: a
|
|
Container: c
|
|
Object: o
|
|
Content Length: 1048576
|
|
ETag: 68b329da9893e34099c7d8ad5cb9c940
|
|
Meta Color: blue
|
|
Content-Encoding: gzip
|
|
"""
|
|
self.assertOut(expected)
|