Pārlūkot izejas kodu

AMBARI-12036 Windows unit tests: Agent unit tests: fix the imports & failing patches

Excluded the inapplicable tests for now. Coalesced the OS mock.
Florian Barca 10 gadi atpakaļ
vecāks
revīzija
4e2b2d8481
26 mainītis faili ar 256 papildinājumiem un 277 dzēšanām
  1. 12 12
      ambari-agent/src/test/python/ambari_agent/TestActionQueue.py
  2. 1 6
      ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py
  3. 3 9
      ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py
  4. 2 4
      ambari-agent/src/test/python/ambari_agent/TestController.py
  5. 10 15
      ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py
  6. 2 7
      ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py
  7. 2 2
      ambari-agent/src/test/python/ambari_agent/TestFileCache.py
  8. 2 2
      ambari-agent/src/test/python/ambari_agent/TestHostInfo.py
  9. 3 8
      ambari-agent/src/test/python/ambari_agent/TestHostname.py
  10. 1 6
      ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py
  11. 25 30
      ambari-agent/src/test/python/ambari_agent/TestMain.py
  12. 2 7
      ambari-agent/src/test/python/ambari_agent/TestNetUtil.py
  13. 3 8
      ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py
  14. 1 6
      ambari-agent/src/test/python/ambari_agent/TestSecurity.py
  15. 1 6
      ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py
  16. 4 1
      ambari-agent/src/test/python/resource_management/TestContentSources.py
  17. 35 30
      ambari-agent/src/test/python/resource_management/TestDirectoryResource.py
  18. 8 5
      ambari-agent/src/test/python/resource_management/TestExecuteResource.py
  19. 42 39
      ambari-agent/src/test/python/resource_management/TestFileResource.py
  20. 12 8
      ambari-agent/src/test/python/resource_management/TestGroupResource.py
  21. 18 18
      ambari-agent/src/test/python/resource_management/TestLinkResource.py
  22. 19 17
      ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py
  23. 8 2
      ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
  24. 18 14
      ambari-agent/src/test/python/resource_management/TestUserResource.py
  25. 17 15
      ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py
  26. 5 0
      ambari-common/src/test/python/only_for_platform.py

+ 12 - 12
ambari-agent/src/test/python/ambari_agent/TestActionQueue.py

@@ -36,14 +36,9 @@ from ambari_agent.PythonExecutor import PythonExecutor
 from ambari_agent.CommandStatusDict import CommandStatusDict
 from ambari_agent.ActualConfigHandler import ActualConfigHandler
 from ambari_agent.RecoveryManager import RecoveryManager
-from FileCache import FileCache
+from ambari_agent.FileCache import FileCache
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, not_for_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
 
 class TestActionQueue(TestCase):
   def setUp(self):
@@ -818,9 +813,12 @@ class TestActionQueue(TestCase):
     self.assertEqual(2, sleep_mock.call_count)
     sleep_mock.assert_has_calls([call(2), call(3)], False)
     runCommand_mock.assert_has_calls([
-      call(command, '/tmp/ambari-agent/output-19.txt', '/tmp/ambari-agent/errors-19.txt', override_output_files=True, retry=False),
-      call(command, '/tmp/ambari-agent/output-19.txt', '/tmp/ambari-agent/errors-19.txt', override_output_files=False, retry=True),
-      call(command, '/tmp/ambari-agent/output-19.txt', '/tmp/ambari-agent/errors-19.txt', override_output_files=False, retry=True)])
+      call(command, os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'output-19.txt',
+           os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'errors-19.txt', override_output_files=True, retry=False),
+      call(command, os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'output-19.txt',
+           os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'errors-19.txt', override_output_files=False, retry=True),
+      call(command, os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'output-19.txt',
+           os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'errors-19.txt', override_output_files=False, retry=True)])
 
 
   @patch("time.time")
@@ -857,8 +855,10 @@ class TestActionQueue(TestCase):
     self.assertEqual(1, sleep_mock.call_count)
     sleep_mock.assert_has_calls([call(2)], False)
     runCommand_mock.assert_has_calls([
-      call(command, '/tmp/ambari-agent/output-19.txt', '/tmp/ambari-agent/errors-19.txt', override_output_files=True, retry=False),
-      call(command, '/tmp/ambari-agent/output-19.txt', '/tmp/ambari-agent/errors-19.txt', override_output_files=False, retry=True)])
+      call(command, os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'output-19.txt',
+           os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'errors-19.txt', override_output_files=True, retry=False),
+      call(command, os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'output-19.txt',
+           os.sep + 'tmp' + os.sep + 'ambari-agent' + os.sep + 'errors-19.txt', override_output_files=False, retry=True)])
 
   #retryable_command
   @patch("time.sleep")

+ 1 - 6
ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py

@@ -24,12 +24,7 @@ import logging
 from mock.mock import patch, MagicMock, call
 from ambari_agent.LiveStatus import LiveStatus
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 with patch("platform.linux_distribution", return_value = ('Suse','11','Final')):
   from ambari_agent.AmbariConfig import AmbariConfig

+ 3 - 9
ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py

@@ -21,18 +21,12 @@ import os
 import tempfile
 import shutil
 from unittest import TestCase
-import ConfigParser
-import security
-from security import CertificateManager
+
+from ambari_agent.security import CertificateManager
 from ambari_agent import AmbariConfig
 from mock.mock import patch, MagicMock
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 class TestCertGeneration(TestCase):
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))

