# -*- coding: utf-8 -*-

# 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.

"""
test_object
----------------------------------

Functional tests for `shade` object methods.
"""

import tempfile

from testtools import content

from shade import openstack_cloud
from shade.tests import base


class TestObject(base.TestCase):

    def setUp(self):
        super(TestObject, self).setUp()
        self.cloud = openstack_cloud(cloud='devstack')
        if not self.cloud.has_service('object-store'):
            self.skipTest('Object service not supported by cloud')

    def test_create_object(self):
        '''Test uploading small and large files.'''
        container_name = self.getUniqueString('container')
        self.addDetail('container', content.text_content(container_name))
        self.addCleanup(self.cloud.delete_container, container_name)
        self.cloud.create_container(container_name)
        self.assertEqual(container_name,
                         self.cloud.list_containers()[0]['name'])
        sizes = (
            (64 * 1024, 1),      # 64K, one segment
            (50 * 1024 ** 2, 5)  # 50MB, 5 segments
        )
        for size, nseg in sizes:
            segment_size = round(size / nseg)
            with tempfile.NamedTemporaryFile() as sparse_file:
                sparse_file.seek(size)
                sparse_file.write("\0")
                sparse_file.flush()
                name = 'test-%d' % size
                self.cloud.create_object(container_name, name,
                                         sparse_file.name,
                                         segment_size=segment_size)
                self.assertFalse(self.cloud.is_object_stale(
                    container_name, name,
                    sparse_file.name
                    )
                )
            self.assertIsNotNone(
                self.cloud.get_object_metadata(container_name, name))
            self.assertIsNotNone(
                self.cloud.get_object(container_name, name))
            self.assertEqual(
                name,
                self.cloud.list_objects(container_name)[0]['name'])
            self.cloud.delete_object(container_name, name)
        self.assertEqual([], self.cloud.list_objects(container_name))
        self.assertEqual(container_name,
                         self.cloud.list_containers()[0]['name'])
        self.cloud.delete_container(container_name)
