Test payload generation functionality.
| 234 | |
| 235 | |
| 236 | class TestPayloadGeneration: |
| 237 | """Test payload generation functionality.""" |
| 238 | |
| 239 | @pytest.fixture |
| 240 | def mock_client_and_module(self): |
| 241 | """Fixture providing mocked client and module.""" |
| 242 | client = MockMsfRpcClient() |
| 243 | module = MockMsfModule('payload/windows/meterpreter/reverse_tcp') |
| 244 | |
| 245 | with patch('MetasploitMCP.get_msf_client', return_value=client): |
| 246 | with patch('MetasploitMCP._get_module_object', return_value=module): |
| 247 | with patch('MetasploitMCP.PAYLOAD_SAVE_DIR', '/tmp/test'): |
| 248 | with patch('os.makedirs'): |
| 249 | with patch('builtins.open', create=True) as mock_open: |
| 250 | mock_open.return_value.__enter__.return_value.write = Mock() |
| 251 | yield client, module |
| 252 | |
| 253 | @pytest.mark.asyncio |
| 254 | async def test_generate_payload_dict_options(self, mock_client_and_module): |
| 255 | """Test payload generation with dictionary options.""" |
| 256 | client, module = mock_client_and_module |
| 257 | |
| 258 | options = {"LHOST": "192.168.1.100", "LPORT": 4444} |
| 259 | result = await generate_payload( |
| 260 | payload_type="windows/meterpreter/reverse_tcp", |
| 261 | format_type="exe", |
| 262 | options=options |
| 263 | ) |
| 264 | |
| 265 | assert result["status"] == "success" |
| 266 | assert "server_save_path" in result |
| 267 | assert result["payload_size"] == len(b"test_payload_bytes") |
| 268 | |
| 269 | @pytest.mark.asyncio |
| 270 | async def test_generate_payload_string_options(self, mock_client_and_module): |
| 271 | """Test payload generation with string options.""" |
| 272 | client, module = mock_client_and_module |
| 273 | |
| 274 | options = "LHOST=192.168.1.100,LPORT=4444" |
| 275 | result = await generate_payload( |
| 276 | payload_type="windows/meterpreter/reverse_tcp", |
| 277 | format_type="exe", |
| 278 | options=options |
| 279 | ) |
| 280 | |
| 281 | assert result["status"] == "success" |
| 282 | # Verify the options were parsed correctly |
| 283 | assert module.options["LHOST"] == "192.168.1.100" |
| 284 | assert module.options["LPORT"] == 4444 |
| 285 | |
| 286 | @pytest.mark.asyncio |
| 287 | async def test_generate_payload_empty_options(self, mock_client_and_module): |
| 288 | """Test payload generation with empty options.""" |
| 289 | client, module = mock_client_and_module |
| 290 | |
| 291 | result = await generate_payload( |
| 292 | payload_type="windows/meterpreter/reverse_tcp", |
| 293 | format_type="exe", |
nothing calls this directly
no outgoing calls
no test coverage detected