+ 2 - 4
ambari-agent/src/test/python/ambari_agent/TestController.py

@@ -31,7 +31,7 @@ import platform
 from threading import Event
 import ambari_simplejson
 from ambari_commons import OSCheck
-from only_for_platform import not_for_platform, only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
+from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
 from ambari_agent import Controller, ActionQueue, Register
 from ambari_agent import hostname
 from ambari_agent.Controller import AGENT_AUTO_RESTART_EXIT_CODE
@@ -42,10 +42,8 @@ from ambari_agent.AmbariConfig import AmbariConfig
 from ambari_agent.Facter import FacterLinux
 import ambari_commons
 
-OPERATING_SYSTEM_DISTRO = ('Suse','11','Final')
-
 @not_for_platform(PLATFORM_WINDOWS)
-@patch.object(OSCheck, "os_distribution", new = OPERATING_SYSTEM_DISTRO)
+@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
 class TestController(unittest.TestCase):
 
   logger = logging.getLogger()

+ 10 - 15
ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py

@@ -30,24 +30,19 @@ import tempfile
 import time
 from threading import Thread
 
-from PythonExecutor import PythonExecutor
-from CustomServiceOrchestrator import CustomServiceOrchestrator
-from AmbariConfig import AmbariConfig
 from mock.mock import MagicMock, patch
 import StringIO
 import sys
-from AgentException import AgentException
-from FileCache import FileCache
-from LiveStatus import LiveStatus
-from BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle
+
 from ambari_agent.ActionQueue import ActionQueue
+from ambari_agent.AgentException import AgentException
+from ambari_agent.AmbariConfig import AmbariConfig
+from ambari_agent.BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle
+from ambari_agent.CustomServiceOrchestrator import CustomServiceOrchestrator
+from ambari_agent.FileCache import FileCache
+from ambari_agent.PythonExecutor import PythonExecutor
 from ambari_commons import OSCheck
-from only_for_platform import get_platform, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import get_platform, os_distro_value, PLATFORM_WINDOWS
 
 class TestCustomServiceOrchestrator(TestCase):
 
@@ -81,7 +76,7 @@ class TestCustomServiceOrchestrator(TestCase):
 
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch.object(CustomServiceOrchestrator, 'decompressClusterHostInfo')
-  @patch("hostname.public_hostname")
+  @patch("ambari_agent.hostname.public_hostname")
   @patch("os.path.isfile")
   @patch("os.unlink")
   @patch.object(FileCache, "__init__")
@@ -144,7 +139,7 @@ class TestCustomServiceOrchestrator(TestCase):
 
 
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
-  @patch("hostname.public_hostname")
+  @patch("ambari_agent.hostname.public_hostname")
   @patch("os.path.isfile")
   @patch("os.unlink")
   @patch.object(FileCache, "__init__")

+ 2 - 7
ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py

@@ -22,15 +22,10 @@ limitations under the License.
 import unittest
 from mock.mock import patch, MagicMock, call, Mock
 from ambari_agent import DataCleaner
-import AmbariConfig
+from ambari_agent import AmbariConfig
 import os
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 class TestDataCleaner(unittest.TestCase):
 

+ 2 - 2
ambari-agent/src/test/python/ambari_agent/TestFileCache.py

@@ -28,8 +28,8 @@ import tempfile
 import time
 from threading import Thread
 
-from FileCache import FileCache, CachingException
-from AmbariConfig import AmbariConfig
+from ambari_agent.FileCache import FileCache, CachingException
+from ambari_agent.AmbariConfig import AmbariConfig
 from mock.mock import MagicMock, patch
 import StringIO
 import sys

+ 2 - 2
ambari-agent/src/test/python/ambari_agent/TestHostInfo.py

@@ -31,7 +31,7 @@ from mock.mock import create_autospec
 import ambari_commons
 from ambari_commons import OSCheck
 import os
-from only_for_platform import not_for_platform, get_platform, PLATFORM_WINDOWS, PLATFORM_LINUX
+from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
 from ambari_commons.firewall import Firewall
 from ambari_commons.os_check import OSCheck, OSConst
 from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler
@@ -42,7 +42,7 @@ from resource_management.core.system import System
 from resource_management.libraries.functions import packages_analyzer
 
 @not_for_platform(PLATFORM_WINDOWS)
-@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = ('Suse','11','Final')))
+@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
 class TestHostInfo(TestCase):
 
   @patch.object(OSCheck, 'get_os_family')

+ 3 - 8
ambari-agent/src/test/python/ambari_agent/TestHostname.py

@@ -28,12 +28,7 @@ import shutil
 import os, pprint, json,stat
 from mock.mock import patch, MagicMock
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, not_for_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
 
 class TestHostname(TestCase):
 
@@ -78,7 +73,7 @@ class TestHostname(TestCase):
       config.remove_option('server', 'hostname_script')
     pass
 
-  @only_for_platform(PLATFORM_LINUX)
+  @not_for_platform(PLATFORM_WINDOWS)
   def test_hostname_override(self):
     hostname.cached_hostname = None
     hostname.cached_public_hostname = None
@@ -101,7 +96,7 @@ class TestHostname(TestCase):
       config.remove_option('agent', 'hostname_script')
     pass
 
-  @only_for_platform(PLATFORM_LINUX)
+  @not_for_platform(PLATFORM_WINDOWS)
   def test_public_hostname_override(self):
     hostname.cached_hostname = None
     hostname.cached_public_hostname = None

+ 1 - 6
ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py

