from __future__ import print_function import unittest import time, os, sys import P4 pythonVer = "python" if sys.version_info[0] >= 3: pythonVer = "python3" parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, parent_dir) from p4testutils import TestCase, P4Server, localDirectory, create_file, append_to_file # from TestTriggers import TestTriggers os.environ["LOGS"] = "." LOGGER_NAME = "TestCheckCaseTrigger" LOG_FILE = "log-TestCheckCaseTrigger.log" # Handle Python2 version of os.makedirs def makedirs(folder, *args, **kwargs): if not os.path.exists(folder): os.makedirs(folder) def connect(func): def func_wrapper(self): self.p4.connect() self.assertTrue(self.p4.connected(), "Not connected") func(self) self.p4.disconnect() os.chdir(self.server.client_root) return func_wrapper class TestCheckCaseTrigger(TestCase): def __init__(self, methodName='runTest'): super(TestCheckCaseTrigger, self).__init__(LOGGER_NAME, LOG_FILE, methodName=methodName) def setUp(self): self.server = P4Server() trigpath = os.path.join(parent_dir, "CheckCaseTrigger.py") p4 = self.server.p4 self.client_root = self.server.client_root self.p4 = p4 p4.logger = self.logger # This works if no spaces in server root pathname! port = p4.port.replace('"', '') self.logger.debug("port: |%s|" % port) triggers = p4.fetch_triggers() triggers['Triggers'] = ['CheckCase change-submit //... " {} {} -p %quote%{}%quote% ' '-u {} %change% "'.format(pythonVer, trigpath, port, p4.user)] self.logger.debug(triggers) p4.save_triggers(triggers) # Reconnect to pick up changes p4.disconnect() p4.connect() def tearDown(self): if self.p4.connected(): self.p4.disconnect() time.sleep(1) # self.server.cleanupTestTree() def localFile(self, name): return os.path.join(self.client_root, name) def addFile(self, name): makedirs(self.client_root, exist_ok=True) path, filename = os.path.split(name) if path: pname = os.path.join(self.client_root, path) makedirs(pname, exist_ok=True) fname = os.path.join(self.client_root, name) with open(fname, "w") as f: f.write("Content") self.p4.run_add(fname) def _doSubmit(self, msg, *args): """Submits the changes""" try: result = self.p4.run_submit(*args) self.assertTrue( 'submittedChange' in result[-1], msg) except P4.P4Exception as inst: self.fail("submit failed with exception ") def createFiles(self, testDir): testAbsoluteDir = os.path.join(self.client_root, testDir) os.mkdir(testAbsoluteDir) # create a bunch of files files = ('foo.txt', 'bar.txt', 'baz.txt') for file in files: fname = os.path.join(testAbsoluteDir, file) f = open(fname, "w") f.write("Test Text") f.close() self.p4.run_add(fname) self.assertEqual(len(self.p4.run_opened()), len(files), "Unexpected number of open files") return files def expectFailSubmit(self, msg, desc): """Submits the changes, but expects to fail the trigger""" try: result = self.p4.run_submit("-d", desc) self.fail(msg) except P4.P4Exception as inst: pass # expected def expectSucceedSubmit(self, msg, desc): """Submits the change, but expects to succeed""" change = self.p4.fetch_change() change._description = desc self._doSubmit(msg, change) @connect def testSimpleSubmit(self): self.assertEqual(len(self.p4.run_opened()), 0, "Shouldn't have open files") testDir = 'test_files' files = self.createFiles(testDir) self.expectSucceedSubmit("Failed to submit the add", "My Add Test") @connect def testSimpleFail(self): self.addFile("foo") self.expectSucceedSubmit("Adding one file should not fail", "Simple Add") self.p4.run_sync("@0") self.addFile("Foo") self.expectFailSubmit("Did not catch foo != Foo", "Foo") @connect def testDirectoryFail(self): self.addFile("foo/bar") self.expectSucceedSubmit("Adding one file should not fail", "Simple Add") self.p4.run_sync("@0") self.addFile("FOO/bar") self.expectFailSubmit("Did not catch foo != FOO/bar", "bar") @connect def testRenameFile(self): self.addFile("foo") self.expectSucceedSubmit("Adding one file should not fail", "Simple Add") self.p4.run_edit(self.localFile("foo")) self.p4.run_move(self.localFile("foo"), self.localFile("bar")) self.expectSucceedSubmit("Renaming a file should not fail", "Simple Move") @connect @unittest.skipUnless(sys.platform.startswith("linux"), "requires linux") def testRenameFail(self): self.addFile("foo") self.addFile("bar") self.expectSucceedSubmit("Adding two files should not fail", "Double Add") self.p4.run_sync("%s@0" % self.localFile("bar")) self.p4.run_edit(self.localFile("foo")) self.p4.run_move(self.localFile("foo"), self.localFile("BAR")) self.expectFailSubmit("Moving into a file with existing naming conflict should not succeed", "Illegal move") @connect def testDirectoryConflictFail(self): self.addFile("foo") self.expectSucceedSubmit("Adding single file should not fail", "Simple Add") self.p4.run_sync("@0") self.addFile("FOO/bar") self.expectFailSubmit("Adding a directory conflicting with an existing file should not succeed", "Illegal add") @connect def testFileWithDirectoryConflictFail(self): self.addFile("FOO/bar") self.expectSucceedSubmit("Adding single file should not fail", "Simple Add") self.p4.run_sync("@0") os.rmdir(os.path.join(self.client_root, "FOO")) self.addFile("foo") self.expectFailSubmit("Adding a file conflicting with an existing directory should not succeed", "Illegal add") @connect @unittest.skipUnless(sys.platform.startswith("linux"), "requires linux") def testFileWithDirectorySameChangeFail(self): self.addFile("FOO/bar") self.addFile("foo") self.expectFailSubmit("Adding a file conflicting with an existing directory should not succeed", "Illegal add") @connect @unittest.skipUnless(sys.platform.startswith("linux"), "requires linux") def testMultipleFilesFail(self): self.addFile("foo") self.addFile("FOO") self.expectFailSubmit("Adding two conflicting files should not succeed", "Illegal add") @connect @unittest.skipUnless(sys.platform.startswith("linux"), "requires linux") def testMultipleDirectoriesFail(self): self.addFile("foo/foo") self.addFile("FOO/foo") self.expectFailSubmit("Adding two conflicting directories should not succeed", "Illegal add") @connect @unittest.skipUnless(sys.platform.startswith("linux"), "requires linux") def testMessageFail(self): self.addFile("foo") self.addFile("Foo") try: self.p4.run_submit('-d','Expect to fail') self.fail("Illegal add did not cause exception") except P4.P4Exception as exc: error = exc.errors[0] self.assertTrue('//depot/foo' in error) self.assertTrue('//depot/Foo' in error) if __name__ == '__main__': unittest.main()
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#12 | 29986 | Robert Cowham | Fix problem with edit only. | ||
#11 | 29972 | Robert Cowham | Fix unnecessary p4 dirs parameters for case sensitive servers. | ||
#10 | 29971 | Robert Cowham | Fix failing tests on case insensitive system | ||
#9 | 29970 | Robert Cowham | Avoid connection warning. | ||
#8 | 29964 | Robert Cowham |
Fixes for case sensitive server - all tests working again. Re-architected for better testing. |
||
#7 | 29921 | Robert Cowham | Fix problems with changelists spanning multiple depots | ||
#6 | 29320 | kathy_rayburn |
Fix bug the allowed adds of directories that differed only by case. Add test cases to verify that this bug is fixed. Add test case to verify that "p4 files -i" works as expected. Add ability to run test cases on a case-insensitive server. |
||
#5 | 29174 | kathy_rayburn |
Fix for directory case-only rename bug. Extensive modification of CheckCaseTrigger.py Addition of test cases to TestCheckCaseTrigger.py |
||
#4 | 29066 | kathy_rayburn |
#review-29062 CheckCaseTrigger.py performance changes and bug fix for file/directory case comparisons. Also, always call p4 describe -s, not p4 describe. |
||
#3 | 28996 | Robert Cowham | Fix checkCase test and use python ver in the triggers definition. | ||
#2 | 28082 | Robert Cowham | Handle python2 | ||
#1 | 26652 | Robert Cowham |
This is Tom's change: Introduced new 'Unsupported' directory to clarify that some files in the SDP are not officially supported. These files are samples for illustration, to provide examples, or are deprecated but not yet ready for removal from the package. The Maintenance and many SDP triggers have been moved under here, along with other SDP scripts and triggers. Added comments to p4_vars indicating that it should not be edited directly. Added reference to an optional site_global_vars file that, if it exists, will be sourced to provide global user settings without needing to edit p4_vars. As an exception to the refactoring, the totalusers.py Maintenance script will be moved to indicate that it is supported. Removed settings to support long-sunset P4Web from supported structure. Structure under new .../Unsupported folder is: Samples/bin Sample scripts. Samples/triggers Sample trigger scripts. Samples/triggers/tests Sample trigger script tests. Samples/broker Sample broker filter scripts. Deprecated/triggers Deprecated triggers. To Do in a subsequent change: Make corresponding doc changes. |
||
//guest/perforce_software/sdp/dev/Server/Unix/p4/common/bin/triggers/tests/TestCheckCaseTrigger.py | |||||
#1 | 25715 | Robert Cowham |
Refactor CheckCaseTrigger to work in SDP trigger style - and fix SDP failures. Added modified version of Sven's test harness which works (for Mac at least where some tests must be skipped due to filesystem being case insensitive). |