@@ -1052,8 +1052,44 @@ def test_download_file_binary(self, mock_boto3, mock_get_data_endpoint, mock_get
10521052 client .identifier = "test.identifier"
10531053 client .session_id = "test-session-id"
10541054
1055- original_content = "binary content as text"
1056- encoded_content = base64 .b64encode (original_content .encode ("utf-8" )).decode ("utf-8" )
1055+ binary_content = b"\x89 PNG\r \n \x1a \n " # PNG header bytes
1056+ encoded_content = base64 .b64encode (binary_content ).decode ("utf-8" )
1057+
1058+ mock_response = {
1059+ "stream" : [
1060+ {
1061+ "result" : {
1062+ "content" : [
1063+ {"type" : "resource" , "resource" : {"uri" : "file://image.png" , "blob" : encoded_content }}
1064+ ]
1065+ }
1066+ }
1067+ ]
1068+ }
1069+ client .data_plane_client .invoke_code_interpreter .return_value = mock_response
1070+
1071+ # Act
1072+ result = client .download_file ("image.png" )
1073+
1074+ # Assert
1075+ assert result == binary_content
1076+ assert isinstance (result , bytes )
1077+
1078+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_control_plane_endpoint" )
1079+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_data_plane_endpoint" )
1080+ @patch ("bedrock_agentcore.tools.code_interpreter_client.boto3" )
1081+ def test_download_file_blob_utf8_returns_str (self , mock_boto3 , mock_get_data_endpoint , mock_get_control_endpoint ):
1082+ """Blob content that is valid UTF-8 should be decoded and returned as str."""
1083+ # Arrange
1084+ mock_session = MagicMock ()
1085+ mock_session .client .return_value = MagicMock ()
1086+ mock_boto3 .Session .return_value = mock_session
1087+ client = CodeInterpreter ("us-west-2" )
1088+ client .identifier = "test.identifier"
1089+ client .session_id = "test-session-id"
1090+
1091+ text_content = "hello world"
1092+ encoded_content = base64 .b64encode (text_content .encode ("utf-8" )).decode ("utf-8" )
10571093
10581094 mock_response = {
10591095 "stream" : [
@@ -1072,7 +1108,8 @@ def test_download_file_binary(self, mock_boto3, mock_get_data_endpoint, mock_get
10721108 result = client .download_file ("data.bin" )
10731109
10741110 # Assert
1075- assert result == original_content
1111+ assert result == text_content
1112+ assert isinstance (result , str )
10761113
10771114 @patch ("bedrock_agentcore.tools.code_interpreter_client.get_control_plane_endpoint" )
10781115 @patch ("bedrock_agentcore.tools.code_interpreter_client.get_data_plane_endpoint" )
@@ -1152,6 +1189,108 @@ def test_download_files_empty_result(self, mock_boto3, mock_get_data_endpoint, m
11521189 # Assert
11531190 assert result == {}
11541191
1192+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_control_plane_endpoint" )
1193+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_data_plane_endpoint" )
1194+ @patch ("bedrock_agentcore.tools.code_interpreter_client.boto3" )
1195+ def test_download_files_binary (self , mock_boto3 , mock_get_data_endpoint , mock_get_control_endpoint ):
1196+ # Arrange
1197+ mock_session = MagicMock ()
1198+ mock_session .client .return_value = MagicMock ()
1199+ mock_boto3 .Session .return_value = mock_session
1200+ client = CodeInterpreter ("us-west-2" )
1201+ client .identifier = "test.identifier"
1202+ client .session_id = "test-session-id"
1203+
1204+ binary_content = b"\x89 PNG\r \n \x1a \n " # PNG header bytes
1205+ encoded_binary = base64 .b64encode (binary_content ).decode ("utf-8" )
1206+
1207+ mock_response = {
1208+ "stream" : [
1209+ {
1210+ "result" : {
1211+ "content" : [
1212+ {
1213+ "type" : "resource" ,
1214+ "resource" : {
1215+ "uri" : "file:///opt/amazon/genesis1p-tools/var/data.csv" ,
1216+ "text" : "col1,col2\n 1,2" ,
1217+ },
1218+ },
1219+ {
1220+ "type" : "resource" ,
1221+ "resource" : {
1222+ "uri" : "file:///opt/amazon/genesis1p-tools/var/chart.png" ,
1223+ "blob" : encoded_binary ,
1224+ },
1225+ },
1226+ ]
1227+ }
1228+ }
1229+ ]
1230+ }
1231+ client .data_plane_client .invoke_code_interpreter .return_value = mock_response
1232+
1233+ # Act
1234+ result = client .download_files (["data.csv" , "chart.png" ])
1235+
1236+ # Assert
1237+ assert result ["/opt/amazon/genesis1p-tools/var/data.csv" ] == "col1,col2\n 1,2"
1238+ assert result ["/opt/amazon/genesis1p-tools/var/chart.png" ] == binary_content
1239+ assert isinstance (result ["/opt/amazon/genesis1p-tools/var/chart.png" ], bytes )
1240+
1241+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_control_plane_endpoint" )
1242+ @patch ("bedrock_agentcore.tools.code_interpreter_client.get_data_plane_endpoint" )
1243+ @patch ("bedrock_agentcore.tools.code_interpreter_client.boto3" )
1244+ def test_download_files_blob_utf8_returns_str (self , mock_boto3 , mock_get_data_endpoint , mock_get_control_endpoint ):
1245+ """Blob content that is valid UTF-8 should be decoded and returned as str in multi-file download."""
1246+ # Arrange
1247+ mock_session = MagicMock ()
1248+ mock_session .client .return_value = MagicMock ()
1249+ mock_boto3 .Session .return_value = mock_session
1250+ client = CodeInterpreter ("us-west-2" )
1251+ client .identifier = "test.identifier"
1252+ client .session_id = "test-session-id"
1253+
1254+ text_content = "some utf-8 blob content"
1255+ encoded_text = base64 .b64encode (text_content .encode ("utf-8" )).decode ("utf-8" )
1256+ binary_content = b"\x89 PNG\r \n \x1a \n "
1257+ encoded_binary = base64 .b64encode (binary_content ).decode ("utf-8" )
1258+
1259+ mock_response = {
1260+ "stream" : [
1261+ {
1262+ "result" : {
1263+ "content" : [
1264+ {
1265+ "type" : "resource" ,
1266+ "resource" : {
1267+ "uri" : "file:///opt/amazon/genesis1p-tools/var/data.bin" ,
1268+ "blob" : encoded_text ,
1269+ },
1270+ },
1271+ {
1272+ "type" : "resource" ,
1273+ "resource" : {
1274+ "uri" : "file:///opt/amazon/genesis1p-tools/var/chart.png" ,
1275+ "blob" : encoded_binary ,
1276+ },
1277+ },
1278+ ]
1279+ }
1280+ }
1281+ ]
1282+ }
1283+ client .data_plane_client .invoke_code_interpreter .return_value = mock_response
1284+
1285+ # Act
1286+ result = client .download_files (["data.bin" , "chart.png" ])
1287+
1288+ # Assert — UTF-8-valid blob comes back as str, invalid UTF-8 blob comes back as bytes
1289+ assert result ["/opt/amazon/genesis1p-tools/var/data.bin" ] == text_content
1290+ assert isinstance (result ["/opt/amazon/genesis1p-tools/var/data.bin" ], str )
1291+ assert result ["/opt/amazon/genesis1p-tools/var/chart.png" ] == binary_content
1292+ assert isinstance (result ["/opt/amazon/genesis1p-tools/var/chart.png" ], bytes )
1293+
11551294 @patch ("bedrock_agentcore.tools.code_interpreter_client.get_control_plane_endpoint" )
11561295 @patch ("bedrock_agentcore.tools.code_interpreter_client.get_data_plane_endpoint" )
11571296 @patch ("bedrock_agentcore.tools.code_interpreter_client.boto3" )
0 commit comments