@@ -27,12 +27,7 @@ from mock.mock import patch, MagicMock
 import pprint
 from ambari_agent import StatusCheck
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 
 class TestLiveStatus(TestCase):

+ 25 - 30
ambari-agent/src/test/python/ambari_agent/TestMain.py

@@ -28,14 +28,9 @@ import tempfile
 import ConfigParser
 
 from ambari_commons import OSCheck
-from only_for_platform import get_platform, not_for_platform, only_for_platform, PLATFORM_WINDOWS, PLATFORM_LINUX
+from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS
 from mock.mock import MagicMock, patch, ANY, Mock
 
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
-
 with patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)):
   from ambari_agent import NetUtil, security
   from ambari_agent import ProcessHelper, main
@@ -46,8 +41,6 @@ with patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_
   import ambari_agent.HeartbeatHandlers as HeartbeatHandlers
   from ambari_commons.os_check import OSConst, OSCheck
   from ambari_agent.ExitHelper import ExitHelper
-  if get_platform() != PLATFORM_WINDOWS:
-    from ambari_commons.shell import shellRunnerLinux
 
 class TestMain(unittest.TestCase):
 
@@ -61,7 +54,7 @@ class TestMain(unittest.TestCase):
     # enable stdout
     sys.stdout = sys.__stdout__
 
-  @only_for_platform(PLATFORM_LINUX)
+  @not_for_platform(PLATFORM_WINDOWS)
   @patch("ambari_agent.HeartbeatHandlers.HeartbeatStopHandlersLinux")
   @patch("sys.exit")
   @patch("os.getpid")
@@ -130,7 +123,7 @@ class TestMain(unittest.TestCase):
     main.update_log_level(config)
     setLevel_mock.assert_called_with(logging.INFO)
 
-  @only_for_platform(PLATFORM_LINUX)
+  @not_for_platform(PLATFORM_WINDOWS)
   @patch("signal.signal")
   def test_bind_signal_handlers(self, signal_mock):
     main.bind_signal_handlers(os.getpid())
@@ -206,10 +199,11 @@ class TestMain(unittest.TestCase):
   @not_for_platform(PLATFORM_WINDOWS)
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("time.sleep")
-  @patch.object(shellRunnerLinux,"run")
   @patch("sys.exit")
   @patch("os.path.exists")
-  def test_daemonize_and_stop(self, exists_mock, sys_exit_mock, kill_mock, sleep_mock):
+  def test_daemonize_and_stop(self, exists_mock, sys_exit_mock, sleep_mock):
+    from ambari_commons.shell import shellRunnerLinux
+
     oldpid = ProcessHelper.pidfile
     pid = str(os.getpid())
     _, tmpoutfile = tempfile.mkstemp()
@@ -220,24 +214,25 @@ class TestMain(unittest.TestCase):
     saved = open(ProcessHelper.pidfile, 'r').read()
     self.assertEqual(pid, saved)
 
-    # Reuse pid file when testing agent stop
-    # Testing normal exit
-    exists_mock.return_value = False
-    main.stop_agent()
-    kill_mock.assert_called_with(['ambari-sudo.sh', 'kill', '-15', pid])
-    sys_exit_mock.assert_called_with(0)
-
-    # Restore
-    kill_mock.reset_mock()
-    sys_exit_mock.reset_mock()
-    kill_mock.return_value = {'exitCode': 0, 'output': 'out', 'error': 'err'}
-
-    # Testing exit when failed to remove pid file
-    exists_mock.return_value = True
-    main.stop_agent()
-    kill_mock.assert_any_call(['ambari-sudo.sh', 'kill', '-15', pid])
-    kill_mock.assert_any_call(['ambari-sudo.sh', 'kill', '-9', pid])
-    sys_exit_mock.assert_called_with(1)
+    with patch("ambari_commons.shell.shellRunnerLinux.run") as kill_mock:
+      # Reuse pid file when testing agent stop
+      # Testing normal exit
+      exists_mock.return_value = False
+      main.stop_agent()
+      kill_mock.assert_called_with(['ambari-sudo.sh', 'kill', '-15', pid])
+      sys_exit_mock.assert_called_with(0)
+
+      # Restore
+      kill_mock.reset_mock()
+      sys_exit_mock.reset_mock()
+      kill_mock.return_value = {'exitCode': 0, 'output': 'out', 'error': 'err'}
+
+      # Testing exit when failed to remove pid file
+      exists_mock.return_value = True
+      main.stop_agent()
+      kill_mock.assert_any_call(['ambari-sudo.sh', 'kill', '-15', pid])
+      kill_mock.assert_any_call(['ambari-sudo.sh', 'kill', '-9', pid])
+      sys_exit_mock.assert_called_with(1)
 
     # Restore
     ProcessHelper.pidfile = oldpid

+ 2 - 7
ambari-agent/src/test/python/ambari_agent/TestNetUtil.py

@@ -23,12 +23,7 @@ from mock.mock import MagicMock, patch
 import unittest
 import threading
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
 
 class TestNetUtil(unittest.TestCase):
 
@@ -58,7 +53,7 @@ class TestNetUtil(unittest.TestCase):
     httpsConMock.side_effect = Exception("test")
     self.assertFalse(netutil.checkURL("url")[0])
 
