@@ -188,4 +188,33 @@ void shouldExtractWhenCasingDifferOnlyInEntryNamePath(@TempDir File temporaryFol
188188 assertTrue (abstractUnArchiver .shouldExtractEntry (temporaryFolder , file , entryName , entryDate ));
189189 assertEquals (0 , abstractUnArchiver .casingMessageEmitted .get ());
190190 }
191+
192+ @ Test
193+ void shouldExtractReadOnlyFile (@ TempDir File temporaryFolder ) throws Exception {
194+ // given
195+ File readOnlyFile = new File (temporaryFolder , "readonly.txt" );
196+ readOnlyFile .createNewFile ();
197+ java .nio .file .Files .write (readOnlyFile .toPath (), "original content" .getBytes ());
198+
199+ // Make the file read-only (simulate -r-xr-xr-x permissions)
200+ readOnlyFile .setWritable (false );
201+ assertTrue (readOnlyFile .exists ());
202+ assertFalse (readOnlyFile .canWrite ());
203+
204+ // Create a mock input stream with new content
205+ String newContent = "new content" ;
206+ java .io .InputStream inputStream = new java .io .ByteArrayInputStream (newContent .getBytes ());
207+
208+ // when
209+ abstractUnArchiver .setOverwrite (true );
210+ abstractUnArchiver .extractFile (
211+ null , temporaryFolder , inputStream , "readonly.txt" , new Date (), false , null , null , null );
212+
213+ // then
214+ // The file should have been successfully overwritten
215+ assertTrue (readOnlyFile .exists ());
216+ byte [] actualBytes = java .nio .file .Files .readAllBytes (readOnlyFile .toPath ());
217+ String actualContent = new String (actualBytes );
218+ assertEquals (newContent , actualContent );
219+ }
191220}
0 commit comments