File: Watchfd_-_Multiple_descriptors.test

package info (click to toggle)
pv 1.10.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,112 kB
  • sloc: ansic: 8,465; sh: 7,034; makefile: 132; sed: 39
file content (83 lines) | stat: -rwxr-xr-x 2,664 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/sh
#
# Check that watching a process's file descriptors works as expected.

# Allow all tests to be skipped, e.g. during a release build
test "${SKIP_ALL_TESTS}" = "1" && exit 77

true "${testSubject:?not set - call this from 'make check'}"
true "${workFile1:?not set - call this from 'make check'}"
true "${workFile2:?not set - call this from 'make check'}"
true "${workFile3:?not set - call this from 'make check'}"
true "${workFile4:?not set - call this from 'make check'}"

# Skip the test if "-d" is not available.
if ! "${testSubject}" -h | grep -Fq ' -d'; then
	echo "no \`--watchfd' / \`-d' option on this platform"
	exit 77
fi

seq 1 100 > "${workFile1}"
seq 1 300 > "${workFile2}"

# Run a background process to perform a few reads from a file, opening a
# second file after a moment.
# We only start doing anything once the PV process below has started (the
# workFile3 check).
# NB we just export line to make shellcheck think it's used.
true > "${workFile3}"
(
while test -e "${workFile3}" && ! test -s "${workFile3}"; do sleep 0.1; done
export line
sleep 1
read -r line
exec 9<"${workFile2}"
sleep 1
read -r line
sleep 1
) <"${workFile1}" &
pid=$!

sleep 0.1
"${testSubject}" -P "${workFile3}" -d "${pid}" -f -i 0.5 >/dev/null 2>"${workFile4}"

# Skip the test if "-d" does not work.
if grep -Fq ' -d: not available' "${workFile4}"; then
	echo "no \`--watchfd' / \`-d' option on this platform"
	exit 77
fi

# Process the output to make it easier to handle.
# NB "ESC [ A" is "cursor up", we turn that into "-" and a newline.
tr '\r' '\n' < "${workFile4}" | sed 's/.\[A/-!/g' | tr '!' '\n' > "${workFile1}"

# We should see at least 2 file positions for fd 0.
positionsReported="$(awk '/^ *0:/ {print $2}' < "${workFile1}" | sort -n | uniq)"
differentNumbers="$(printf "%s\n" "${positionsReported}" | grep -Ec .)"
if ! test "${differentNumbers}" -gt 1; then
	printf "%s\n" "Expected at least 2 different numbers to be output for fd 0"
	printf "%s:\n%s\n" "Positions reported" "${positionsReported}"
	printf "%s: %s\n" "Number of different values seen" "${differentNumbers}"
	printf "%s\n" "Raw output:"
	cat "${workFile1}"
	exit 1
fi

# We should see file descriptor 9 appear.
if ! grep -Eq '^ *9:' < "${workFile1}"; then
	printf "%s\n" "Expected to see information for fd 9"
	printf "%s\n" "Raw output:"
	cat "${workFile1}"
	exit 1
fi

# We should see the last 6 characters of fd 9's filename appear.
lastChars="$(printf "%s\n" "${workFile2}" | rev | cut -b1-6 | rev)"
if ! grep -Fq "${lastChars}:" < "${workFile1}"; then
	printf "%s\n" "Expected to see a filename for fd 9"
	printf "%s\n" "Raw output:"
	cat "${workFile1}"
	exit 1
fi

exit 0