summaryrefslogtreecommitdiff
path: root/tests/sys/cam/ctl/read_buffer.sh
blob: 98515943dd40f21fa38e7e87fe76fed73449ba60 (plain)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2024 Axcient
# All rights reserved.
#
# 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 DOCUMENTATION IS PROVIDED BY THE AUTHOR ``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 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.

# Not tested
# * modes other than "Data" and "Desc".  We don't support those.
# * Buffer ID other than 0.  We don't support those.
# * The Mode Specific field.  We don't support it.

. $(atf_get_srcdir)/ctl.subr

atf_test_case basic cleanup
basic_head()
{
	atf_set "descr" "READ BUFFER can retrieve data previously written by WRITE BUFFER"
	atf_set "require.user" "root"
	atf_set "require.progs" "sg_read_buffer sg_write_buffer ctladm"
}
basic_body()
{
	create_ramdisk

	# Write to its buffer
	cp /etc/passwd input
	len=`wc -c input | cut -wf 2`
	atf_check -o ignore sg_write_buffer --mode data --in=input /dev/$dev

	# Read it back
	atf_check -o save:output sg_read_buffer --mode data -l $len --raw /dev/$dev

	# And verify
	if ! diff -q input output; then
		atf_fail "Miscompare!"
	fi
}
basic_cleanup()
{
	cleanup
}

# Read from the Descriptor mode.  Along with Data, these are the only two modes
# we support.
atf_test_case desc cleanup
desc_head()
{
	atf_set "descr" "READ BUFFER can retrieve the buffer size via the DESCRIPTOR mode"
	atf_set "require.user" "root"
	atf_set "require.progs" "sg_read_buffer ctladm"
}
desc_body()
{
	create_ramdisk

	atf_check -o inline:" 00     00 04 00 00\n" sg_read_buffer --hex --mode desc /dev/$dev
}
desc_cleanup()
{
	cleanup
}

atf_test_case length cleanup
length_head()
{
	atf_set "descr" "READ BUFFER can limit its length with the LENGTH field"
	atf_set "require.user" "root"
	atf_set "require.progs" "sg_read_buffer sg_write_buffer ctladm"
}
length_body()
{
	create_ramdisk

	# Write to its buffer
	atf_check -o ignore -e ignore dd if=/dev/random of=input bs=4096 count=1
	atf_check -o ignore -e ignore dd if=input bs=2048 count=1 of=expected
	atf_check -o ignore sg_write_buffer --mode data --in=input /dev/$dev

	# Read it back
	atf_check -o save:output sg_read_buffer --mode data -l 2048 --raw /dev/$dev

	# And verify
	if ! diff -q expected output; then
		atf_fail "Miscompare!"
	fi
}
length_cleanup()
{
	cleanup
}

atf_test_case offset cleanup
offset_head()
{
	atf_set "descr" "READ BUFFER accepts the BUFFER OFFSET field"
	atf_set "require.user" "root"
	atf_set "require.progs" "sg_read_buffer sg_write_buffer ctladm"
}
offset_body()
{
	create_ramdisk

	# Write to its buffer
	atf_check -o ignore -e ignore dd if=/dev/random of=input bs=4096 count=1
	atf_check -o ignore -e ignore dd if=input iseek=2 bs=512 count=1 of=expected
	atf_check -o ignore sg_write_buffer --mode data --in=input /dev/$dev

	# Read it back
	atf_check -o save:output sg_read_buffer --mode data -l 512 -o 1024 --raw /dev/$dev

	# And verify
	if ! diff -q expected output; then
		atf_fail "Miscompare!"
	fi
}
offset_cleanup()
{
	cleanup
}

atf_test_case uninitialized cleanup
uninitialized_head()
{
	atf_set "descr" "READ BUFFER buffers are zero-initialized"
	atf_set "require.user" "root"
	atf_set "require.progs" "sg_read_buffer ctladm"
}
uninitialized_body()
{
	create_ramdisk

	# Read an uninitialized buffer
	atf_check -o save:output sg_read_buffer --mode data -l 262144 --raw /dev/$dev

	# And verify
	atf_check -o ignore -e ignore dd if=/dev/zero bs=262144 count=1 of=expected
	if ! diff -q expected output; then
		atf_fail "Miscompare!"
	fi
}
uninitialized_cleanup()
{
	cleanup
}

atf_init_test_cases()
{
	atf_add_test_case basic
	atf_add_test_case desc
	atf_add_test_case length
	atf_add_test_case offset
	atf_add_test_case uninitialized
}