66 In the future, we could pass invalid regexes and check if the secondary runner fails to compile.
77"""
88
9- from typing import Type , List
9+ import json
10+ from pathlib import Path
11+ from typing import Type , List , Union
1012from enum import Enum
1113from dataclasses import dataclass
1214from zkregex_fuzzer .logger import logger
@@ -31,6 +33,37 @@ class HarnessResult:
3133 # Error message (if any)
3234 error_message : str = ""
3335
36+ def _return_harness_result (
37+ result : HarnessResult ,
38+ status_to_save : list ,
39+ output_path : str ,
40+ runner : Union [Runner , None ],
41+ kwargs : dict ,
42+ ):
43+ if runner :
44+ if result .status .name in status_to_save :
45+
46+ metadata = {
47+ "seed" : kwargs .get ("seed" ),
48+ "target" : kwargs .get ("target" ),
49+ "oracle" : kwargs .get ("oracle" ),
50+ "input_generator" : kwargs .get ("valid_input_generator" ),
51+ "fuzzer" : kwargs .get ("fuzzer" ),
52+ "regex_num" : kwargs .get ("regex_num" ),
53+ "inputs_num" : kwargs .get ("inputs_num" ),
54+ }
55+
56+ dir_path = runner .save (output_path )
57+
58+ metadata_json = json .dumps (metadata )
59+ metadata_path = Path (dir_path ) / "metadata.json"
60+ with open (metadata_path .absolute (), "w" ) as f :
61+ f .write (metadata_json )
62+
63+ runner .clean ()
64+
65+ return result
66+
3467def harness (
3568 regex : str ,
3669 primary_runner_cls : Type [Runner ],
@@ -54,26 +87,53 @@ def harness(
5487 """
5588 regex = regex
5689 inp_num = len (inputs )
57- output_path = kwargs .get ("output" )
90+ output_path = kwargs .get ("save_output" , "" )
91+ status_to_save = kwargs .get ("save" , None ) or []
92+
5893 try :
5994 primary_runner = primary_runner_cls (regex , {})
6095 except RegexCompileError as e :
61- return HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED , str (e ))
96+ return _return_harness_result (
97+ HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED , str (e )),
98+ status_to_save ,
99+ output_path ,
100+ None ,
101+ kwargs ,
102+ )
62103
63104 try :
64105 secondary_runner = secondary_runner_cls (regex , kwargs )
65106 except RegexCompileError as e :
66- return HarnessResult (regex , inp_num , oracle , [], HarnessStatus .COMPILE_ERROR , str (e ))
107+ return _return_harness_result (
108+ HarnessResult (regex , inp_num , oracle , [], HarnessStatus .COMPILE_ERROR , str (e )),
109+ status_to_save ,
110+ output_path ,
111+ None ,
112+ kwargs
113+ )
67114
68115 failed_inputs = []
116+
69117 for input in inputs :
70118 primary_runner_str = None
71119 try :
72120 primary_runner_status , primary_runner_str = primary_runner .match (input )
73121 if primary_runner_status != oracle :
74- return HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED )
122+ return _return_harness_result (
123+ HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED ),
124+ status_to_save ,
125+ output_path ,
126+ None ,
127+ kwargs
128+ )
75129 except RegexRunError as e :
76- return HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED , str (e ))
130+ return _return_harness_result (
131+ HarnessResult (regex , inp_num , oracle , [], HarnessStatus .INVALID_SEED , str (e )),
132+ status_to_save ,
133+ output_path ,
134+ None ,
135+ kwargs
136+ )
77137 try :
78138 secondary_runner_status , secondary_runner_str = secondary_runner .match (input )
79139 if secondary_runner_status != oracle :
@@ -84,11 +144,27 @@ def harness(
84144 # failed_inputs.append(input)
85145 except RegexRunError as e :
86146 secondary_runner .save (output_path )
87- return HarnessResult (regex , inp_num , oracle , [input ], HarnessStatus .RUN_ERROR , str (e ))
147+ return _return_harness_result (
148+ HarnessResult (regex , inp_num , oracle , [input ], HarnessStatus .RUN_ERROR , str (e )),
149+ status_to_save ,
150+ output_path ,
151+ secondary_runner ,
152+ kwargs
153+ )
88154
89155 if len (failed_inputs ) > 0 :
90- secondary_runner .save (output_path )
91- return HarnessResult (regex , inp_num , oracle , failed_inputs , HarnessStatus .FAILED )
156+ return _return_harness_result (
157+ HarnessResult (regex , inp_num , oracle , failed_inputs , HarnessStatus .FAILED ),
158+ status_to_save ,
159+ output_path ,
160+ secondary_runner ,
161+ kwargs
162+ )
92163
93- secondary_runner .clean ()
94- return HarnessResult (regex , inp_num , oracle , [], HarnessStatus .SUCCESS )
164+ return _return_harness_result (
165+ HarnessResult (regex , inp_num , oracle , [], HarnessStatus .SUCCESS ),
166+ status_to_save ,
167+ output_path ,
168+ secondary_runner ,
169+ kwargs
170+ )
0 commit comments