-  @only_for_platform(PLATFORM_LINUX)
+  @not_for_platform(PLATFORM_WINDOWS)
   @patch("time.sleep")
   @patch.object(threading._Event, "wait")
   def test_try_to_connect(self, event_mock,

+ 3 - 8
ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py

@@ -26,16 +26,11 @@ import tempfile
 import time
 from threading import Thread
 
-from PythonExecutor import PythonExecutor
-from AmbariConfig import AmbariConfig
+from ambari_agent.PythonExecutor import PythonExecutor
+from ambari_agent.AmbariConfig import AmbariConfig
 from mock.mock import MagicMock, patch
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 @patch.object(PythonExecutor, "open_subprocess_files", new=MagicMock(return_value =("", "")))
 class TestPythonExecutor(TestCase):

+ 1 - 6
ambari-agent/src/test/python/ambari_agent/TestSecurity.py

@@ -30,12 +30,7 @@ import os
 import tempfile
 
 from ambari_commons import OSCheck
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 with patch("platform.linux_distribution", return_value = ('Suse','11','Final')):
   from ambari_agent import NetUtil

+ 1 - 6
ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py

@@ -28,12 +28,7 @@ import logging
 from mock.mock import patch
 from mock.mock import MagicMock
 
-from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
-
-if get_platform() != PLATFORM_WINDOWS:
-  os_distro_value = ('Suse','11','Final')
-else:
-  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
+from only_for_platform import os_distro_value
 
 USERNAME_LENGTH=10
 USERNAME_CHARS=string.ascii_uppercase +string.ascii_lowercase + string.digits + '-_'

+ 4 - 1
ambari-agent/src/test/python/resource_management/TestContentSources.py

@@ -18,6 +18,7 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
 
 from resource_management.core import Environment
 from resource_management.core.system import System
@@ -25,7 +26,9 @@ from resource_management.core.source import StaticFile
 from resource_management.core.source import DownloadSource
 from resource_management.core.source import Template
 from resource_management.core.source import InlineTemplate
-from resource_management.core import sudo
+
+if get_platform() != PLATFORM_WINDOWS:
+  from resource_management.core import sudo
 
 from ambari_jinja2 import UndefinedError, TemplateNotFound
 import urllib2

+ 35 - 30
ambari-agent/src/test/python/resource_management/TestDirectoryResource.py

@@ -18,24 +18,29 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
+
 import os
 from resource_management.core.system import System
-from resource_management.core import Environment, Fail, sudo
+from resource_management.core import Environment, Fail
 from resource_management.core.resources import Directory
-import pwd
-import grp
+
+if get_platform() != PLATFORM_WINDOWS:
+  import pwd
+  import grp
+
 
 @patch.object(System, "os_family", new = 'redhat')
 class TestDirectoryResource(TestCase):
   
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "makedirs")
-  @patch.object(sudo, "path_isdir")
-  @patch.object(sudo, "stat")
-  @patch.object(sudo,"chmod")
-  @patch.object(sudo,"chown")
-  @patch.object(pwd, "getpwnam")
-  @patch.object(grp, "getgrnam")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.makedirs")
+  @patch("resource_management.core.sudo.path_isdir")
+  @patch("resource_management.core.sudo.stat")
+  @patch("resource_management.core.sudo.chmod")
+  @patch("resource_management.core.sudo.chown")
+  @patch("pwd.getpwnam")
+  @patch("grp.getgrnam")
   def test_create_directory_recursive(self, getgrnam_mock, getpwnam_mock,
                                       os_chown_mock, os_chmod_mock, os_stat_mock,
                                       isdir_mock, os_makedirs_mock, 
@@ -62,15 +67,15 @@ class TestDirectoryResource(TestCase):
     os_chmod_mock.assert_called_with('/a/b/c/d', 0777)
     os_chown_mock.assert_any_call('/a/b/c/d', getpwnam_mock.return_value, getgrnam_mock.return_value)
   
-  @patch.object(sudo, "path_exists")
+  @patch("resource_management.core.sudo.path_exists")
   @patch.object(os.path, "dirname")
-  @patch.object(sudo, "path_isdir")
-  @patch.object(sudo, "makedir")
-  @patch.object(sudo, "stat")
-  @patch.object(sudo,"chmod")
-  @patch.object(sudo,"chown")
-  @patch.object(pwd, "getpwnam")
-  @patch.object(grp, "getgrnam")
+  @patch("resource_management.core.sudo.path_isdir")
+  @patch("resource_management.core.sudo.makedir")
+  @patch("resource_management.core.sudo.stat")
+  @patch("resource_management.core.sudo.chmod")
+  @patch("resource_management.core.sudo.chown")
+  @patch("pwd.getpwnam")
+  @patch("grp.getgrnam")
   def test_create_directory_not_recursive(self, getgrnam_mock, getpwnam_mock,
                                       os_chown_mock, os_chmod_mock, os_stat_mock,
                                       mkdir_mock, isdir_mock, os_dirname_mock, 
@@ -96,9 +101,9 @@ class TestDirectoryResource(TestCase):
     os_chmod_mock.assert_called_with('/a/b/c/d', 0777)
     os_chown_mock.assert_any_call('/a/b/c/d', getpwnam_mock.return_value, getgrnam_mock.return_value)
     
-  @patch.object(sudo, "path_exists")
+  @patch("resource_management.core.sudo.path_exists")
   @patch.object(os.path, "dirname")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_create_directory_failed_no_parent(self, isdir_mock, os_dirname_mock, 
                                       os_path_exists_mock):
     os_path_exists_mock.return_value = False
@@ -119,8 +124,8 @@ class TestDirectoryResource(TestCase):
       self.assertEqual('Applying Directory[\'/a/b/c/d\'] failed, parent directory /a/b/c doesn\'t exist',
                        str(e))
 
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_create_directory_path_is_file_or_line(self, isdir_mock, os_path_exists_mock):
     os_path_exists_mock.return_value = True
     isdir_mock.return_value = False
@@ -138,9 +143,9 @@ class TestDirectoryResource(TestCase):
       self.assertEqual('Applying Directory[\'/a/b/c/d\'] failed, file /a/b/c/d already exists',
                        str(e))
   
-  @patch.object(sudo, "rmtree")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.rmtree")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_delete_directory(self, isdir_mock, os_path_exists_mock, rmtree_mock):
     os_path_exists_mock.return_value = True
     isdir_mock.return_value = True
@@ -152,7 +157,7 @@ class TestDirectoryResource(TestCase):
       
     rmtree_mock.assert_called_with('/a/b/c/d')
     
-  @patch.object(sudo, "path_exists")
+  @patch("resource_management.core.sudo.path_exists")
   def test_delete_noexisting_directory(self, os_path_exists_mock):
     os_path_exists_mock.return_value = False
     
@@ -161,9 +166,9 @@ class TestDirectoryResource(TestCase):
            action='delete'
       )
   
-  @patch.object(sudo, "rmtree")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.rmtree")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_delete_directory_with_path_to_file(self, isdir_mock, os_path_exists_mock, rmtree_mock):
     os_path_exists_mock.return_value = True
     isdir_mock.return_value = False

+ 8 - 5
ambari-agent/src/test/python/resource_management/TestExecuteResource.py

@@ -18,18 +18,21 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock, call
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
 
 from resource_management.core.system import System
 from resource_management.core.resources.system import Execute
 from resource_management.core.environment import Environment
-from resource_management.core import sudo
 
 import subprocess
 import logging
 import os
 from resource_management import Fail
-import grp
-import pwd
+
+if get_platform() != PLATFORM_WINDOWS:
+  import grp
+  import pwd
+
 import select
 
 
@@ -69,7 +72,7 @@ class TestExecuteResource(TestCase):
     self.assertTrue(popen_mock.called, 'subprocess.Popen should have been called!')
     self.assertFalse(proc_communicate_mock.called, 'proc.communicate should not have been called!')
 
-  @patch.object(sudo, "path_exists")
+  @patch("resource_management.core.sudo.path_exists")
   @patch.object(subprocess, "Popen")
   def test_attribute_creates(self, popen_mock, exists_mock):
     exists_mock.return_value = True
@@ -133,7 +136,7 @@ class TestExecuteResource(TestCase):
 
     self.assertTrue(call(10) in time_mock.call_args_list)
 
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_group(self, getpwnam_mock):
     def error(argument):
       self.assertEqual(argument, "test_user")

+ 42 - 39
ambari-agent/src/test/python/resource_management/TestFileResource.py

@@ -19,22 +19,25 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
+
 import os
 import sys
-import grp
-import pwd
 from resource_management.core import Environment, Fail
 from resource_management.core.resources import File
 from resource_management.core.system import System
-from resource_management.core import sudo
-import resource_management.core.providers.system
 import resource_management
 
+if get_platform() != PLATFORM_WINDOWS:
+  import resource_management.core.providers.system
+  import grp
+  import pwd
+
 
 @patch.object(System, "os_family", new = 'redhat')
 class TestFileResource(TestCase):
   @patch.object(os.path, "dirname")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_dir_exist(self, isdir_mock, dirname_mock):
     """
     Tests if 'create' action fails when path is existent directory
@@ -55,7 +58,7 @@ class TestFileResource(TestCase):
     self.assertFalse(dirname_mock.called)
 
   @patch.object(os.path, "dirname")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_parent_dir_non_exist(self, isdir_mock, dirname_mock):
     """
     Tests if 'create' action fails when parent directory of path
@@ -79,10 +82,10 @@ class TestFileResource(TestCase):
     self.assertTrue(dirname_mock.called)
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "read_file")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.read_file")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_non_existent_file(self, isdir_mock, exists_mock, create_file_mock, read_file_mock, ensure_mock):
     """
     Tests if 'create' action create new non existent file and write proper data
@@ -103,10 +106,10 @@ class TestFileResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "read_file")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.read_file")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_replace(self, isdir_mock, exists_mock, create_file_mock, read_file_mock, ensure_mock):
     """
     Tests if 'create' action rewrite existent file with new data
@@ -126,9 +129,9 @@ class TestFileResource(TestCase):
     create_file_mock.assert_called_with('/directory/file', 'new-content', encoding=None)
 
 
-  @patch.object(sudo, "unlink")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.unlink")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_delete_is_directory(self, isdir_mock, exist_mock, unlink_mock):
     """
     Tests if 'delete' action fails when path is directory
@@ -152,9 +155,9 @@ class TestFileResource(TestCase):
     self.assertEqual(exist_mock.call_count, 0)
     self.assertEqual(unlink_mock.call_count, 0)
 
-  @patch.object(sudo, "unlink")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.unlink")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_delete(self, isdir_mock, exist_mock, unlink_mock):
     """
     Tests if 'delete' action removes file
@@ -175,7 +178,7 @@ class TestFileResource(TestCase):
     self.assertEqual(unlink_mock.call_count, 1)
 
 
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_attribute_path(self, isdir_mock):
     """
     Tests 'path' attribute
@@ -198,10 +201,10 @@ class TestFileResource(TestCase):
 
   @patch.object(resource_management.core.Environment, "backup_file")
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "read_file")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.read_file")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_attribute_backup(self, isdir_mock, exists_mock, create_file_mock,  read_file_mock, ensure_mock, backup_file_mock):
     """
     Tests 'backup' attribute
