17
17
use coppers_sensors:: { RAPLSensor , Sensor } ;
18
18
use std:: any:: Any ;
19
19
use std:: io:: { self , Write } ;
20
- use std:: panic:: { catch_unwind, AssertUnwindSafe } ;
20
+ use std:: panic:: catch_unwind;
21
21
use std:: sync:: { Arc , Mutex } ;
22
- use std:: time:: Instant ;
23
22
use test:: { StaticTestFn , TestDescAndFn } ;
24
23
25
24
pub fn runner ( tests : & [ & test:: TestDescAndFn ] ) {
@@ -28,34 +27,34 @@ pub fn runner(tests: &[&test::TestDescAndFn]) {
28
27
println ! ( "Running {} tests" , tests. len( ) ) ;
29
28
30
29
let mut ignored = 0 ;
31
- let mut filtered = 0 ;
32
-
33
- let now = Instant :: now ( ) ;
30
+ //let mut filtered = 0;
34
31
35
32
let mut passed_tests = Vec :: new ( ) ;
36
33
let mut failed_tests = Vec :: new ( ) ;
37
34
35
+ let mut sensor =
36
+ RAPLSensor :: new ( "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:0" . to_string ( ) )
37
+ . unwrap ( ) ;
38
+ sensor. start_measuring ( ) ;
39
+
38
40
for test in tests {
39
41
let result = run_test ( test) ;
40
42
print_test_result ( & result) ;
41
43
match result. state {
42
44
TestResult :: Passed => passed_tests. push ( result) ,
43
45
TestResult :: Failed ( _) => failed_tests. push ( result) ,
44
46
TestResult :: Ignored => ignored += 1 ,
45
- TestResult :: Filtered => filtered += 1 ,
47
+ // TestResult::Filtered => filtered += 1,
46
48
}
47
-
48
- //println!("{}", result.sensor.unwrap().get_measured_uj())
49
49
}
50
50
51
- let elapsed = now . elapsed ( ) ;
52
- let seconds = elapsed . as_secs ( ) ;
53
- let millis = elapsed . subsec_millis ( ) ;
51
+ sensor . stop_measuring ( ) ;
52
+ let elapsed = sensor . get_elapsed_time_us ( ) ;
53
+ let uj = sensor . get_measured_uj ( ) ;
54
54
55
55
print_failures ( & failed_tests) . unwrap ( ) ;
56
56
57
- let total = passed_tests. len ( ) + failed_tests. len ( ) ;
58
- println ! ( "test result: {}. {} passed; {} failed; {ignored} ignored; {filtered} filtered out; finished in {seconds}.{millis}s" , passed( failed_tests. is_empty( ) ) , passed_tests. len( ) , failed_tests. len( ) )
57
+ println ! ( "test result: {}. {} passed; {} failed; {ignored} ignored; finished in {elapsed} μs consuming {uj} μJ" , passed( failed_tests. is_empty( ) ) , passed_tests. len( ) , failed_tests. len( ) )
59
58
}
60
59
61
60
fn print_failures ( tests : & Vec < CompletedTest > ) -> std:: io:: Result < ( ) > {
@@ -65,39 +64,36 @@ fn print_failures(tests: &Vec<CompletedTest>) -> std::io::Result<()> {
65
64
for test in tests {
66
65
if let Some ( captured) = & test. stdout {
67
66
handle. write_fmt ( format_args ! ( "\n ---- {} stdout ----\n " , test. desc. name) ) ?;
68
- handle. write_all ( & captured) ?;
69
- handle. write ( b"\n " ) ?;
67
+ handle. write_all ( captured) ?;
68
+ handle. write_all ( b"\n " ) ?;
70
69
}
71
70
}
72
- handle. write ( b"\n failures:\n " ) ?;
71
+ handle. write_all ( b"\n failures:\n " ) ?;
73
72
for test in tests {
74
73
handle. write_fmt ( format_args ! ( "\t {}" , test. desc. name) ) ?;
75
74
if let TestResult :: Failed ( Some ( msg) ) = & test. state {
76
- handle. write_fmt ( format_args ! ( ": {}\n " , msg) ) ;
75
+ handle. write_fmt ( format_args ! ( ": {}\n " , msg) ) ? ;
77
76
}
78
77
}
79
- handle. write ( b"\n " ) ?;
78
+ handle. write_all ( b"\n " ) ?;
80
79
}
81
80
Ok ( ( ) )
82
81
}
83
82
84
83
fn print_test_result ( test : & CompletedTest ) {
85
84
match test. state {
86
85
TestResult :: Passed => {
87
- let sensor = test. sensor . as_ref ( ) . unwrap ( ) ;
88
- let uj = ( * sensor) . get_measured_uj ( ) ;
89
- let us = ( * sensor) . get_elapsed_time_us ( ) ;
90
- println ! ( "test {} ... {} - [{uj} μJ in {us} μs]" , test. desc. name, passed( true ) )
91
- } ,
86
+ let uj = test. uj . unwrap ( ) ;
87
+ let us = test. us . unwrap ( ) ;
88
+ println ! (
89
+ "test {} ... {} - [{uj} μJ in {us} μs]" ,
90
+ test. desc. name,
91
+ passed( true )
92
+ )
93
+ }
92
94
TestResult :: Failed ( _) => {
93
- if let Some ( sensor) = & test. sensor {
94
- let uj = ( * sensor) . get_measured_uj ( ) ;
95
- let us = ( * sensor) . get_elapsed_time_us ( ) ;
96
- println ! ( "test {} ... {} - [{uj} μJ in {us} μs]" , test. desc. name, passed( false ) )
97
- } else {
98
- println ! ( "test {} ... {}" , test. desc. name, passed( false ) )
99
- }
100
- } ,
95
+ println ! ( "test {} ... {}" , test. desc. name, passed( false ) )
96
+ }
101
97
_ => { }
102
98
}
103
99
}
@@ -125,13 +121,14 @@ enum TestResult {
125
121
Passed ,
126
122
Failed ( Option < String > ) ,
127
123
Ignored ,
128
- Filtered ,
124
+ // Filtered,
129
125
}
130
126
131
127
struct CompletedTest {
132
128
desc : test:: TestDesc ,
133
129
state : TestResult ,
134
- sensor : Option < Box < dyn Sensor > > ,
130
+ uj : Option < u128 > ,
131
+ us : Option < u128 > ,
135
132
stdout : Option < Vec < u8 > > ,
136
133
}
137
134
@@ -140,7 +137,8 @@ impl CompletedTest {
140
137
CompletedTest {
141
138
desc,
142
139
state : TestResult :: Ignored ,
143
- sensor : None ,
140
+ uj : None ,
141
+ us : None ,
144
142
stdout : None ,
145
143
}
146
144
}
@@ -151,34 +149,36 @@ fn run_test(test: test::TestDescAndFn) -> CompletedTest {
151
149
if test. desc . ignore {
152
150
CompletedTest :: empty ( test. desc )
153
151
} else {
154
- let sensor =
155
- RAPLSensor :: new ( "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:0" . to_string ( ) ) ;
156
-
157
- // If the sensor could not be properly created, mark the test as failed.
158
- if sensor. is_err ( ) {
159
- return sensor
160
- . map_err ( |err| CompletedTest {
161
- state : TestResult :: Failed ( Some ( err. to_string ( ) ) ) ,
162
- ..CompletedTest :: empty ( test. desc )
163
- } )
164
- . unwrap_err ( ) ;
165
- }
166
- let mut sensor = sensor. unwrap ( ) ;
152
+ let mut sensor =
153
+ RAPLSensor :: new ( "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:0" . to_string ( ) )
154
+ . unwrap ( ) ;
167
155
168
156
// Use internal compiler function `set_output_capture` to capture the output of the
169
157
// tests.
170
158
let data = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
171
159
io:: set_output_capture ( Some ( data. clone ( ) ) ) ;
172
160
173
- let result = match test. testfn {
174
- test:: TestFn :: StaticTestFn ( f) => catch_unwind ( AssertUnwindSafe ( || {
175
- sensor. start_measuring ( ) ;
161
+ let mut uj = 0 ;
162
+ let mut us = 0 ;
163
+
164
+ let state = match test. testfn {
165
+ test:: TestFn :: StaticTestFn ( f) => {
166
+ let mut state = TestResult :: Ignored ;
176
167
// Run the test function 100 times in a row
177
168
for _ in 0 ..100 {
178
- f ( ) ;
169
+ sensor. start_measuring ( ) ;
170
+ let result = catch_unwind ( f) ;
171
+ sensor. stop_measuring ( ) ;
172
+ uj += sensor. get_measured_uj ( ) ;
173
+ us += sensor. get_elapsed_time_us ( ) ;
174
+
175
+ state = test_state ( & test. desc , result) ;
176
+ if state != TestResult :: Passed {
177
+ break ;
178
+ }
179
179
}
180
- sensor . stop_measuring ( ) ;
181
- } ) ) ,
180
+ state
181
+ }
182
182
_ => unimplemented ! ( "Only StaticTestFns are supported right now" ) ,
183
183
} ;
184
184
@@ -187,11 +187,11 @@ fn run_test(test: test::TestDescAndFn) -> CompletedTest {
187
187
io:: set_output_capture ( None ) ;
188
188
let stdout = Some ( data. lock ( ) . unwrap_or_else ( |e| e. into_inner ( ) ) . to_vec ( ) ) ;
189
189
190
- let state = test_state ( & test. desc , result) ;
191
190
CompletedTest {
192
191
desc : test. desc ,
193
192
state,
194
- sensor : Some ( Box :: new ( sensor) ) ,
193
+ uj : Some ( uj) ,
194
+ us : Some ( us) ,
195
195
stdout,
196
196
}
197
197
}
0 commit comments