22// Copyright © Aptos Foundation
33// SPDX-License-Identifier: Apache-2.0
44
5- use aptos:: { common:: types:: MovePackageDir , move_tool :: experiments_from_opt_level } ;
5+ use aptos:: common:: types:: MovePackageOptions ;
66use aptos_framework:: extended_checks;
77use clap:: Parser ;
8- use move_model:: metadata:: LanguageVersion ;
8+ use move_model:: metadata:: { CompilerVersion , LanguageVersion } ;
99use move_mutator:: cli:: { FunctionFilter , ModuleFilter } ;
1010use move_package:: CompilerConfig ;
1111use std:: path:: PathBuf ;
@@ -65,27 +65,30 @@ pub fn create_mutator_options(
6565// Info: this set struct is based on TestPackage in `aptos-core/crates/aptos/src/move_tool/mod.rs`.
6666#[ derive( Parser , Debug , Clone ) ]
6767pub struct TestBuildConfig {
68- /// Options for compiling a move package dir.
69- // We might move some options out and have our own option struct here - not all options are
70- // needed for mutation testing.
71- #[ clap( flatten) ]
72- pub move_pkg : MovePackageDir ,
73-
74- /// Dump storage state on failure.
75- #[ clap( long = "dump" ) ]
76- pub dump_state : bool ,
77-
78- /// A filter string to determine which unit tests to run.
79- #[ clap( long) ]
68+ /// A filter string to determine which unit tests to run
69+ #[ clap( long, short) ]
8070 pub filter : Option < String > ,
8171
8272 /// A boolean value to skip warnings.
8373 #[ clap( long) ]
8474 pub ignore_compile_warnings : bool ,
8575
86- /// Compute and then use unit test computed coverage to generate mutants only for covered code.
87- #[ clap( long = "coverage" , conflicts_with = "use_generated_mutants" ) ]
88- pub apply_coverage : bool ,
76+ #[ clap( flatten) ]
77+ pub ( crate ) move_options : MovePackageOptions ,
78+
79+ /// The maximum number of instructions that can be executed by a test
80+ ///
81+ /// If set, the number of instructions executed by one test will be bounded
82+ #[ clap( long = "instructions" , default_value_t = 100000 ) ]
83+ pub instruction_execution_bound : u64 ,
84+
85+ /// Collect coverage information for later use with the various `aptos move coverage` subcommands
86+ #[ clap( long = "coverage" ) ]
87+ pub compute_coverage : bool ,
88+
89+ /// Dump storage state on failure.
90+ #[ clap( long = "dump" ) ]
91+ pub dump_state : bool ,
8992
9093 /// The maximum gas limit for each test.
9194 ///
@@ -100,25 +103,38 @@ impl TestBuildConfig {
100103 pub fn compiler_config ( & self ) -> CompilerConfig {
101104 let known_attributes = extended_checks:: get_all_attribute_names ( ) . clone ( ) ;
102105 CompilerConfig {
103- known_attributes,
104- skip_attribute_checks : self . move_pkg . skip_attribute_checks ,
105- bytecode_version : get_bytecode_version (
106- self . move_pkg . bytecode_version ,
107- self . move_pkg . language_version ,
106+ known_attributes : known_attributes . clone ( ) ,
107+ skip_attribute_checks : self . move_options . skip_attribute_checks ,
108+ bytecode_version : fix_bytecode_version (
109+ self . move_options . bytecode_version ,
110+ self . move_options . language_version ,
108111 ) ,
109- compiler_version : self . move_pkg . compiler_version ,
110- language_version : self . move_pkg . language_version ,
111- experiments : experiments_from_opt_level ( & self . move_pkg . optimize ) ,
112+ compiler_version : self
113+ . move_options
114+ . compiler_version
115+ . or_else ( || Some ( CompilerVersion :: latest_stable ( ) ) ) ,
116+ language_version : self
117+ . move_options
118+ . language_version
119+ . or_else ( || Some ( LanguageVersion :: latest_stable ( ) ) ) ,
120+ experiments : self . move_options . compute_experiments ( ) ,
112121 }
113122 }
114123}
115124
116- /// Get bytecode version.
117- fn get_bytecode_version (
125+ fn fix_bytecode_version (
118126 bytecode_version_in : Option < u32 > ,
119127 language_version : Option < LanguageVersion > ,
120128) -> Option < u32 > {
121- bytecode_version_in. or_else ( || language_version. map ( |lv| lv. infer_bytecode_version ( None ) ) )
129+ if bytecode_version_in. is_none ( ) {
130+ if let Some ( language_version) = language_version {
131+ Some ( language_version. infer_bytecode_version ( bytecode_version_in) )
132+ } else {
133+ bytecode_version_in
134+ }
135+ } else {
136+ bytecode_version_in
137+ }
122138}
123139
124140#[ cfg( test) ]
0 commit comments