@@ -941,3 +941,63 @@ def test_write_config_files_with_content_type(self, mock_session):
941941 calls = mock_write .call_args_list
942942 input_config_call = [c for c in calls if "inputdataconfig.json" in str (c )]
943943 assert len (input_config_call ) > 0
944+
945+
946+ RMTREE_IMAGE = "763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.1-cpu-py310"
947+ MODULE = "sagemaker.core.modules.local_core.local_container"
948+
949+
950+ class TestRmtree :
951+ """Test cases for _rmtree function."""
952+
953+ @patch (f"{ MODULE } .shutil.rmtree" )
954+ def test_rmtree_success (self , mock_rmtree ):
955+ from sagemaker .core .modules .local_core .local_container import _rmtree
956+ _rmtree ("/tmp/test" , RMTREE_IMAGE )
957+ mock_rmtree .assert_called_once_with ("/tmp/test" )
958+
959+ @patch (f"{ MODULE } .shutil.rmtree" )
960+ @patch (f"{ MODULE } .subprocess.run" )
961+ def test_rmtree_permission_error_docker_chmod_fallback (self , mock_run , mock_rmtree ):
962+ from sagemaker .core .modules .local_core .local_container import _rmtree
963+ mock_rmtree .side_effect = [PermissionError ("Permission denied" ), None ]
964+ _rmtree ("/tmp/test" , RMTREE_IMAGE )
965+ mock_run .assert_called_once_with (
966+ ["docker" , "run" , "--rm" , "-v" , "/tmp/test:/delete" , RMTREE_IMAGE , "chmod" , "-R" , "777" , "/delete" ],
967+ check = True ,
968+ capture_output = True ,
969+ )
970+ assert mock_rmtree .call_count == 2
971+
972+ @patch (f"{ MODULE } .shutil.rmtree" )
973+ @patch (f"{ MODULE } .subprocess.run" )
974+ def test_rmtree_studio_adds_network (self , mock_run , mock_rmtree ):
975+ from sagemaker .core .modules .local_core .local_container import _rmtree
976+ mock_rmtree .side_effect = [PermissionError ("Permission denied" ), None ]
977+ _rmtree ("/tmp/test" , RMTREE_IMAGE , is_studio = True )
978+ mock_run .assert_called_once_with (
979+ [
980+ "docker" , "run" , "--rm" ,
981+ "--network" , "sagemaker" ,
982+ "-v" , "/tmp/test:/delete" , RMTREE_IMAGE ,
983+ "chmod" , "-R" , "777" , "/delete" ,
984+ ],
985+ check = True ,
986+ capture_output = True ,
987+ )
988+
989+ @patch (f"{ MODULE } .shutil.rmtree" )
990+ @patch (f"{ MODULE } .subprocess.run" )
991+ def test_rmtree_docker_fallback_fails_raises (self , mock_run , mock_rmtree ):
992+ from sagemaker .core .modules .local_core .local_container import _rmtree
993+ mock_rmtree .side_effect = PermissionError ("Permission denied" )
994+ mock_run .side_effect = Exception ("docker failed" )
995+ with pytest .raises (Exception , match = "docker failed" ):
996+ _rmtree ("/tmp/test" , RMTREE_IMAGE )
997+
998+ @patch (f"{ MODULE } .shutil.rmtree" )
999+ def test_rmtree_no_image_raises (self , mock_rmtree ):
1000+ from sagemaker .core .modules .local_core .local_container import _rmtree
1001+ mock_rmtree .side_effect = PermissionError ("Permission denied" )
1002+ with pytest .raises (PermissionError ):
1003+ _rmtree ("/tmp/test" )
0 commit comments