@@ -235,8 +238,8 @@ class TestFileResource(TestCase):
 
   @patch("resource_management.core.providers.system._ensure_metadata")
   @patch("__builtin__.open")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_attribute_replace(self, isdir_mock, exists_mock, open_mock, ensure_mock):
     """
     Tests 'replace' attribute
@@ -263,14 +266,14 @@ class TestFileResource(TestCase):
     self.assertEqual(open_mock.call_count, 0)
 
 
-  @patch.object(pwd, "getpwnam")
-  @patch.object(grp, "getgrnam")
-  @patch.object(sudo, "chown")
-  @patch.object(sudo, "chmod")
-  @patch.object(sudo, "stat")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("pwd.getpwnam")
+  @patch("grp.getgrnam")
+  @patch("resource_management.core.sudo.chown")
+  @patch("resource_management.core.sudo.chmod")
+  @patch("resource_management.core.sudo.stat")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_ensure_metadata(self, isdir_mock, exists_mock, create_file_mock, stat_mock, chmod_mock, chown_mock, getgrnam_mock,
                            getpwnam_mock):
     """
@@ -331,10 +334,10 @@ class TestFileResource(TestCase):
 
   @patch("resource_management.core.providers.system._ensure_metadata")
   @patch("resource_management.core.providers.system.FileProvider._get_content")
-  @patch.object(sudo, "read_file")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.read_file")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_encoding(self, isdir_mock, exists_mock, create_file_mock, read_file_mock, get_content_mock ,ensure_mock):
 
     isdir_mock.side_effect = [False, True]

+ 12 - 8
ambari-agent/src/test/python/resource_management/TestGroupResource.py

@@ -18,16 +18,20 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
+
 from resource_management.core import Environment, Fail
 from resource_management.core.resources import Group
 from resource_management.core.system import System
 
 import subprocess
-import grp
 import os
-import pty
 import select
 
+if get_platform() != PLATFORM_WINDOWS:
+  import grp
+  import pty
+
 
 subproc_stdout = MagicMock()
 
@@ -35,11 +39,11 @@ subproc_stdout = MagicMock()
 @patch.object(select, "select", new=MagicMock(return_value=([subproc_stdout], None, None)))
 @patch.object(System, "os_family", new = 'redhat')
 @patch.object(os, "environ", new = {'PATH':'/bin'})
-@patch.object(pty, "openpty", new = MagicMock(return_value=(1,5)))
+@patch("pty.openpty", new = MagicMock(return_value=(1,5)))
 @patch.object(os, "close", new=MagicMock())
 class TestGroupResource(TestCase):
 
-  @patch.object(grp, "getgrnam")
+  @patch("grp.getgrnam")
   @patch.object(subprocess, "Popen")
   def test_action_create_nonexistent(self, popen_mock, getgrnam_mock):
     subproc_mock = MagicMock()
@@ -60,7 +64,7 @@ class TestGroupResource(TestCase):
     getgrnam_mock.assert_called_with('hadoop')
 
 
-  @patch.object(grp, "getgrnam")
+  @patch("grp.getgrnam")
   @patch.object(subprocess, "Popen")
   def test_action_create_existent(self, popen_mock, getgrnam_mock):
     subproc_mock = MagicMock()
@@ -82,7 +86,7 @@ class TestGroupResource(TestCase):
     getgrnam_mock.assert_called_with('mapred')
 
 
-  @patch.object(grp, "getgrnam")
+  @patch("grp.getgrnam")
   @patch.object(subprocess, "Popen")
   def test_action_create_fail(self, popen_mock, getgrnam_mock):
     subproc_mock = MagicMock()
@@ -107,7 +111,7 @@ class TestGroupResource(TestCase):
     getgrnam_mock.assert_called_with('mapred')
 
 
-  @patch.object(grp, "getgrnam")
+  @patch("grp.getgrnam")
   @patch.object(subprocess, "Popen")
   def test_action_remove(self, popen_mock, getgrnam_mock):
 
@@ -128,7 +132,7 @@ class TestGroupResource(TestCase):
     getgrnam_mock.assert_called_with('mapred')
 
 
-  @patch.object(grp, "getgrnam")
+  @patch("grp.getgrnam")
   @patch.object(subprocess, "Popen")
   def test_action_remove_fail(self, popen_mock, getgrnam_mock):
 

+ 18 - 18
ambari-agent/src/test/python/resource_management/TestLinkResource.py

@@ -18,9 +18,9 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
 
 from resource_management.core import Environment, Fail
-from resource_management.core import sudo
 from resource_management.core.system import System
 from resource_management.core.resources.system import Link
 
@@ -30,10 +30,10 @@ import os
 class TestLinkResource(TestCase):
 
   @patch.object(os.path, "realpath")
-  @patch.object(sudo,  "path_lexists")
-  @patch.object(sudo,  "path_lexists")
-  @patch.object(sudo, "unlink")
-  @patch.object(sudo, "symlink")
+  @patch("resource_management.core.sudo.path_lexists")
+  @patch("resource_management.core.sudo.path_lexists")
+  @patch("resource_management.core.sudo.unlink")
+  @patch("resource_management.core.sudo.symlink")
   def test_action_create_relink(self, symlink_mock, unlink_mock, 
                          islink_mock, lexists_mock,
                          realmock):
