blob: 05fefa53a0e22ce4557d18b7d1d685c0e0d56802 [file] [log] [blame]
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +09001# SPDX-License-Identifier: GPL-2.0+
2# Copyright (c) 2018, Linaro Limited
3# Author: Takahiro Akashi <takahiro.akashi@linaro.org>
4#
5# U-Boot File System:Exntented Test
6
7"""
8This test verifies extended write operation on file system.
9"""
10
Stefan Herbrechtsmeiera09bcfe2023-03-22 09:46:02 +010011import os.path
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090012import pytest
13import re
Stefan Herbrechtsmeiera09bcfe2023-03-22 09:46:02 +010014from subprocess import check_output
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090015from fstest_defs import *
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +010016from fstest_helpers import assert_fs_integrity
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090017
Stefan Herbrechtsmeiera09bcfe2023-03-22 09:46:02 +010018PLAIN_FILE='abcdefgh.txt'
19MANGLE_FILE='abcdefghi.txt'
20
21def str2fat(long_filename):
22 splitext = os.path.splitext(long_filename.upper())
23 name = splitext[0]
24 ext = splitext[1][1:]
25 if len(name) > 8:
26 name = '%s~1' % name[:6]
27 return '%-8s %s' % (name, ext)
28
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090029@pytest.mark.boardspec('sandbox')
Simon Glass3fcb8282018-11-18 08:14:29 -070030@pytest.mark.slow
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090031class TestFsExt(object):
32 def test_fs_ext1(self, u_boot_console, fs_obj_ext):
33 """
34 Test Case 1 - write a file with absolute path
35 """
36 fs_type,fs_img,md5val = fs_obj_ext
37 with u_boot_console.log.section('Test Case 1 - write with abs path'):
38 # Test Case 1a - Check if command successfully returned
39 output = u_boot_console.run_command_list([
40 'host bind 0 %s' % fs_img,
41 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
42 '%swrite host 0:0 %x /dir1/%s.w1 $filesize'
43 % (fs_type, ADDR, MIN_FILE)])
44 assert('20480 bytes written' in ''.join(output))
45
46 # Test Case 1b - Check md5 of file content
47 output = u_boot_console.run_command_list([
48 'mw.b %x 00 100' % ADDR,
49 '%sload host 0:0 %x /dir1/%s.w1' % (fs_type, ADDR, MIN_FILE),
50 'md5sum %x $filesize' % ADDR,
51 'setenv filesize'])
52 assert(md5val[0] in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +010053 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090054
55 def test_fs_ext2(self, u_boot_console, fs_obj_ext):
56 """
57 Test Case 2 - write to a file with relative path
58 """
59 fs_type,fs_img,md5val = fs_obj_ext
60 with u_boot_console.log.section('Test Case 2 - write with rel path'):
61 # Test Case 2a - Check if command successfully returned
62 output = u_boot_console.run_command_list([
63 'host bind 0 %s' % fs_img,
64 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
65 '%swrite host 0:0 %x dir1/%s.w2 $filesize'
66 % (fs_type, ADDR, MIN_FILE)])
67 assert('20480 bytes written' in ''.join(output))
68
69 # Test Case 2b - Check md5 of file content
70 output = u_boot_console.run_command_list([
71 'mw.b %x 00 100' % ADDR,
72 '%sload host 0:0 %x dir1/%s.w2' % (fs_type, ADDR, MIN_FILE),
73 'md5sum %x $filesize' % ADDR,
74 'setenv filesize'])
75 assert(md5val[0] in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +010076 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090077
78 def test_fs_ext3(self, u_boot_console, fs_obj_ext):
79 """
80 Test Case 3 - write to a file with invalid path
81 """
82 fs_type,fs_img,md5val = fs_obj_ext
83 with u_boot_console.log.section('Test Case 3 - write with invalid path'):
84 # Test Case 3 - Check if command expectedly failed
85 output = u_boot_console.run_command_list([
86 'host bind 0 %s' % fs_img,
87 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
88 '%swrite host 0:0 %x /dir1/none/%s.w3 $filesize'
89 % (fs_type, ADDR, MIN_FILE)])
Lad Prabhakarfad2e882020-10-20 08:45:46 +010090 assert('Unable to write file /dir1/none/' in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +010091 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +090092
93 def test_fs_ext4(self, u_boot_console, fs_obj_ext):
94 """
95 Test Case 4 - write at non-zero offset, enlarging file size
96 """
97 fs_type,fs_img,md5val = fs_obj_ext
98 with u_boot_console.log.section('Test Case 4 - write at non-zero offset, enlarging file size'):
99 # Test Case 4a - Check if command successfully returned
100 output = u_boot_console.run_command_list([
101 'host bind 0 %s' % fs_img,
102 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
103 '%swrite host 0:0 %x /dir1/%s.w4 $filesize'
104 % (fs_type, ADDR, MIN_FILE)])
105 output = u_boot_console.run_command(
106 '%swrite host 0:0 %x /dir1/%s.w4 $filesize 0x1400'
107 % (fs_type, ADDR, MIN_FILE))
108 assert('20480 bytes written' in output)
109
110 # Test Case 4b - Check size of written file
111 output = u_boot_console.run_command_list([
112 '%ssize host 0:0 /dir1/%s.w4' % (fs_type, MIN_FILE),
113 'printenv filesize',
114 'setenv filesize'])
115 assert('filesize=6400' in ''.join(output))
116
117 # Test Case 4c - Check md5 of file content
118 output = u_boot_console.run_command_list([
119 'mw.b %x 00 100' % ADDR,
120 '%sload host 0:0 %x /dir1/%s.w4' % (fs_type, ADDR, MIN_FILE),
121 'md5sum %x $filesize' % ADDR,
122 'setenv filesize'])
123 assert(md5val[1] in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100124 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +0900125
126 def test_fs_ext5(self, u_boot_console, fs_obj_ext):
127 """
128 Test Case 5 - write at non-zero offset, shrinking file size
129 """
130 fs_type,fs_img,md5val = fs_obj_ext
131 with u_boot_console.log.section('Test Case 5 - write at non-zero offset, shrinking file size'):
132 # Test Case 5a - Check if command successfully returned
133 output = u_boot_console.run_command_list([
134 'host bind 0 %s' % fs_img,
135 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
136 '%swrite host 0:0 %x /dir1/%s.w5 $filesize'
137 % (fs_type, ADDR, MIN_FILE)])
138 output = u_boot_console.run_command(
139 '%swrite host 0:0 %x /dir1/%s.w5 0x1400 0x1400'
140 % (fs_type, ADDR, MIN_FILE))
141 assert('5120 bytes written' in output)
142
143 # Test Case 5b - Check size of written file
144 output = u_boot_console.run_command_list([
145 '%ssize host 0:0 /dir1/%s.w5' % (fs_type, MIN_FILE),
146 'printenv filesize',
147 'setenv filesize'])
148 assert('filesize=2800' in ''.join(output))
149
150 # Test Case 5c - Check md5 of file content
151 output = u_boot_console.run_command_list([
152 'mw.b %x 00 100' % ADDR,
153 '%sload host 0:0 %x /dir1/%s.w5' % (fs_type, ADDR, MIN_FILE),
154 'md5sum %x $filesize' % ADDR,
155 'setenv filesize'])
156 assert(md5val[2] in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100157 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +0900158
159 def test_fs_ext6(self, u_boot_console, fs_obj_ext):
160 """
161 Test Case 6 - write nothing at the start, truncating to zero
162 """
163 fs_type,fs_img,md5val = fs_obj_ext
164 with u_boot_console.log.section('Test Case 6 - write nothing at the start, truncating to zero'):
165 # Test Case 6a - Check if command successfully returned
166 output = u_boot_console.run_command_list([
167 'host bind 0 %s' % fs_img,
168 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
169 '%swrite host 0:0 %x /dir1/%s.w6 $filesize'
170 % (fs_type, ADDR, MIN_FILE)])
171 output = u_boot_console.run_command(
172 '%swrite host 0:0 %x /dir1/%s.w6 0 0'
173 % (fs_type, ADDR, MIN_FILE))
174 assert('0 bytes written' in output)
175
176 # Test Case 6b - Check size of written file
177 output = u_boot_console.run_command_list([
178 '%ssize host 0:0 /dir1/%s.w6' % (fs_type, MIN_FILE),
179 'printenv filesize',
180 'setenv filesize'])
181 assert('filesize=0' in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100182 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +0900183
184 def test_fs_ext7(self, u_boot_console, fs_obj_ext):
185 """
186 Test Case 7 - write at the end (append)
187 """
188 fs_type,fs_img,md5val = fs_obj_ext
189 with u_boot_console.log.section('Test Case 7 - write at the end (append)'):
190 # Test Case 7a - Check if command successfully returned
191 output = u_boot_console.run_command_list([
192 'host bind 0 %s' % fs_img,
193 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
194 '%swrite host 0:0 %x /dir1/%s.w7 $filesize'
195 % (fs_type, ADDR, MIN_FILE)])
196 output = u_boot_console.run_command(
197 '%swrite host 0:0 %x /dir1/%s.w7 $filesize $filesize'
198 % (fs_type, ADDR, MIN_FILE))
199 assert('20480 bytes written' in output)
200
201 # Test Case 7b - Check size of written file
202 output = u_boot_console.run_command_list([
203 '%ssize host 0:0 /dir1/%s.w7' % (fs_type, MIN_FILE),
204 'printenv filesize',
205 'setenv filesize'])
206 assert('filesize=a000' in ''.join(output))
207
208 # Test Case 7c - Check md5 of file content
209 output = u_boot_console.run_command_list([
210 'mw.b %x 00 100' % ADDR,
211 '%sload host 0:0 %x /dir1/%s.w7' % (fs_type, ADDR, MIN_FILE),
212 'md5sum %x $filesize' % ADDR,
213 'setenv filesize'])
214 assert(md5val[3] in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100215 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +0900216
217 def test_fs_ext8(self, u_boot_console, fs_obj_ext):
218 """
219 Test Case 8 - write at offset beyond the end of file
220 """
221 fs_type,fs_img,md5val = fs_obj_ext
222 with u_boot_console.log.section('Test Case 8 - write beyond the end'):
223 # Test Case 8a - Check if command expectedly failed
224 output = u_boot_console.run_command_list([
225 'host bind 0 %s' % fs_img,
226 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
227 '%swrite host 0:0 %x /dir1/%s.w8 $filesize'
228 % (fs_type, ADDR, MIN_FILE)])
229 output = u_boot_console.run_command(
230 '%swrite host 0:0 %x /dir1/%s.w8 0x1400 %x'
231 % (fs_type, ADDR, MIN_FILE, 0x100000 + 0x1400))
Lad Prabhakarfad2e882020-10-20 08:45:46 +0100232 assert('Unable to write file /dir1' in output)
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100233 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahirodde5d3f2018-09-11 15:59:20 +0900234
235 def test_fs_ext9(self, u_boot_console, fs_obj_ext):
236 """
237 Test Case 9 - write to a non-existing file at non-zero offset
238 """
239 fs_type,fs_img,md5val = fs_obj_ext
240 with u_boot_console.log.section('Test Case 9 - write to non-existing file with non-zero offset'):
241 # Test Case 9a - Check if command expectedly failed
242 output = u_boot_console.run_command_list([
243 'host bind 0 %s' % fs_img,
244 '%sload host 0:0 %x /%s' % (fs_type, ADDR, MIN_FILE),
245 '%swrite host 0:0 %x /dir1/%s.w9 0x1400 0x1400'
246 % (fs_type, ADDR, MIN_FILE)])
Lad Prabhakarfad2e882020-10-20 08:45:46 +0100247 assert('Unable to write file /dir1' in ''.join(output))
Jean-Jacques Hiblotd2fd35c2019-02-13 12:15:23 +0100248 assert_fs_integrity(fs_type, fs_img)
AKASHI Takahiro4b63f692019-11-26 17:28:49 +0900249
250 def test_fs_ext10(self, u_boot_console, fs_obj_ext):
251 """
252 'Test Case 10 - create/delete as many directories under root directory
253 as amount of directory entries goes beyond one cluster size)'
254 """
255 fs_type,fs_img,md5val = fs_obj_ext
256 with u_boot_console.log.section('Test Case 10 - create/delete (many)'):
257 # Test Case 10a - Create many files
258 # Please note that the size of directory entry is 32 bytes.
259 # So one typical cluster may holds 64 (2048/32) entries.
260 output = u_boot_console.run_command(
261 'host bind 0 %s' % fs_img)
262
263 for i in range(0, 66):
264 output = u_boot_console.run_command(
265 '%swrite host 0:0 %x /FILE0123456789_%02x 100'
266 % (fs_type, ADDR, i))
267 output = u_boot_console.run_command('%sls host 0:0 /' % fs_type)
268 assert('FILE0123456789_00' in output)
269 assert('FILE0123456789_41' in output)
270
271 # Test Case 10b - Delete many files
272 for i in range(0, 66):
273 output = u_boot_console.run_command(
274 '%srm host 0:0 /FILE0123456789_%02x'
275 % (fs_type, i))
276 output = u_boot_console.run_command('%sls host 0:0 /' % fs_type)
277 assert(not 'FILE0123456789_00' in output)
278 assert(not 'FILE0123456789_41' in output)
279
280 # Test Case 10c - Create many files again
281 # Please note no.64 and 65 are intentionally re-created
282 for i in range(64, 128):
283 output = u_boot_console.run_command(
284 '%swrite host 0:0 %x /FILE0123456789_%02x 100'
285 % (fs_type, ADDR, i))
286 output = u_boot_console.run_command('%sls host 0:0 /' % fs_type)
287 assert('FILE0123456789_40' in output)
288 assert('FILE0123456789_79' in output)
289
290 assert_fs_integrity(fs_type, fs_img)
291
292 def test_fs_ext11(self, u_boot_console, fs_obj_ext):
293 """
294 'Test Case 11 - create/delete as many directories under non-root
295 directory as amount of directory entries goes beyond one cluster size)'
296 """
297 fs_type,fs_img,md5val = fs_obj_ext
298 with u_boot_console.log.section('Test Case 11 - create/delete (many)'):
299 # Test Case 11a - Create many files
300 # Please note that the size of directory entry is 32 bytes.
301 # So one typical cluster may holds 64 (2048/32) entries.
302 output = u_boot_console.run_command(
303 'host bind 0 %s' % fs_img)
304
305 for i in range(0, 66):
306 output = u_boot_console.run_command(
307 '%swrite host 0:0 %x /dir1/FILE0123456789_%02x 100'
308 % (fs_type, ADDR, i))
309 output = u_boot_console.run_command('%sls host 0:0 /dir1' % fs_type)
310 assert('FILE0123456789_00' in output)
311 assert('FILE0123456789_41' in output)
312
313 # Test Case 11b - Delete many files
314 for i in range(0, 66):
315 output = u_boot_console.run_command(
316 '%srm host 0:0 /dir1/FILE0123456789_%02x'
317 % (fs_type, i))
318 output = u_boot_console.run_command('%sls host 0:0 /dir1' % fs_type)
319 assert(not 'FILE0123456789_00' in output)
320 assert(not 'FILE0123456789_41' in output)
321
322 # Test Case 11c - Create many files again
323 # Please note no.64 and 65 are intentionally re-created
324 for i in range(64, 128):
325 output = u_boot_console.run_command(
326 '%swrite host 0:0 %x /dir1/FILE0123456789_%02x 100'
327 % (fs_type, ADDR, i))
328 output = u_boot_console.run_command('%sls host 0:0 /dir1' % fs_type)
329 assert('FILE0123456789_40' in output)
330 assert('FILE0123456789_79' in output)
331
332 assert_fs_integrity(fs_type, fs_img)
Stefan Herbrechtsmeiera09bcfe2023-03-22 09:46:02 +0100333
334 def test_fs_ext12(self, u_boot_console, fs_obj_ext):
335 """
336 Test Case 12 - write plain and mangle file
337 """
338 fs_type,fs_img,md5val = fs_obj_ext
339 with u_boot_console.log.section('Test Case 12 - write plain and mangle file'):
340 # Test Case 12a - Check if command successfully returned
341 output = u_boot_console.run_command_list([
342 'host bind 0 %s' % fs_img,
343 '%swrite host 0:0 %x /%s 0'
344 % (fs_type, ADDR, PLAIN_FILE),
345 '%swrite host 0:0 %x /%s 0'
346 % (fs_type, ADDR, MANGLE_FILE)])
347 assert('0 bytes written' in ''.join(output))
348 # Test Case 12b - Read file system content
349 output = check_output('mdir -i %s' % fs_img, shell=True).decode()
350 # Test Case 12c - Check if short filename is not mangled
351 assert(str2fat(PLAIN_FILE) in ''.join(output))
352 # Test Case 12d - Check if long filename is mangled
353 assert(str2fat(MANGLE_FILE) in ''.join(output))
354
355 assert_fs_integrity(fs_type, fs_img)