# -*- coding: utf-8 -*-
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for the namespaces.py module."""

from __future__ import print_function

import errno
import os
import sys
import unittest

from chromite.lib import cros_test_lib
from chromite.lib import namespaces


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


class SetNSTests(cros_test_lib.TestCase):
  """Tests for SetNS()"""

  def testBasic(self):
    """Simple functionality test."""
    NS_PATH = '/proc/self/ns/mnt'
    if not os.path.exists(NS_PATH):
      raise unittest.SkipTest('kernel too old (missing %s)' % NS_PATH)

    with open(NS_PATH) as f:
      try:
        namespaces.SetNS(f.fileno(), 0)
      except OSError as e:
        if e.errno != errno.EPERM:
          # Running as non-root will fail, so ignore it.  We ran most
          # of the code in the process which is all we really wanted.
          raise


class UnshareTests(cros_test_lib.TestCase):
  """Tests for Unshare()"""

  def testBasic(self):
    """Simple functionality test."""
    try:
      namespaces.Unshare(namespaces.CLONE_NEWNS)
    except OSError as e:
      if e.errno != errno.EPERM:
        # Running as non-root will fail, so ignore it.  We ran most
        # of the code in the process which is all we really wanted.
        raise
