'''
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
'''

from unittest import TestCase
from mock.mock import patch, MagicMock

from resource_management.core import Environment, Fail
from resource_management.core.system import System
from resource_management.core.resources.system import Link

import os

@patch.object(System, "os_family", new = 'redhat')
class TestLinkResource(TestCase):

  @patch.object(os.path, "realpath")
  @patch.object(os.path, "lexists")
  @patch.object(os.path, "islink")
  @patch.object(os, "unlink")
  @patch.object(os, "symlink")
  def test_action_create_relink(self, symlink_mock, unlink_mock, 
                         islink_mock, lexists_mock,
                         realmock):
    lexists_mock.return_value = True
    realmock.return_value = "/old_to_link_path"
    islink_mock.return_value = True
    with Environment('/') as env:
      Link("/some_path",
           to = "/a/b/link_to_path"
      )
      
    unlink_mock.assert_called_with("/some_path")
    symlink_mock.assert_called_with("/a/b/link_to_path", "/some_path")
    
  @patch.object(os.path, "realpath")
  @patch.object(os.path, "lexists")
  @patch.object(os.path, "islink")
  def test_action_create_failed_due_to_file_exists(self, islink_mock, 
                         lexists_mock, realmock):
    lexists_mock.return_value = True
    realmock.return_value = "/old_to_link_path"
    islink_mock.return_value = False
    with Environment('/') as env:
      try:
        Link("/some_path",
             to = "/a/b/link_to_path"
        )
        
        self.fail("Must fail when directory or file with name /some_path exist")
      except Fail as e:
        self.assertEqual("LinkProvider[Link['/some_path']] trying to create a symlink with the same name as an existing file or directory",
                       str(e))
        
  @patch.object(os.path, "lexists")
  @patch.object(os, "symlink")
  def test_action_create_symlink_clean_create(self, symlink_mock, lexists_mock):
    lexists_mock.return_value = False
    
    with Environment('/') as env:
      Link("/some_path",
           to = "/a/b/link_to_path"
      )
      
    symlink_mock.assert_called_with("/a/b/link_to_path", "/some_path")
    
  @patch.object(os.path, "isdir")
  @patch.object(os.path, "exists")  
  @patch.object(os.path, "lexists")
  @patch.object(os, "link")
  def test_action_create_hardlink_clean_create(self, link_mock, lexists_mock,
                                        exists_mock, isdir_mock):
    lexists_mock.return_value = False
    exists_mock.return_value = True
    isdir_mock.return_value = False
    
    with Environment('/') as env:
      Link("/some_path",
           hard = True,
           to = "/a/b/link_to_path"
      )
      
    link_mock.assert_called_with("/a/b/link_to_path", "/some_path")
    
  @patch.object(os.path, "exists")  
  @patch.object(os.path, "lexists")
  def test_action_create_hardlink_target_doesnt_exist(self, lexists_mock,
                                        exists_mock):
    lexists_mock.return_value = False
    exists_mock.return_value = False
    
    with Environment('/') as env:
      try:
        Link("/some_path",
             hard = True,
             to = "/a/b/link_to_path"
        )  
        self.fail("Must fail when target directory do doenst exist")
      except Fail as e:
        self.assertEqual("Failed to apply Link['/some_path'], linking to nonexistent location /a/b/link_to_path",
                       str(e))
        
  @patch.object(os.path, "isdir") 
  @patch.object(os.path, "exists")  
  @patch.object(os.path, "lexists")
  def test_action_create_hardlink_target_is_dir(self, lexists_mock,
                                        exists_mock, isdir_mock):
    lexists_mock.return_value = False
    exists_mock.return_value = True
    isdir_mock = True
    
    with Environment('/') as env:
      try:
        Link("/some_path",
             hard = True,
             to = "/a/b/link_to_path"
        )  
        self.fail("Must fail when hardlinking to directory")
      except Fail as e:
        self.assertEqual("Failed to apply Link['/some_path'], cannot create hard link to a directory (/a/b/link_to_path)",
                       str(e)) 
        
  @patch.object(os, "unlink")
  @patch.object(os.path, "exists")
  def test_action_delete(self, exists_mock, unlink_mock):     
    exists_mock.return_value = True
    
    with Environment('/') as env:
      Link("/some_path",
           action = "delete"
      )    
    unlink_mock.assert_called_with("/some_path")
      
  
