aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/makefs/tests/makefs_msdos_tests.sh
blob: fb94429b477ba7eefa06a0926eac154a13d71ede (plain) (blame)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#-
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2025 The FreeBSD Foundation
#
# This software was developed by Klara, Inc.
# under sponsorship from the FreeBSD Foundation.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#

MAKEFS="makefs -t msdos"
MOUNT="mount_msdosfs"
. "$(dirname "$0")/makefs_tests_common.sh"

common_cleanup()
{
	if ! test_md_device=$(cat $TEST_MD_DEVICE_FILE); then
		echo "$TEST_MD_DEVICE_FILE could not be opened; has an md(4) device been attached?"
		return
	fi

	umount -f /dev/$test_md_device || :
	mdconfig -d -u $test_md_device || :
}

check_msdosfs_support()
{
	kldstat -m msdosfs || \
		atf_skip "Requires msdosfs filesystem support to be present in the kernel"
}

atf_test_case T_flag_dir cleanup
T_flag_dir_body()
{
	atf_expect_fail \
	    "The msdos backend saves the wrong timestamp value" \
	    "(possibly due to the 2s resolution for FAT timestamp)"
	timestamp=1742574909
	check_msdosfs_support

	create_test_dirs
	mkdir -p $TEST_INPUTS_DIR/dir1
	atf_check -e empty -o not-empty -s exit:0 \
	    $MAKEFS -T $timestamp -s 1m $TEST_IMAGE $TEST_INPUTS_DIR

	mount_image
	eval $(stat -s  $TEST_MOUNT_DIR/dir1)
	atf_check_equal $st_atime $timestamp
	atf_check_equal $st_mtime $timestamp
	atf_check_equal $st_ctime $timestamp
}

T_flag_dir_cleanup()
{
	common_cleanup
}

atf_test_case T_flag_F_flag cleanup
T_flag_F_flag_body()
{
	atf_expect_fail "-F doesn't take precedence over -T"
	timestamp_F=1742574909
	timestamp_T=1742574910
	create_test_dirs
	mkdir -p $TEST_INPUTS_DIR/dir1

	atf_check -e empty -o save:$TEST_SPEC_FILE -s exit:0 \
	    mtree -c -k "type,time" -p $TEST_INPUTS_DIR
	change_mtree_timestamp $TEST_SPEC_FILE $timestamp_F
	atf_check -e empty -o not-empty -s exit:0 \
	    $MAKEFS -F $TEST_SPEC_FILE -T $timestamp_T -s 1m $TEST_IMAGE $TEST_INPUTS_DIR

	mount_image
	eval $(stat -s  $TEST_MOUNT_DIR/dir1)
	atf_check_equal $st_atime $timestamp_F
	atf_check_equal $st_mtime $timestamp_F
	atf_check_equal $st_ctime $timestamp_F
}

T_flag_F_flag_cleanup()
{
	common_cleanup
}

atf_test_case T_flag_mtree cleanup
T_flag_mtree_body()
{
	timestamp=1742574908 # Even value, timestamp precision is 2s.
	check_msdosfs_support

	create_test_dirs
	mkdir -p $TEST_INPUTS_DIR/dir1
	atf_check -e empty -o save:$TEST_SPEC_FILE -s exit:0 \
	    mtree -c -k "type" -p $TEST_INPUTS_DIR
	atf_check -e empty -o not-empty -s exit:0 \
	    $MAKEFS -T $timestamp -s 1m  $TEST_IMAGE $TEST_SPEC_FILE

	mount_image
	eval $(stat -s  $TEST_MOUNT_DIR/dir1)
        # FAT directory entries don't have an access time, just a date.
	#atf_check_equal $st_atime $timestamp
	atf_check_equal $st_mtime $timestamp
	atf_check_equal $st_ctime $timestamp
}

T_flag_mtree_cleanup()
{
	common_cleanup
}

atf_init_test_cases()
{
	atf_add_test_case T_flag_dir
	atf_add_test_case T_flag_F_flag
	atf_add_test_case T_flag_mtree
}