generic/402: fix for updated behavior of timestamp limits
[xfstests-dev.git] / tests / generic / 402
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2016 Deepa Dinamani.  All Rights Reserved.
4 #
5 # FS QA Test 402
6 #
7 # Test to verify filesystem timestamps for supported ranges.
8 #
9 # Exit status 1: test failed.
10 # Exit status 0: test passed.
11 #
12 seq=`basename $0`
13 seqres=$RESULT_DIR/$seq
14 echo "QA output created by $seq"
15
16 here=`pwd`
17 tmp=/tmp/$$
18 status=1        # failure is the default!
19 trap "exit \$status" 0 1 2 3 15
20
21 # Get standard environment, filters and checks.
22 . ./common/rc
23 . ./common/filter
24 . ./common/attr
25
26 # remove previous $seqres.full before test
27 rm -f $seqres.full
28
29 # Prerequisites for the test run.
30 _supported_fs generic
31 _supported_os Linux
32 _require_scratch
33 _require_xfs_io_command utimes
34
35 # Compare file timestamps obtained from stat
36 # with a given timestamp.
37 check_stat()
38 {
39         file=$1
40         timestamp=$2
41
42         stat_timestamp=`stat -c"%X;%Y" $file`
43
44         prev_timestamp="$timestamp;$timestamp"
45         if [ $prev_timestamp != $stat_timestamp ]; then
46                 echo "$prev_timestamp != $stat_timestamp" | tee -a $seqres.full
47         fi
48 }
49
50 run_test_individual()
51 {
52         file=$1
53         timestamp=$2
54         update_time=$3
55
56         # check if the time needs update
57         if [ $update_time -eq 1 ]; then
58                 echo "Updating file: $file to timestamp $timestamp"  >> $seqres.full
59                 $XFS_IO_PROG -f -c "utimes $timestamp 0 $timestamp 0" $file
60                 if [ $? -ne 0 ]; then
61                         echo "Failed to update times on $file" | tee -a $seqres.full
62                 fi
63         fi
64
65         tsclamp=$((timestamp<tsmin?tsmin:timestamp>tsmax?tsmax:timestamp))
66         echo "Checking file: $file Updated timestamp is $tsclamp"  >> $seqres.full
67         check_stat $file $tsclamp
68 }
69
70 run_test()
71 {
72         update_time=$1
73
74         n=1
75
76         for TIME in "${TIMESTAMPS[@]}"; do
77                 run_test_individual ${SCRATCH_MNT}/test_$n $TIME $update_time
78                 ((n++))
79         done
80 }
81
82 _scratch_mkfs &>> $seqres.full 2>&1 || _fail "mkfs failed"
83 _require_timestamp_range $SCRATCH_DEV
84
85 read tsmin tsmax <<<$(_filesystem_timestamp_range $SCRATCH_DEV)
86 echo min supported timestamp $tsmin >> $seqres.full
87 echo max supported timestamp $tsmax >> $seqres.full
88
89 # Test timestamps array
90
91 declare -a TIMESTAMPS=(
92         $tsmin
93         0
94         $tsmax
95         $((tsmax/2))
96         $((tsmax+1))
97 )
98
99 _scratch_mount || _fail "scratch mount failed"
100
101 status=0
102
103 # Begin test case 1
104 echo "In memory timestamps update test start" >> $seqres.full
105
106 # update time on the file
107 update_time=1
108
109 run_test $update_time
110
111 echo "In memory timestamps update complete" >> $seqres.full
112
113 echo "Unmounting and mounting scratch $SCRATCH_MNT" >> $seqres.full
114
115 # unmount and remount $SCRATCH_DEV
116 _scratch_cycle_mount
117
118 # Begin test case 2
119
120 n=1
121
122 # Do not update time on the file this time, just read from disk
123 update_time=0
124
125 echo "On disk timestamps update test start" >> $seqres.full
126
127 # Re-run test
128 run_test $update_time
129
130 echo "On disk timestamps update test complete" >> $seqres.full
131
132 echo Silence is golden
133 exit