#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This work was created by participants in the DataONE project, and is
# jointly copyrighted by participating institutions in DataONE. For
# more information on DataONE, see our web site at http://dataone.org.
#
#   Copyright ${year}
#
# 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.

'''
:mod:`tier_1_mn_read_get`
=========================

:Created: 2011-04-22
:Author: DataONE (dahl)
:Dependencies:
  - python 2.6
'''

# Std.
import sys
import logging
import unittest

# D1.
from d1_common import xmlrunner
import d1_common.const
import d1_common.types.exceptions
import d1_test_case

# App.
import context
import test_client
import test_utilities


class Test050Get(d1_test_case.D1TestCase):
  def setUp(self):
    pass


  def validate_object(self, object_info):
    '''Get object and verify retrieved information against its ObjectInfo.
    '''
    # The ObjectInfo records were retrieved during the listObjects tests.
    client = test_client.TestClient(context.node['baseurl'])
    pid = object_info.identifier.value()
    # Verify checksum and checksum algorithm.
    response = client.get(context.TOKEN, pid)
    checksum_from_get = test_utilities.calculate_checksum(response,
                                                          object_info.checksum.algorithm)
    self.assertEqual(object_info.checksum.value(), checksum_from_get)
    # Verify object size.
    response = client.get(context.TOKEN, pid)
    object_size = test_utilities.get_size(response)
    self.assertEqual(object_size, object_info.size)


  def test_010_get_object_by_invalid_pid(self):
    '''404 NotFound when attempting to get non-existing object.
    '''
    client = test_client.TestClient(context.node['baseurl'])
    self.assertRaises(d1_common.types.exceptions.NotFound, client.get,
                      context.TOKEN, '_invalid_pid_')


  def test_020_get_object_by_valid_pid(self):
    '''Successful retrieval of known objects.
    '''
    # Verify that objects learned about in earlier slicing tests can be
    # retrieved and that their checksums match what listObjects reported.
    for object_list in context.slices:
      for object_info in object_list.objectInfo:
        self.validate_object(object_info)