MCPcopy Create free account
hub / github.com/KentBeck/BPlusTree3 / _save_failure_info

Method _save_failure_info

python/tests/fuzz_test.py:387–470  ·  view source on GitHub ↗

Save operation history for debugging when a failure occurs

(self, failed_at: int)

Source from the content-addressed store, hash-verified

385 return True
386
387 def _save_failure_info(self, failed_at: int):
388 """Save operation history for debugging when a failure occurs"""
389 print(f"\n💥 FAILURE DETECTED at operation {failed_at}")
390 print(f"Seed: {self.seed}")
391 print(f"Capacity: {self.capacity}")
392
393 # Save ALL operations to file for complete reproduction
394 filename = f"fuzz_failure_{self.seed}_{failed_at}.py"
395
396 with open(filename, "w") as f:
397 f.write(f'"""\nFuzz test failure reproduction\n')
398 f.write(f"Seed: {self.seed}\n")
399 f.write(f"Capacity: {self.capacity}\n")
400 f.write(f"Prepopulate: {self.prepopulate}\n")
401 f.write(f"Failed at operation: {failed_at}\n")
402 f.write(f'"""\n\n')
403 f.write("from ..bplustree import BPlusTreeMap\n")
404 f.write("from collections import OrderedDict\n")
405 f.write("from ._invariant_checker import BPlusTreeInvariantChecker\n")
406 f.write("import random\n\n")
407 f.write("def check_invariants(tree):\n")
408 f.write(" checker = BPlusTreeInvariantChecker(tree.capacity)\n")
409 f.write(" return checker.check_invariants(tree.root, tree.leaves)\n\n")
410 f.write("def reproduce_failure():\n")
411 f.write(f" # Initialize with same settings\n")
412 f.write(f" random.seed({self.seed})\n")
413 f.write(f" tree = BPlusTreeMap(capacity={self.capacity})\n")
414 f.write(" reference = OrderedDict()\n\n")
415
416 # Add prepopulation if it was used
417 if self.prepopulate > 0:
418 f.write(f" # Recreate prepopulation\n")
419 f.write(
420 f" random.seed({self.seed + 12345}) # Same offset as original\n"
421 )
422 f.write(f" keys_to_insert = set()\n")
423 f.write(f" while len(keys_to_insert) < {self.prepopulate}:\n")
424 f.write(f" if len(keys_to_insert) < {self.prepopulate // 2}:\n")
425 f.write(
426 f" key = len(keys_to_insert) * 3 + random.randint(1, 2)\n"
427 )
428 f.write(f" else:\n")
429 f.write(
430 f" key = random.randint(1, {self.prepopulate * 10})\n"
431 )
432 f.write(f" keys_to_insert.add(key)\n")
433 f.write(f" for key in sorted(keys_to_insert):\n")
434 f.write(f' value = f"prepop_value_{{key}}"\n')
435 f.write(f" tree[key] = value\n")
436 f.write(f" reference[key] = value\n")
437 f.write(f' assert check_invariants(tree), "Prepopulation failed"\n')
438 f.write(f" random.seed({self.seed}) # Reset to test seed\n\n")
439
440 for i, (op_type, key, value, extra) in enumerate(self.operations):
441 f.write(f" # Operation {i + 1}: {op_type}\n")
442
443 if op_type in ["insert", "update"]:
444 f.write(f" tree[{repr(key)}] = {repr(value)}\n")

Callers 1

run_fuzz_testMethod · 0.95

Calls

no outgoing calls

Tested by

no test coverage detected