@@ -49,7 +49,7 @@ class TestLinkResource(TestCase):
     symlink_mock.assert_called_with("/a/b/link_to_path", "/some_path")
     
   @patch.object(os.path, "realpath")
-  @patch.object(sudo,  "path_lexists")
+  @patch("resource_management.core.sudo.path_lexists")
   def test_action_create_failed_due_to_file_exists(self, 
                          lexists_mock, realmock):
     lexists_mock.side_effect = [True, False]
@@ -65,8 +65,8 @@ class TestLinkResource(TestCase):
         self.assertEqual("Link['/some_path'] trying to create a symlink with the same name as an existing file or directory",
                        str(e))
         
-  @patch.object(sudo,  "path_lexists")
-  @patch.object(sudo, "symlink")
+  @patch("resource_management.core.sudo.path_lexists")
+  @patch("resource_management.core.sudo.symlink")
   def test_action_create_symlink_clean_create(self, symlink_mock, lexists_mock):
     lexists_mock.return_value = False
     
@@ -78,9 +78,9 @@ class TestLinkResource(TestCase):
     symlink_mock.assert_called_with("/a/b/link_to_path", "/some_path")
     
   @patch.object(os.path, "isdir")
-  @patch.object(sudo, "path_exists")  
-  @patch.object(sudo,  "path_lexists")
-  @patch.object(sudo, "link")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_lexists")
+  @patch("resource_management.core.sudo.link")
   def test_action_create_hardlink_clean_create(self, link_mock, lexists_mock,
                                         exists_mock, isdir_mock):
     lexists_mock.return_value = False
@@ -95,8 +95,8 @@ class TestLinkResource(TestCase):
       
     link_mock.assert_called_with("/a/b/link_to_path", "/some_path")
     
-  @patch.object(sudo, "path_exists")  
-  @patch.object(sudo,  "path_lexists")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_lexists")
   def test_action_create_hardlink_target_doesnt_exist(self, lexists_mock,
                                         exists_mock):
     lexists_mock.return_value = False
@@ -113,9 +113,9 @@ class TestLinkResource(TestCase):
         self.assertEqual('Failed to apply Link[\'/some_path\'], linking to nonexistent location /a/b/link_to_path',
                        str(e))
         
-  @patch.object(sudo, "path_isdir") 
-  @patch.object(sudo, "path_exists")  
-  @patch.object(sudo,  "path_lexists")
+  @patch("resource_management.core.sudo.path_isdir")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_lexists")
   def test_action_create_hardlink_target_is_dir(self, lexists_mock,
                                         exists_mock, isdir_mock):
     lexists_mock.return_value = False
@@ -133,8 +133,8 @@ class TestLinkResource(TestCase):
         self.assertEqual('Failed to apply Link[\'/some_path\'], cannot create hard link to a directory (/a/b/link_to_path)',
                        str(e)) 
         
-  @patch.object(sudo, "unlink")
-  @patch.object(sudo, "path_exists")
+  @patch("resource_management.core.sudo.unlink")
+  @patch("resource_management.core.sudo.path_exists")
   def test_action_delete(self, exists_mock, unlink_mock):     
     exists_mock.return_value = True
     

+ 19 - 17
ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py

@@ -24,7 +24,9 @@ import os
 import time
 from unittest import TestCase
 from mock.mock import patch, MagicMock
-from resource_management.core import Environment, sudo
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
+
+from resource_management.core import Environment
 from resource_management.core.system import System
 from resource_management.libraries import PropertiesFile
 
