Merge branch 'sg/stress-test'
[git/git.git] / t / lib-git-p4.sh
CommitLineData
fc002330 1#
6ab1d76c 2# Library code for git p4 tests
fc002330
PW
3#
4
c88015a4
PW
5# p4 tests never use the top-level repo; always build/clone into
6# a subdirectory called "$git"
7TEST_NO_CREATE_REPO=NoThanks
8
23aee419
LS
9# Some operations require multiple attempts to be successful. Define
10# here the maximal retry timeout in seconds.
11RETRY_TIMEOUT=60
12
842addef
LS
13# Sometimes p4d seems to hang. Terminate the p4d process automatically after
14# the defined timeout in seconds.
15P4D_TIMEOUT=300
16
fc002330
PW
17. ./test-lib.sh
18
cfa96496
PW
19if ! test_have_prereq PYTHON
20then
6ab1d76c 21 skip_all='skipping git p4 tests; python not available'
fc002330
PW
22 test_done
23fi
24( p4 -h && p4d -h ) >/dev/null 2>&1 || {
6ab1d76c 25 skip_all='skipping git p4 tests; no p4 or p4d'
fc002330
PW
26 test_done
27}
28
cfa96496
PW
29# On cygwin, the NT version of Perforce can be used. When giving
30# it paths, either on the command-line or in client specifications,
31# be sure to use the native windows form.
32#
33# Older versions of perforce were available compiled natively for
34# cygwin. Those do not accept native windows paths, so make sure
35# not to convert for them.
a98772c6 36native_path () {
cfa96496
PW
37 path="$1" &&
38 if test_have_prereq CYGWIN && ! p4 -V | grep -q CYGWIN
39 then
40 path=$(cygpath --windows "$path")
41 else
b8d5cf4f 42 path=$(test-tool path-utils real_path "$path")
cfa96496
PW
43 fi &&
44 echo "$path"
45}
46
23aee419
LS
47# On Solaris the 'date +%s' function is not supported and therefore we
48# need this replacement.
49# Attention: This function is not safe again against time offset updates
50# at runtime (e.g. via NTP). The 'clock_gettime(CLOCK_MONOTONIC)'
51# function could fix that but it is not in Python until 3.3.
a98772c6 52time_in_seconds () {
1fb3fb4e 53 (cd / && "$PYTHON_PATH" -c 'import time; print(int(time.time()))')
23aee419
LS
54}
55
fa840581 56test_set_port P4DPORT
fc002330 57
8c291350
PW
58P4PORT=localhost:$P4DPORT
59P4CLIENT=client
0055b56e 60P4USER=author
0cf1b72a 61P4EDITOR=true
79946031 62unset P4CHARSET
0055b56e 63export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET
fc002330
PW
64
65db="$TRASH_DIRECTORY/db"
cfa96496 66cli="$TRASH_DIRECTORY/cli"
fc002330
PW
67git="$TRASH_DIRECTORY/git"
68pidfile="$TRASH_DIRECTORY/p4d.pid"
69
dfe90e8b 70# Sometimes "prove" seems to hang on exit because p4d is still running
a98772c6 71cleanup () {
dfe90e8b
LS
72 if test -f "$pidfile"
73 then
74 kill -9 $(cat "$pidfile") 2>/dev/null && exit 255
75 fi
76}
77trap cleanup EXIT
78
0cf1b72a
PW
79# git p4 submit generates a temp file, which will
80# not get cleaned up if the submission fails. Don't
81# clutter up /tmp on the test machine.
82TMPDIR="$TRASH_DIRECTORY"
83export TMPDIR
84
a98772c6 85start_p4d () {
fc002330 86 mkdir -p "$db" "$cli" "$git" &&
f89f35a9 87 rm -f "$pidfile" &&
fc002330 88 (
6492a104
PW
89 cd "$db" &&
90 {
e80967b2 91 p4d -q -p $P4DPORT "$@" &
6492a104
PW
92 echo $! >"$pidfile"
93 }
fc002330 94 ) &&
f89f35a9
PW
95
96 # This gives p4d a long time to start up, as it can be
97 # quite slow depending on the machine. Set this environment
98 # variable to something smaller to fail faster in, say,
99 # an automated test setup. If the p4d process dies, that
100 # will be caught with the "kill -0" check below.
101 i=${P4D_START_PATIENCE:-300}
102 pid=$(cat "$pidfile")
842addef
LS
103
104 timeout=$(($(time_in_seconds) + $P4D_TIMEOUT))
105 while true
106 do
107 if test $(time_in_seconds) -gt $timeout
108 then
109 kill -9 $pid
110 exit 1
111 fi
112 sleep 1
113 done &
114 watchdog_pid=$!
115
f89f35a9
PW
116 ready=
117 while test $i -gt 0
118 do
119 # succeed when p4 client commands start to work
120 if p4 info >/dev/null 2>&1
121 then
122 ready=true
123 break
124 fi
125 # fail if p4d died
126 kill -0 $pid 2>/dev/null || break
127 echo waiting for p4d to start
fc002330 128 sleep 1
f89f35a9
PW
129 i=$(( $i - 1 ))
130 done
131
132 if test -z "$ready"
133 then
134 # p4d failed to start
135 return 1
136 fi
137
0055b56e
PW
138 # build a p4 user so author@example.com has an entry
139 p4_add_user author
140
f89f35a9 141 # build a client
daa38f4a
PW
142 client_view "//depot/... //client/..." &&
143
f89f35a9 144 return 0
fc002330
PW
145}
146
a98772c6 147p4_add_user () {
0055b56e
PW
148 name=$1 &&
149 p4 user -f -i <<-EOF
150 User: $name
151 Email: $name@example.com
152 FullName: Dr. $name
153 EOF
154}
155
26e6a27d
JD
156p4_add_job () {
157 p4 job -f -i <<-EOF
158 Job: $1
159 Status: open
160 User: dummy
161 Description:
162 EOF
163}
164
a98772c6 165retry_until_success () {
23aee419
LS
166 timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
167 until "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
168 do
169 sleep 1
170 done
171}
172
a98772c6 173retry_until_fail () {
23aee419
LS
174 timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
175 until ! "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
176 do
177 sleep 1
178 done
179}
180
a98772c6 181kill_p4d () {
fc002330 182 pid=$(cat "$pidfile")
23aee419
LS
183 retry_until_fail kill $pid
184 retry_until_fail kill -9 $pid
fc002330
PW
185 # complain if it would not die
186 test_must_fail kill $pid >/dev/null 2>&1 &&
842addef
LS
187 rm -rf "$db" "$cli" "$pidfile" &&
188 retry_until_fail kill -9 $watchdog_pid
fc002330
PW
189}
190
a98772c6 191cleanup_git () {
23aee419
LS
192 retry_until_success rm -r "$git"
193 test_must_fail test -d "$git" &&
194 retry_until_success mkdir "$git"
fc002330 195}
798d5980 196
a98772c6 197marshal_dump () {
798d5980
PW
198 what=$1 &&
199 line=${2:-1} &&
200 cat >"$TRASH_DIRECTORY/marshal-dump.py" <<-EOF &&
201 import marshal
202 import sys
84096814 203 instream = getattr(sys.stdin, 'buffer', sys.stdin)
798d5980 204 for i in range($line):
84096814
LD
205 d = marshal.load(instream)
206 print(d[b'$what'].decode('utf-8'))
798d5980
PW
207 EOF
208 "$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py"
209}
d2018293
PW
210
211#
212# Construct a client with this list of View lines
213#
a98772c6 214client_view () {
d2018293
PW
215 (
216 cat <<-EOF &&
50038ba9
PW
217 Client: $P4CLIENT
218 Description: $P4CLIENT
d2018293 219 Root: $cli
cfa96496 220 AltRoots: $(native_path "$cli")
e93f8695 221 LineEnd: unix
d2018293
PW
222 View:
223 EOF
6112541b 224 printf "\t%s\n" "$@"
d2018293
PW
225 ) | p4 client -i
226}
e9df0f9c 227
a98772c6 228is_cli_file_writeable () {
e9df0f9c
PW
229 # cygwin version of p4 does not set read-only attr,
230 # will be marked 444 but -w is true
231 file="$1" &&
232 if test_have_prereq CYGWIN && p4 -V | grep -q CYGWIN
233 then
234 stat=$(stat --format=%a "$file") &&
235 test $stat = 644
236 else
237 test -w "$file"
238 fi
239}