📄 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-2004 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 modules
import shutil, stat, string, sys, re, os.path
# Our testing module
import svntest
from svntest import wc, SVNAnyOutput
# (abbreviation)
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = 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 disk 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)
#----------------------------------------------------------------------
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)
#----------------------------------------------------------------------
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, repos_rev=2),
'Y/Z' : Item(status=' ', wc_rev=2, repos_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', '.svn', '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', '.svn', '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)
os.chmod (mu_tb_path, 0666)
shutil.copyfile (mu_tb_path, mu_saved_tb_path)
svntest.main.file_append (mu_tb_path, 'Aiyeeeee, corruption!\nHelp!\n')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -