1414 from dissect .apfs .objects .fs import FS
1515
1616
17- def _assert_apfs_content (volume : FS ) -> None :
17+ def _assert_apfs_content (volume : FS , beta : bool ) -> None :
1818 # Root directory
1919 node = volume .get ("/" )
2020 assert node .name == "root"
@@ -61,20 +61,33 @@ def _assert_apfs_content(volume: FS) -> None:
6161 assert node .is_dir ()
6262 assert all (
6363 name in sorted (node .listdir ())
64- for name in [
65- "compressed-lzfse-fork" ,
66- "compressed-lzfse-xattr" ,
67- "compressed-lzvn-fork" ,
68- "compressed-lzvn-xattr" ,
69- "compressed-zlib-fork" ,
70- "compressed-zlib-xattr" ,
71- "fifo" ,
72- "file" ,
73- "resourcefork" ,
74- "xattr-dir" ,
75- "xattr-large" ,
76- "xattr-small" ,
77- ]
64+ for name in (
65+ [
66+ "compressed-zlib-fork" ,
67+ "compressed-zlib-xattr" ,
68+ "fifo" ,
69+ "file" ,
70+ "resourcefork" ,
71+ "xattr-dir" ,
72+ "xattr-large" ,
73+ "xattr-small" ,
74+ ]
75+ if beta
76+ else [
77+ "compressed-lzfse-fork" ,
78+ "compressed-lzfse-xattr" ,
79+ "compressed-lzvn-fork" ,
80+ "compressed-lzvn-xattr" ,
81+ "compressed-zlib-fork" ,
82+ "compressed-zlib-xattr" ,
83+ "fifo" ,
84+ "file" ,
85+ "resourcefork" ,
86+ "xattr-dir" ,
87+ "xattr-large" ,
88+ "xattr-small" ,
89+ ]
90+ )
7891 )
7992
8093 # Regular file
@@ -159,7 +172,9 @@ def _assert_apfs_content(volume: FS) -> None:
159172 assert node .is_file ()
160173 assert (
161174 hashlib .sha256 (node .xattr ["xattr-large" ].open ().read ()).hexdigest ()
162- == "a11c957142c3fd8ebf2bee1ed0cf184a246033a3874d060acd28c319b323466e"
175+ == "dd4e6730520932767ec0a9e33fe19c4ce24399d6eba4ff62f13013c9ed30ef87"
176+ if beta
177+ else "a11c957142c3fd8ebf2bee1ed0cf184a246033a3874d060acd28c319b323466e"
163178 )
164179
165180 # Compressed file method 3 (ZLIB-XATTR)
@@ -182,47 +197,48 @@ def _assert_apfs_content(volume: FS) -> None:
182197 == "5f46d97f947137dcf974fc19914c547acd18fcdb25124c846c1100f8b3fbca5f"
183198 )
184199
185- # Compressed file method 7 (LZVN-XATTR)
186- node = volume .get ("dir/compressed-lzvn-xattr" )
187- assert node .name == "compressed-lzvn-xattr"
188- assert node .is_file ()
189- assert node .is_compressed ()
190- assert (
191- node .open ().read ()
192- == b"Compressed data in xattr aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n " # noqa: E501
193- )
194-
195- # Compressed file method 8 (LZVN-FORK)
196- node = volume .get ("dir/compressed-lzvn-fork" )
197- assert node .name == "compressed-lzvn-fork"
198- assert node .is_file ()
199- assert node .is_compressed ()
200- assert (
201- hashlib .sha256 (node .open ().read ()).hexdigest ()
202- == "5f46d97f947137dcf974fc19914c547acd18fcdb25124c846c1100f8b3fbca5f"
203- )
204-
205- # Compressed file method 11 (LZFSE-XATTR)
206- node = volume .get ("dir/compressed-lzfse-xattr" )
207- assert node .name == "compressed-lzfse-xattr"
208- assert node .is_file ()
209- assert node .is_compressed ()
210- assert (
211- node .open ().read ()
212- == b"Compressed data in xattr aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n " # noqa: E501
213- )
214-
215- # Compressed file method 12 (LZFSE-FORK)
216- node = volume .get ("dir/compressed-lzfse-fork" )
217- assert node .name == "compressed-lzfse-fork"
218- assert node .is_file ()
219- assert node .is_compressed ()
220- assert (
221- hashlib .sha256 (node .open ().read ()).hexdigest ()
222- == "5f46d97f947137dcf974fc19914c547acd18fcdb25124c846c1100f8b3fbca5f"
223- )
200+ if not beta :
201+ # Compressed file method 7 (LZVN-XATTR)
202+ node = volume .get ("dir/compressed-lzvn-xattr" )
203+ assert node .name == "compressed-lzvn-xattr"
204+ assert node .is_file ()
205+ assert node .is_compressed ()
206+ assert (
207+ node .open ().read ()
208+ == b"Compressed data in xattr aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n " # noqa: E501
209+ )
210+
211+ # Compressed file method 8 (LZVN-FORK)
212+ node = volume .get ("dir/compressed-lzvn-fork" )
213+ assert node .name == "compressed-lzvn-fork"
214+ assert node .is_file ()
215+ assert node .is_compressed ()
216+ assert (
217+ hashlib .sha256 (node .open ().read ()).hexdigest ()
218+ == "5f46d97f947137dcf974fc19914c547acd18fcdb25124c846c1100f8b3fbca5f"
219+ )
220+
221+ # Compressed file method 11 (LZFSE-XATTR)
222+ node = volume .get ("dir/compressed-lzfse-xattr" )
223+ assert node .name == "compressed-lzfse-xattr"
224+ assert node .is_file ()
225+ assert node .is_compressed ()
226+ assert (
227+ node .open ().read ()
228+ == b"Compressed data in xattr aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n " # noqa: E501
229+ )
230+
231+ # Compressed file method 12 (LZFSE-FORK)
232+ node = volume .get ("dir/compressed-lzfse-fork" )
233+ assert node .name == "compressed-lzfse-fork"
234+ assert node .is_file ()
235+ assert node .is_compressed ()
236+ assert (
237+ hashlib .sha256 (node .open ().read ()).hexdigest ()
238+ == "5f46d97f947137dcf974fc19914c547acd18fcdb25124c846c1100f8b3fbca5f"
239+ )
224240
225- if ".HFS+ Private Directory Data\r " not in volume .get ("/" ).listdir ():
241+ if ".HFS+ Private Directory Data\r " not in volume .get ("/" ).listdir () and not beta :
226242 # Special files
227243 node = volume .get ("dir/blockdev" )
228244 assert node .name == "blockdev"
@@ -294,6 +310,20 @@ def _assert_apfs_content(volume: FS) -> None:
294310 "password" ,
295311 id = "jfs-encrypted" ,
296312 ),
313+ pytest .param (
314+ "_data/case_insensitive_beta.bin.gz" ,
315+ "Case Insensitive (beta)" ,
316+ c_apfs .APFS_INCOMPAT .CASE_INSENSITIVE ,
317+ None ,
318+ id = "case-insensitive-beta" ,
319+ ),
320+ pytest .param (
321+ "_data/case_sensitive_beta.bin.gz" ,
322+ "Case Sensitive (beta)" ,
323+ c_apfs .APFS_INCOMPAT (0 ),
324+ None ,
325+ id = "case-sensitive-beta" ,
326+ ),
297327 ],
298328)
299329def test_apfs (path : str , name : str , features : c_apfs .APFS_INCOMPAT , password : str | None ) -> None :
@@ -310,7 +340,7 @@ def test_apfs(path: str, name: str, features: c_apfs.APFS_INCOMPAT, password: st
310340 assert volume .is_encrypted
311341 volume .unlock (password )
312342
313- _assert_apfs_content (volume )
343+ _assert_apfs_content (volume , "(beta)" in name )
314344
315345
316346def test_snapshots () -> None :
0 commit comments