@@ -37,9 +39,9 @@ class TestPropertiesFIleResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_empty_properties_without_dir(self,
                                                       time_asctime_mock,
@@ -70,9 +72,9 @@ class TestPropertiesFIleResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_empty_properties_with_dir(self,
                                                    time_asctime_mock,
@@ -103,9 +105,9 @@ class TestPropertiesFIleResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_properties_simple(self,
                                            time_asctime_mock,
@@ -136,9 +138,9 @@ class TestPropertiesFIleResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_properties_with_metacharacters(self,
                                                         time_asctime_mock,
@@ -174,10 +176,10 @@ class TestPropertiesFIleResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "read_file")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.read_file")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_properties_rewrite_content(self,
                                                     time_asctime_mock,

+ 8 - 2
ambari-agent/src/test/python/resource_management/TestRepositoryResource.py

@@ -20,11 +20,17 @@ import os, sys
 import tempfile
 from unittest import TestCase
 from mock.mock import patch, MagicMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
 
-from resource_management import *
-from resource_management.libraries.providers import repository
+from resource_management.core.environment import Environment
+from resource_management.core.source import InlineTemplate
+from resource_management.core.system import System
+from resource_management.libraries.resources.repository import Repository
 from ambari_commons.os_check import OSCheck
 
+if get_platform() != PLATFORM_WINDOWS:
+  from resource_management.libraries.providers import repository
+
 class DummyTemplate(object):
 
   def __init__(self, name, extra_imports=[], **kwargs):

+ 18 - 14
ambari-agent/src/test/python/resource_management/TestUserResource.py

@@ -18,28 +18,32 @@ limitations under the License.
 
 from unittest import TestCase
 from mock.mock import patch, MagicMock, PropertyMock
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
 
 from resource_management.core import Environment, Fail
 from resource_management.core.system import System
 from resource_management.core.resources import User
-import pwd
 import subprocess
 import os
-import pty
 import select
 
+if get_platform() != PLATFORM_WINDOWS:
+  import pwd
+  import pty
+
+
 subproc_stdout = MagicMock()
 
 @patch.object(os, "read", new=MagicMock(return_value=None))
 @patch.object(select, "select", new=MagicMock(return_value=([subproc_stdout], None, None)))
 @patch.object(System, "os_family", new = 'redhat')
 @patch.object(os, "environ", new = {'PATH':'/bin'})
-@patch.object(pty, "openpty", new = MagicMock(return_value=(1,5)))
+@patch("pty.openpty", new = MagicMock(return_value=(1,5)))
 @patch.object(os, "close", new=MagicMock())
 class TestUserResource(TestCase):
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_action_create_nonexistent(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -53,7 +57,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
     
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_action_create_existent(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -68,7 +72,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_action_delete(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -83,7 +87,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_comment(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -99,7 +103,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_home(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -115,7 +119,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_password(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -131,7 +135,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_shell(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -146,7 +150,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_uid(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -161,7 +165,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_gid(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -177,7 +181,7 @@ class TestUserResource(TestCase):
 
   @patch('resource_management.core.providers.accounts.UserProvider.user_groups', new_callable=PropertyMock)
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_attribute_groups(self, getpwnam_mock, popen_mock, user_groups_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0
@@ -194,7 +198,7 @@ class TestUserResource(TestCase):
     self.assertEqual(popen_mock.call_count, 1)
 
   @patch.object(subprocess, "Popen")
-  @patch.object(pwd, "getpwnam")
+  @patch("pwd.getpwnam")
   def test_missing_shell_argument(self, getpwnam_mock, popen_mock):
     subproc_mock = MagicMock()
     subproc_mock.returncode = 0

+ 17 - 15
ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py

@@ -24,7 +24,9 @@ import os
 import time
 from unittest import TestCase
 from mock.mock import patch, MagicMock
-from resource_management.core import Environment, sudo
+from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS
+
+from resource_management.core import Environment
 from resource_management.core.system import System
 from resource_management.libraries import XmlConfig
 
@@ -37,9 +39,9 @@ class TestXmlConfigResource(TestCase):
   """
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_empty_xml_config(self,
                                           time_asctime_mock,
@@ -66,9 +68,9 @@ class TestXmlConfigResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_simple_xml_config(self,
                                            time_asctime_mock,
@@ -95,9 +97,9 @@ class TestXmlConfigResource(TestCase):
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_xml_config_with_metacharacters(self,
                                                         time_asctime_mock,
@@ -147,9 +149,9 @@ class TestXmlConfigResource(TestCase):
     create_file_mock.assert_called_with('/dir/conf/file.xml', u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>prop.1</name>\n      <value>&#39;.&#39;yyyy-MM-dd-HH</value>\n      <attr1>x</attr1>\n    </property>\n    \n    <property>\n      <name>prop.2</name>\n      <value>INFO, openjpa</value>\n    </property>\n    \n    <property>\n      <name>prop.3</name>\n      <value>%d{ISO8601} %5p %c{1}:%L - %m%n</value>\n      <attr2>value3</attr2>\n    </property>\n    \n    <property>\n      <name>prop.4</name>\n      <value>${oozie.log.dir}/oozie.log</value>\n      <attr_value_empty></attr_value_empty>\n      <attr2>value4</attr2>\n    </property>\n    \n    <property>\n      <name>prop.empty</name>\n      <value></value>\n      <attr_value_empty></attr_value_empty>\n    </property>\n    \n  </configuration>', encoding='UTF-8')
 
   @patch("resource_management.core.providers.system._ensure_metadata")
-  @patch.object(sudo, "create_file")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.create_file")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   @patch.object(time, "asctime")
   def test_action_create_xml_config_sorted_by_key(self,
                                                   time_asctime_mock,
@@ -180,8 +182,8 @@ class TestXmlConfigResource(TestCase):
     create_file_mock.assert_called_with('/dir/conf/file.xml', u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>first</name>\n      <value>should be first</value>\n    </property>\n    \n    <property>\n      <name>second</name>\n      <value>should be second</value>\n    </property>\n    \n    <property>\n      <name>third</name>\n      <value>should be third</value>\n    </property>\n    \n    <property>\n      <name>z_last</name>\n      <value>should be last</value>\n    </property>\n    \n  </configuration>', encoding='UTF-8')
 
   @patch("resource_management.libraries.providers.xml_config.File")
-  @patch.object(sudo, "path_exists")
-  @patch.object(sudo, "path_isdir")
+  @patch("resource_management.core.sudo.path_exists")
+  @patch("resource_management.core.sudo.path_isdir")
   def test_action_create_arguments(self, os_path_isdir_mock ,os_path_exists_mock, file_mock):
 
     os_path_isdir_mock.side_effect = [False, True]

+ 5 - 0
ambari-common/src/test/python/only_for_platform.py

@@ -45,3 +45,8 @@ def for_specific_platforms(systems):
     if platform.system() in systems:
       return obj
   return decorator
+
+if get_platform() != PLATFORM_WINDOWS:
+  os_distro_value = ('Suse','11','Final')
+else:
+  os_distro_value = ('win2012serverr2','6.3','WindowsServer')