# -*- encoding: UTF8 -*- # Test module for triggers. from __future__ import print_function import sys import P4 import logging import unittest, os, shutil, stat from subprocess import Popen, PIPE python3 = sys.version_info[0] >= 3 if sys.hexversion < 0x02070000 or (0x0300000 < sys.hexversion < 0x0303000): sys.exit("Python 2.7 or 3.3 or newer is required to run this program.") if python3: from configparser import ConfigParser from io import StringIO else: from ConfigParser import ConfigParser from StringIO import StringIO P4D = "p4d" P4USER = "testuser" P4CLIENT = "test_ws" INTEG_ENGINE = 3 saved_stdoutput = StringIO() test_logger = None def onRmTreeError(function, path, exc_info): os.chmod(path, stat.S_IWRITE) os.remove(path) def ensureDirectory(directory): if not os.path.isdir(directory): os.makedirs(directory) def localDirectory(root, *dirs): "Create and ensure it exists" dir_path = os.path.join(root, *dirs) ensureDirectory(dir_path) return dir_path def create_file(file_name, contents): "Create file with specified contents" ensureDirectory(os.path.dirname(file_name)) if python3: contents = bytes(contents.encode()) with open(file_name, 'wb') as f: f.write(contents) def append_to_file(file_name, contents): "Append contents to file" if python3: contents = bytes(contents.encode()) with open(file_name, 'ab+') as f: f.write(contents) def getP4ConfigFilename(): "Returns os specific filename" if 'P4CONFIG' in os.environ: return os.environ['P4CONFIG'] if os.name == "nt": return "p4config.txt" return ".p4config" class TestCase(unittest.TestCase): """Common structure""" def __init__(self, logger_name, log_file, methodName='runTest'): super(TestCase, self).__init__(methodName=methodName) if logger_name and log_file: self.logger = logging.getLogger(logger_name) self.logger.setLevel(logging.DEBUG) logformat = '%(levelname)s [%(asctime)s] [%(filename)s : %(lineno)d] - %(message)s' logging.basicConfig(format=logformat, filename=log_file, level=logging.DEBUG) # Python compatibility def assertRegex(self, *args, **kwargs): if python3: return super(TestCase, self).assertRegex(*args, **kwargs) else: return super(TestCase, self).assertRegexpMatches(*args, **kwargs) class P4Server: def __init__(self, logger=None): self.startdir = os.getcwd() self.root = os.path.join(self.startdir, 'testrun') if logger: self.logger = logger else: self.logger = logging.getLogger() self.server_root = os.path.join(self.root, "server") self.client_root = os.path.join(self.root, "client") self.cleanupTestTree() ensureDirectory(self.root) ensureDirectory(self.server_root) ensureDirectory(self.client_root) self.p4d = P4D self.port = "rsh:%s -r \"%s\" -L log -i" % (self.p4d, self.server_root) self.p4 = P4.P4() self.p4.port = self.port self.p4.user = P4USER self.p4.client = P4CLIENT self.p4.connect() self.p4cmd('depots') # triggers creation of the user self.p4cmd('configure', 'set', 'dm.integ.engine=%d' % INTEG_ENGINE) self.p4.disconnect() # required to pick up the configure changes self.p4.connect() self.client_name = P4CLIENT client = self.p4.fetch_client(self.client_name) client._root = self.client_root client._lineend = 'unix' self.p4.save_client(client) self.writeP4Config() def shutDown(self): if self.p4.connected(): self.p4.disconnect() def enableUnicode(self): cmd = [self.p4d, "-r", self.server_root, "-L", "log", "-vserver=3", "-xi"] f = Popen(cmd, stdout=PIPE).stdout for s in f.readlines(): pass f.close() def p4cmd(self, *args): "Execute p4 cmd while logging arguments and results" if not self.logger: self.logger = logging.getLogger() self.logger.debug('testp4: %s' % str(args)) output = self.p4.run(args) self.logger.debug('testp4r: %s' % str(output)) return output def cleanupTestTree(self): os.chdir(self.startdir) if os.path.isdir(self.root): shutil.rmtree(self.root, False, onRmTreeError) def writeP4Config(self): "Write appropriate files - useful for occasional manual debugging" p4config_filename = getP4ConfigFilename() config = os.path.join(self.root, p4config_filename) with open(config, "w") as fh: fh.write('P4PORT=%s\n' % self.port) fh.write('P4USER=%s\n' % self.p4.user) fh.write('P4CLIENT=%s\n' % self.p4.client)