diff --git a/tests/super_mox.py b/tests/super_mox.py new file mode 100644 index 0000000000..6102170c47 --- /dev/null +++ b/tests/super_mox.py @@ -0,0 +1,91 @@ +#!/usr/bin/python +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Simplify unit tests based on pymox.""" + +import os +import random +import string + +mox = None + +def OnTestsLoad(): + import sys + old_path = sys.path + global mox + try: + directory, _file = os.path.split(__file__) + sys.path.append(os.path.abspath(os.path.join(directory, 'pymox'))) + sys.path.append(os.path.abspath(os.path.join(directory, '..'))) + try: + import mox as Mox + mox = Mox + except ImportError: + print "Trying to automatically checkout pymox." + import subprocess + subprocess.call(['svn', 'co', 'http://pymox.googlecode.com/svn/trunk', + os.path.join(directory, 'pymox')], + shell=True) + try: + import mox as Mox + mox = Mox + except ImportError: + print >> sys.stderr, ("\nError, failed to load pymox\n") + raise + finally: + # Restore the path + sys.path = old_path + + +# Automatically fetch pymox. +OnTestsLoad() + + +class SuperMoxTestBase(mox.MoxTestBase): + # Backup the separator in case it gets mocked + _OS_SEP = os.sep + _RANDOM_CHOICE = random.choice + _RANDOM_RANDINT = random.randint + _STRING_LETTERS = string.letters + + ## Some utilities for generating arbitrary arguments. + def String(self, max_length): + return ''.join([self._RANDOM_CHOICE(self._STRING_LETTERS) + for x in xrange(self._RANDOM_RANDINT(1, max_length))]) + + def Strings(self, max_arg_count, max_arg_length): + return [self.String(max_arg_length) for x in xrange(max_arg_count)] + + def Args(self, max_arg_count=8, max_arg_length=16): + return self.Strings(max_arg_count, + self._RANDOM_RANDINT(1, max_arg_length)) + + def _DirElts(self, max_elt_count=4, max_elt_length=8): + return self._OS_SEP.join(self.Strings(max_elt_count, max_elt_length)) + + def Dir(self, max_elt_count=4, max_elt_length=8): + return (self._RANDOM_CHOICE((self._OS_SEP, '')) + + self._DirElts(max_elt_count, max_elt_length)) + + def Url(self, max_elt_count=4, max_elt_length=8): + return ('svn://random_host:port/a' + + self._DirElts(max_elt_count, max_elt_length + ).replace(self._OS_SEP, '/')) + + def RootDir(self, max_elt_count=4, max_elt_length=8): + return self._OS_SEP + self._DirElts(max_elt_count, max_elt_length) + + def compareMembers(self, object, members): + """If you add a member, be sure to add the relevant test!""" + # Skip over members starting with '_' since they are usually not meant to + # be for public use. + actual_members = [x for x in sorted(dir(object)) + if not x.startswith('_')] + expected_members = sorted(members) + if actual_members != expected_members: + diff = ([i for i in actual_members if i not in expected_members] + + [i for i in expected_members if i not in actual_members]) + print diff + self.assertEqual(actual_members, expected_members)