##// END OF EJS Templates
patch queue: portability.notes
Danek Duvall -
r2985:4cdb68d7 default
parent child Browse files
Show More
@@ -1,33 +1,92 b''
1 A simple testing framework
1 A simple testing framework
2
2
3 To run the tests, do:
3 To run the tests, do:
4
4
5 cd tests/
5 cd tests/
6 python run-tests.py
6 python run-tests.py
7
7
8 This finds all scripts in the test directory named test-* and executes
8 This finds all scripts in the test directory named test-* and executes
9 them. The scripts can be either shell scripts or Python. Each test is
9 them. The scripts can be either shell scripts or Python. Each test is
10 run in a temporary directory that is removed when the test is complete.
10 run in a temporary directory that is removed when the test is complete.
11
11
12 A test-<x> succeeds if the script returns success and its output
12 A test-<x> succeeds if the script returns success and its output
13 matches test-<x>.out. If the new output doesn't match, it is stored in
13 matches test-<x>.out. If the new output doesn't match, it is stored in
14 test-<x>.err.
14 test-<x>.err.
15
15
16 There are some tricky points here that you should be aware of when
16 There are some tricky points here that you should be aware of when
17 writing tests:
17 writing tests:
18
18
19 - hg commit and hg merge want user interaction
19 - hg commit and hg merge want user interaction
20
20
21 for commit use -m "text"
21 for commit use -m "text"
22 for hg merge, set HGMERGE to something noninteractive (like true or merge)
22 for hg merge, set HGMERGE to something noninteractive (like true or merge)
23
23
24 - changeset hashes will change based on user and date which make
24 - changeset hashes will change based on user and date which make
25 things like hg history output change
25 things like hg history output change
26
26
27 use commit -m "test" -u test -d "1000000 0"
27 use commit -m "test" -u test -d "1000000 0"
28
28
29 - diff will show the current time
29 - diff will show the current time
30
30
31 use hg diff | sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
31 use hg diff | sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
32 -e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/"
32 -e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/"
33 to strip dates
33 to strip dates
34
35 You also need to be careful that the tests are portable from one platform
36 to another. You're probably working on Linux, where the GNU toolchain has
37 more (or different) functionality than on MacOS, *BSD, Solaris, AIX, etc.
38 While testing on all platforms is the only sure-fire way to make sure that
39 you've written portable code, here's a list of problems that have been
40 found and fixed in the tests. Another, more comprehensive list may be
41 found in the GNU Autoconf manual, online here:
42
43 http://www.gnu.org/software/autoconf/manual/html_node/Portable-Shell.html
44
45 sh:
46
47 The Bourne shell is a very basic shell. /bin/sh on Linux is typically
48 bash, which even in Bourne-shell mode has many features that Bourne shells
49 on other Unix systems don't have (and even on Linux /bin/sh isn't
50 guaranteed to be bash). You'll need to be careful about constructs that
51 seem ubiquitous, but are actually not available in the least common
52 denominator. While using another shell (ksh, bash explicitly, posix shell,
53 etc.) explicitly may seem like another option, these may not exist in a
54 portable location, and so are generally probably not a good idea. You may
55 find that rewriting the test in python will be easier.
56
57 - don't use pushd/popd; save the output of "pwd" and use "cd" in place of
58 the pushd, and cd back to the saved pwd instead of popd.
59
60 - don't use math expressions like let, (( ... )), or $(( ... )); use "expr"
61 instead.
62
63 grep:
64
65 - don't use the -q option; redirect stdout to /dev/null instead.
66
67 - don't use extended regular expressions with grep; use egrep instead, and
68 don't escape any regex operators.
69
70 sed:
71
72 - make sure that the beginning-of-line matcher ("^") is at the very
73 beginning of the expression -- it may not be supported inside parens.
74
75 echo:
76
77 - echo may interpret "\n" and print a newline; use printf instead if you
78 want a literal "\n" (backslash + n).
79
80 false:
81
82 - false is guaranteed only to return a non-zero value; you cannot depend on
83 it being 1. On Solaris in particular, /bin/false returns 255. Rewrite
84 your test to not depend on a particular return value, or create a
85 temporary "false" executable, and call that instead.
86
87 diff:
88
89 - don't use the -N option. There's no particularly good workaround short
90 of writing a reasonably complicated replacement script, but substituting
91 gdiff for diff if you can't rewrite the test not to need -N will probably
92 do.
General Comments 0
You need to be logged in to leave comments. Login now