📄 basic_tests.py
字号:
#!/usr/bin/env python## basic_tests.py: testing working-copy interactions with ra_local## Subversion is a tool for revision control. # See http://subversion.tigris.org for more information.# # ====================================================================# Copyright (c) 2000-2006 CollabNet. All rights reserved.## This software is licensed as described in the file COPYING, which# you should have received as part of this distribution. The terms# are also available at http://subversion.tigris.org/license-1.html.# If newer versions of this license are posted there, you may use a# newer version instead, at your option.######################################################################## General modulesimport shutil, stat, string, sys, re, os.path# Our testing moduleimport svntestfrom svntest import wc, SVNAnyOutput# (abbreviation)Skip = svntest.testcase.SkipXFail = svntest.testcase.XFailItem = wc.StateItem#----------------------------------------------------------------------def expect_extra_files(node, extra_files): """singleton handler for expected singletons""" for pattern in extra_files: mo = re.match(pattern, node.name) if mo: extra_files.pop(extra_files.index(pattern)) return print "Found unexpected object:", node.name raise svntest.main.SVNTreeUnequal####################################################################### Tests## Each test must return on success or raise on failure.#----------------------------------------------------------------------def basic_checkout(sbox): "basic checkout of a wc" sbox.build() wc_dir = sbox.wc_dir # Checkout of a different URL into a working copy fails A_url = svntest.main.current_repo_url + '/A' svntest.actions.run_and_verify_svn("No error where some expected", None, SVNAnyOutput, # "Obstructed update", 'co', A_url, '--username', svntest.main.wc_author, '--password', svntest.main.wc_passwd, wc_dir) # Make some changes to the working copy mu_path = os.path.join(wc_dir, 'A', 'mu') svntest.main.file_append (mu_path, 'appended mu text') lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda') os.remove(lambda_path) G_path = os.path.join(wc_dir, 'A', 'D', 'G') svntest.actions.run_and_verify_svn(None, None, [], 'rm', G_path) expected_output = svntest.actions.get_virginal_state(wc_dir, 1) expected_output.tweak('A/mu', status='M ') expected_output.tweak('A/B/lambda', status='! ') expected_output.tweak('A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau', status='D ') svntest.actions.run_and_verify_status(wc_dir, expected_output) # Repeat checkout of original URL into working copy with modifications url = svntest.main.current_repo_url svntest.actions.run_and_verify_svn("Repeat checkout failed", None, [], 'co', url, '--username', svntest.main.wc_author, '--password', svntest.main.wc_passwd, wc_dir) # lambda is restored, modifications remain, deletes remain scheduled # for deletion although files are restored to the filesystem expected_output.tweak('A/B/lambda', status=' ') svntest.actions.run_and_verify_status (wc_dir, expected_output)#----------------------------------------------------------------------def basic_status(sbox): "basic status command" sbox.build() wc_dir = sbox.wc_dir # Created expected output tree for 'svn status' output = svntest.actions.get_virginal_state(wc_dir, 1) svntest.actions.run_and_verify_status(wc_dir, output) current_dir = os.getcwd() try: os.chdir(os.path.join(wc_dir, 'A')) output = svntest.actions.get_virginal_state("..", 1) svntest.actions.run_and_verify_status("..", output) finally: os.chdir(current_dir) #----------------------------------------------------------------------def basic_commit(sbox): "basic commit command" sbox.build() wc_dir = sbox.wc_dir # Make a couple of local mods to files mu_path = os.path.join(wc_dir, 'A', 'mu') rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho') svntest.main.file_append (mu_path, 'appended mu text') svntest.main.file_append (rho_path, 'new appended text for rho') # Created expected output tree for 'svn ci' expected_output = wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), 'A/D/G/rho' : Item(verb='Sending'), }) # Create expected status tree; all local revisions should be at 1, # but mu and rho should be at revision 2. expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak(wc_rev=1) expected_status.tweak('A/mu', 'A/D/G/rho', wc_rev=2) svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, None, None, None, None, None, wc_dir) #----------------------------------------------------------------------def basic_update(sbox): "basic update command" sbox.build() wc_dir = sbox.wc_dir # Make a backup copy of the working copy wc_backup = sbox.add_wc_path('backup') svntest.actions.duplicate_dir(wc_dir, wc_backup) # Make a couple of local mods to files mu_path = os.path.join(wc_dir, 'A', 'mu') rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho') svntest.main.file_append (mu_path, 'appended mu text') svntest.main.file_append (rho_path, 'new appended text for rho') # Created expected output tree for 'svn ci' expected_output = wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), 'A/D/G/rho' : Item(verb='Sending'), }) # Create expected status tree; all local revisions should be at 1, # but mu and rho should be at revision 2. expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak(wc_rev=1) expected_status.tweak('A/mu', 'A/D/G/rho', wc_rev=2) # Commit. svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, None, None, None, None, None, wc_dir) # Create expected output tree for an update of the wc_backup. expected_output = wc.State(wc_backup, { 'A/mu' : Item(status='U '), 'A/D/G/rho' : Item(status='U '), }) # Create expected disk tree for the update. expected_disk = svntest.main.greek_state.copy() expected_disk.tweak('A/mu', contents=expected_disk.desc['A/mu'].contents + 'appended mu text') expected_disk.tweak('A/D/G/rho', contents=expected_disk.desc['A/D/G/rho'].contents + 'new appended text for rho') # Create expected status tree for the update. expected_status = svntest.actions.get_virginal_state(wc_backup, 2) # Do the update and check the results in three ways. svntest.actions.run_and_verify_update(wc_backup, expected_output, expected_disk, expected_status) # Unversioned paths, those that are not immediate children of a versioned # path, are skipped and do not raise an error xx_path = os.path.join(wc_dir, 'xx', 'xx') out, err = svntest.actions.run_and_verify_svn("update xx/xx", ["Skipped '"+xx_path+"'\n"], [], 'update', xx_path) out, err = svntest.actions.run_and_verify_svn("update xx/xx", [], [], 'update', '--quiet', xx_path)#----------------------------------------------------------------------def basic_mkdir_url(sbox): "basic mkdir URL" sbox.build() Y_url = svntest.main.current_repo_url + '/Y' Y_Z_url = svntest.main.current_repo_url + '/Y/Z' svntest.actions.run_and_verify_svn("mkdir URL URL/subdir", ["\n", "Committed revision 2.\n"], [], 'mkdir', '-m', 'log_msg', Y_url, Y_Z_url) expected_output = wc.State(sbox.wc_dir, { 'Y' : Item(status='A '), 'Y/Z' : Item(status='A '), }) expected_disk = svntest.main.greek_state.copy() expected_disk.add({ 'Y' : Item(), 'Y/Z' : Item() }) expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 2) expected_status.add({ 'Y' : Item(status=' ', wc_rev=2), 'Y/Z' : Item(status=' ', wc_rev=2) }) svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output, expected_disk, expected_status)#----------------------------------------------------------------------def basic_corruption(sbox): "basic corruption detection" ## I always wanted a test named "basic_corruption". :-) ## Here's how it works: ## ## 1. Make a working copy at rev 1, duplicate it. Now we have ## two working copies at rev 1. Call them first and second. ## 2. Make a local mod to `first/A/mu'. ## 3. Intentionally corrupt `first/A/.svn/text-base/mu.svn-base'. ## 4. Try to commit, expect a failure. ## 5. Repair the text-base, commit again, expect success. ## 6. Intentionally corrupt `second/A/.svn/text-base/mu.svn-base'. ## 7. Try to update `second', expect failure. ## 8. Repair the text-base, update again, expect success. ## ## Here we go... sbox.build() wc_dir = sbox.wc_dir # Make the "other" working copy other_wc = sbox.add_wc_path('other') svntest.actions.duplicate_dir (wc_dir, other_wc) # Make a local mod to mu mu_path = os.path.join (wc_dir, 'A', 'mu') svntest.main.file_append (mu_path, 'appended mu text') # Created expected output tree for 'svn ci' expected_output = wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), }) # Create expected status tree; all local revisions should be at 1, # but mu should be at revision 2. expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak(wc_rev=1) expected_status.tweak('A/mu', wc_rev=2) # Modify mu's text-base, so we get a checksum failure the first time # we try to commit. tb_dir_path = os.path.join (wc_dir, 'A', svntest.main.get_admin_name(), 'text-base') mu_tb_path = os.path.join (tb_dir_path, 'mu.svn-base') mu_saved_tb_path = mu_tb_path + "-saved" tb_dir_saved_mode = os.stat(tb_dir_path)[stat.ST_MODE] mu_tb_saved_mode = os.stat(mu_tb_path)[stat.ST_MODE] os.chmod (tb_dir_path, 0777) # ### What's a more portable way to do this? os.chmod (mu_tb_path, 0666) # ### Would rather not use hardcoded numbers. shutil.copyfile (mu_tb_path, mu_saved_tb_path) svntest.main.file_append (mu_tb_path, 'Aaagggkkk, corruption!') os.chmod (tb_dir_path, tb_dir_saved_mode) os.chmod (mu_tb_path, mu_tb_saved_mode) # This commit should fail due to text base corruption. svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, "svn: Checksum", None, None, None, None, wc_dir) # Restore the uncorrupted text base. os.chmod (tb_dir_path, 0777) os.chmod (mu_tb_path, 0666) os.remove (mu_tb_path) os.rename (mu_saved_tb_path, mu_tb_path) os.chmod (tb_dir_path, tb_dir_saved_mode) os.chmod (mu_tb_path, mu_tb_saved_mode) # This commit should succeed. svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, None, None, None, None, None, wc_dir) # Create expected output tree for an update of the other_wc. expected_output = wc.State(other_wc, { 'A/mu' : Item(status='U '), }) # Create expected disk tree for the update. expected_disk = svntest.main.greek_state.copy() expected_disk.tweak('A/mu', contents=expected_disk.desc['A/mu'].contents + 'appended mu text') # Create expected status tree for the update. expected_status = svntest.actions.get_virginal_state(other_wc, 2) # Modify mu's text-base, so we get a checksum failure the first time # we try to update. tb_dir_path = os.path.join (other_wc, 'A',
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -