@@ -303,31 +303,51 @@ async def test_modules_basic_perdomainonly(scan, helpers, events, bbot_config, b
303
303
304
304
305
305
@pytest .mark .asyncio
306
- async def test_modules_basic_stats (helpers , events , bbot_config , bbot_scanner , httpx_mock , monkeypatch ):
306
+ async def test_modules_basic_stats (helpers , events , bbot_config , bbot_scanner , httpx_mock , monkeypatch , mock_dns ):
307
307
from bbot .modules .base import BaseModule
308
308
309
309
class dummy (BaseModule ):
310
310
_name = "dummy"
311
311
watched_events = ["*" ]
312
312
313
313
async def handle_event (self , event ):
314
+ # quick emit events like FINDINGS behave differently than normal ones
315
+ # hosts are not speculated from them
314
316
await self .emit_event (
315
317
{"host" : "www.evilcorp.com" , "url" : "http://www.evilcorp.com" , "description" : "asdf" }, "FINDING" , event
316
318
)
319
+ await self .emit_event ("https://asdf.evilcorp.com" , "URL" , event , tags = ["status-200" ])
317
320
318
321
scan = bbot_scanner (
319
322
"evilcorp.com" ,
323
+ modules = ["speculate" ],
320
324
config = bbot_config ,
321
325
force_start = True ,
322
326
)
323
- scan .helpers .dns .mock_dns ({("evilcorp.com" , "A" ): "127.0.254.1" , ("www.evilcorp.com" , "A" ): "127.0.254.2" })
327
+ mock_dns (
328
+ scan ,
329
+ {
330
+ "evilcorp.com" : {"A" : ["127.0.254.1" ]},
331
+ "www.evilcorp.com" : {"A" : ["127.0.254.2" ]},
332
+ "asdf.evilcorp.com" : {"A" : ["127.0.254.3" ]},
333
+ },
334
+ )
324
335
325
336
scan .modules ["dummy" ] = dummy (scan )
326
337
events = [e async for e in scan .async_start ()]
327
338
328
- assert len (events ) == 3
339
+ assert len (events ) == 6
340
+
341
+ assert scan .stats .events_emitted_by_type == {
342
+ "SCAN" : 1 ,
343
+ "DNS_NAME" : 3 ,
344
+ "URL" : 1 ,
345
+ "FINDING" : 1 ,
346
+ "ORG_STUB" : 1 ,
347
+ "OPEN_TCP_PORT" : 1 ,
348
+ }
329
349
330
- assert set (scan .stats .module_stats ) == {"dummy " , "python" , "TARGET" }
350
+ assert set (scan .stats .module_stats ) == {"host " , "speculate" , " python" , "dummy " , "TARGET" }
331
351
332
352
target_stats = scan .stats .module_stats ["TARGET" ]
333
353
assert target_stats .emitted == {"SCAN" : 1 , "DNS_NAME" : 1 }
@@ -338,19 +358,17 @@ async def handle_event(self, event):
338
358
assert target_stats .consumed_total == 0
339
359
340
360
dummy_stats = scan .stats .module_stats ["dummy" ]
341
- assert dummy_stats .emitted == {"FINDING" : 1 }
342
- assert dummy_stats .emitted_total == 1
343
- assert dummy_stats .produced == {"FINDING" : 1 }
344
- assert dummy_stats .produced_total == 1
345
- assert dummy_stats .consumed == {"SCAN" : 1 , "DNS_NAME " : 1 }
346
- assert dummy_stats .consumed_total == 2
361
+ assert dummy_stats .emitted == {"FINDING" : 1 , "URL" : 1 }
362
+ assert dummy_stats .emitted_total == 2
363
+ assert dummy_stats .produced == {"FINDING" : 1 , "URL" : 1 }
364
+ assert dummy_stats .produced_total == 2
365
+ assert dummy_stats .consumed == {"DNS_NAME" : 2 , "OPEN_TCP_PORT" : 1 , " SCAN" : 1 , "URL " : 1 }
366
+ assert dummy_stats .consumed_total == 5
347
367
348
368
python_stats = scan .stats .module_stats ["python" ]
349
369
assert python_stats .emitted == {}
350
370
assert python_stats .emitted_total == 0
351
371
assert python_stats .produced == {}
352
372
assert python_stats .produced_total == 0
353
- assert python_stats .consumed == {"SCAN" : 1 , "FINDING" : 1 , "DNS_NAME" : 1 }
354
- assert python_stats .consumed_total == 3
355
-
356
- assert scan .stats .events_emitted_by_type == {"SCAN" : 1 , "FINDING" : 1 , "DNS_NAME" : 1 }
373
+ assert python_stats .consumed == {"DNS_NAME" : 2 , "FINDING" : 1 , "ORG_STUB" : 1 , "SCAN" : 1 , "URL" : 1 }
374
+ assert python_stats .consumed_total == 6
0 commit comments