def test_pathToCime_standaloneOnlyWithoutCime(self):
        """Test path_to_cime with standalone_only, where cime is missing"""
        ctsm_path = os.path.join(self._testdir, 'ctsm')
        os.makedirs(ctsm_path)

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            with six.assertRaisesRegex(self, RuntimeError, "Cannot find cime"):
                _ = path_utils.path_to_cime(standalone_only=True)
    def test_pathToCime_cimeInCesm(self):
        """Test path_to_cime, where cime is not in the standalone directory but
        is present in the CESM directory structure
        """
        ctsm_path, actual_path_to_cime = self._make_cesm_dirs()

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            path_to_cime = path_utils.path_to_cime()

        self.assertEqual(path_to_cime, actual_path_to_cime)
    def test_pathToCime_noCimeInCesm(self):
        """Test path_to_cime, where we appear to be within a CESM checkout, but
        there is no cime directory"""
        ctsm_path = self._ctsm_path_in_cesm()
        os.makedirs(ctsm_path)

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            with six.assertRaisesRegex(self, RuntimeError,
                                       "Cannot find cime.*or within CESM checkout"):
                _ = path_utils.path_to_cime()
    def test_pathToCime_standaloneOnlyWithCimeInCesm(self):
        """Test path_to_cime with standalone_only, where cime is missing from
        the standalone structure, but cime is present in the CESM
        directory structure: should raise an exception rather than
        finding that cime
        """
        ctsm_path, _ = self._make_cesm_dirs()

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            with six.assertRaisesRegex(self, RuntimeError, "Cannot find cime"):
                _ = path_utils.path_to_cime(standalone_only=True)
    def test_pathToCime_standaloneOnlyWithCime(self):
        """Test path_to_cime with standalone_only, where cime is in the location
        it should be with a standalone checkout
        """
        ctsm_path = os.path.join(self._testdir, 'ctsm')
        actual_path_to_cime = os.path.join(ctsm_path, 'cime')
        os.makedirs(actual_path_to_cime)

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            path_to_cime = path_utils.path_to_cime(standalone_only=True)

        self.assertEqual(path_to_cime, actual_path_to_cime)
    def test_pathToCime_notInCesmCheckout(self):
        """Test path_to_cime, where cime is not in the standalone directory, and
        we don't appear to be in a CESM checkout
        """
        ctsm_path = os.path.join(self._testdir, 'components', 'foo')
        os.makedirs(ctsm_path)
        os.makedirs(self._cime_path_in_cesm())

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            with six.assertRaisesRegex(self, RuntimeError,
                                       "Cannot find cime.*don't seem to be within a CESM checkout"):
                _ = path_utils.path_to_cime()
    def test_pathToCime_cimeInStandaloneAndCesm(self):
        """Test path_to_cime, where there is a cime directory both in the
        standalone checkout and in the enclosing CESM checkout. Should
        give us the cime in the standalone checkout.
        """
        ctsm_path, _ = self._make_cesm_dirs()
        actual_path_to_cime = os.path.join(ctsm_path, 'cime')
        os.makedirs(actual_path_to_cime)

        with mock.patch('ctsm.path_utils.path_to_ctsm_root',
                        return_value=ctsm_path):
            path_to_cime = path_utils.path_to_cime()

        self.assertEqual(path_to_cime, actual_path_to_cime)