Skip to content

Commit

Permalink
add --max-examples option
Browse files Browse the repository at this point in the history
  • Loading branch information
bbyalcinkaya committed Dec 11, 2024
1 parent 06b6c73 commit abcb341
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 9 deletions.
14 changes: 9 additions & 5 deletions src/komet/kasmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ def call_init() -> tuple[KInner, ...]:

return conf, subst

def run_test(self, conf: KInner, subst: dict[str, KInner], binding: ContractBinding) -> None:
def run_test(self, conf: KInner, subst: dict[str, KInner], binding: ContractBinding, max_examples: int) -> None:
"""Given a configuration with a deployed test contract, fuzz over the tests for the supplied binding.
Raises:
Expand All @@ -202,7 +202,9 @@ def make_steps(*args: KInner) -> Pattern:
steps_strategy = binding.strategy.map(lambda args: make_steps(*args))
template_subst = {EVar('VarSTEPS', SortApp('SortSteps')): steps_strategy}

fuzz(self.definition.path, template_config_kore, template_subst, check_exit_code=True)
fuzz(
self.definition.path, template_config_kore, template_subst, check_exit_code=True, max_examples=max_examples
)

def run_prove(
self,
Expand Down Expand Up @@ -236,7 +238,9 @@ def make_steps(*args: KInner) -> KInner:

return run_claim(name, claim, proof_dir, bug_report)

def deploy_and_run(self, contract_wasm: Path, child_wasms: tuple[Path, ...], id: str | None) -> None:
def deploy_and_run(
self, contract_wasm: Path, child_wasms: tuple[Path, ...], max_examples: int = 100, id: str | None = None
) -> None:
"""Run all of the tests in a soroban test contract.
Args:
Expand All @@ -257,7 +261,7 @@ def deploy_and_run(self, contract_wasm: Path, child_wasms: tuple[Path, ...], id:

test_bindings = [b for b in bindings if b.name.startswith('test_') and (id is None or b.name == id)]

if id is None:
if id is None:
print(f'Discovered {len(test_bindings)} test functions:')
elif not test_bindings:
raise KeyError(f'Test function {id!r} not found.')
Expand All @@ -269,7 +273,7 @@ def deploy_and_run(self, contract_wasm: Path, child_wasms: tuple[Path, ...], id:

for binding in test_bindings:
print(f'\n Running {binding.name}...')
self.run_test(conf, subst, binding)
self.run_test(conf, subst, binding, max_examples)
print(' Test passed.')

def deploy_and_prove(
Expand Down
16 changes: 12 additions & 4 deletions src/komet/komet.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ def main() -> None:
_exec_kast(program=args.program, backend=args.backend, output=args.output)
elif args.command == 'test':
wasm = Path(args.wasm.name) if args.wasm is not None else None
_exec_test(wasm=wasm, id=args.id)
if args.max_examples < 1:
raise ValueError(f'--max-examples must be a positive integer (greater than 0), given {args.max_examples}')
_exec_test(wasm=wasm, max_examples=args.max_examples, id=args.id)
elif args.command == 'prove':
if args.prove_command is None or args.prove_command == 'run':
wasm = Path(args.wasm.name) if args.wasm is not None else None
Expand Down Expand Up @@ -77,7 +79,7 @@ def _exec_kast(*, program: Path, backend: Backend, output: KAstOutput | None) ->
_exit_with_output(proc_res)


def _exec_test(*, wasm: Path | None, id: str | None) -> None:
def _exec_test(*, wasm: Path | None, max_examples: int, id: str | None) -> None:
"""Run a soroban test contract given its compiled wasm file.
This will get the bindings for the contract and run all of the test functions.
Expand All @@ -96,7 +98,7 @@ def _exec_test(*, wasm: Path | None, id: str | None) -> None:
child_wasms = _read_config_file(kasmer)
wasm = kasmer.build_soroban_contract(Path.cwd())

kasmer.deploy_and_run(wasm, child_wasms, id=id)
kasmer.deploy_and_run(wasm, child_wasms, max_examples, id)

sys.exit(0)

Expand Down Expand Up @@ -173,9 +175,14 @@ def _argument_parser() -> ArgumentParser:
kast_parser.add_argument('--output', metavar='FORMAT', type=KAstOutput, help='format to output the term in')

test_parser = command_parser.add_parser('test', help='Test the soroban contract in the current working directory')
test_parser.add_argument(
'--max-examples', type=int, default=100, help='Maximum number of inputs for fuzzing (default: 100)'
)
_add_common_test_arguments(test_parser)

prove_parser = command_parser.add_parser('prove', help='Prove the soroban contract in the current working directory')
prove_parser = command_parser.add_parser(
'prove', help='Prove the soroban contract in the current working directory'
)
prove_parser.add_argument(
'prove_command',
default='run',
Expand All @@ -194,6 +201,7 @@ def _add_common_arguments(parser: ArgumentParser) -> None:
parser.add_argument('program', metavar='PROGRAM', type=file_path, help='path to test file')
parser.add_argument('--backend', metavar='BACKEND', type=Backend, default=Backend.LLVM, help='K backend to use')


def _add_common_test_arguments(parser: ArgumentParser) -> None:
parser.add_argument('--id', help='Name of the test function in the testing contract')
parser.add_argument('--wasm', type=FileType('r'), help='Use a specific contract wasm file instead')

0 comments on commit abcb341

Please sign in to comment.