text: #!/usr/bin/env python
  # -*- encoding: utf-8 -*-
  #
  # Copyright © 2012 New Dream Network (DreamHost)
  #
  # Author: Doug Hellmann <doug.hellmann@dreamhost.com>
  #
  # 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.
  """Test base classes.
  """
  import functools
  import os.path
  import six
  
  from testtools import testcase
  
  from ceilometer.openstack.common import test
  from ceilometer.openstack.common import timeutils
  
  
  class BaseTestCase(test.BaseTestCase):
      def assertTimestampEqual(self, first, second, msg=None):
          """Checks that two timestamps are equals.
  
          This relies on assertAlmostEqual to avoid rounding problem, and only
          checks up the first microsecond values.
  
          """
          return self.assertAlmostEqual(
              timeutils.delta_seconds(first, second),
              0.0,
              places=5)
  
      @staticmethod
      def path_get(project_file=None):
          root = os.path.abspath(os.path.join(os.path.dirname(__file__),
                                              '..',
                                              '..',
                                              )
                                 )
          if project_file:
              return os.path.join(root, project_file)
          else:
              return root
  
  
  def _skip_decorator(func):
      @functools.wraps(func)
      def skip_if_not_implemented(*args, **kwargs):
          try:
              return func(*args, **kwargs)
          except AssertionError:
              raise
          except NotImplementedError as e:
              raise testcase.TestSkipped(six.text_type(e))
          except Exception as e:
              if 'not implemented' in six.text_type(e):
                  raise testcase.TestSkipped(six.text_type(e))
              raise
      return skip_if_not_implemented
  
  
  class SkipNotImplementedMeta(type):
      def __new__(cls, name, bases, local):
          for attr in local:
              value = local[attr]
              if callable(value) and (
                      attr.startswith('test_') or attr == 'setUp'):
                  local[attr] = _skip_decorator(value)
          return type.__new__(cls, name, bases, local)
  