8
8
9
9
#include < gtest/gtest.h>
10
10
#include < cstdio>
11
+ #include < stdio.h>
11
12
12
13
#include < executorch/devtools/etdump/data_sinks/buffer_data_sink.h>
14
+ #include < executorch/devtools/etdump/data_sinks/file_data_sink.h>
13
15
#include < executorch/devtools/etdump/etdump_flatcc.h>
14
16
#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
15
17
#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
19
21
#include < executorch/test/utils/DeathTest.h>
20
22
#include < cstdint>
21
23
#include < cstring>
24
+ #include < fstream>
22
25
23
26
using ::executorch::aten::ScalarType;
24
27
using ::executorch::aten::Tensor;
@@ -36,6 +39,7 @@ using ::executorch::runtime::Tag;
36
39
using ::executorch::runtime::testing::TensorFactory;
37
40
38
41
using ::executorch::etdump::BufferDataSink;
42
+ using ::executorch::etdump::FileDataSink;
39
43
40
44
class ProfilerETDumpTest : public ::testing::Test {
41
45
protected:
@@ -45,16 +49,23 @@ class ProfilerETDumpTest : public ::testing::Test {
45
49
const size_t buf_size = 512 * 1024 ;
46
50
buf = (uint8_t *)malloc (buf_size * sizeof (uint8_t ));
47
51
etdump_gen[1 ] = new ETDumpGen (Span<uint8_t >(buf, buf_size));
52
+
53
+ std::array<char , L_tmpnam> dummy_name;
54
+ dummy_name[L_tmpnam-1 ] = ' \0 ' ;
55
+ dump_file_path = std::string (dummy_name.data ()) + " -dump" ;
48
56
}
49
57
50
58
void TearDown () override {
51
59
delete etdump_gen[0 ];
52
60
delete etdump_gen[1 ];
53
61
free (buf);
62
+
63
+ std::remove (dump_file_path.c_str ());
54
64
}
55
65
56
66
ETDumpGen* etdump_gen[2 ];
57
67
uint8_t * buf = nullptr ;
68
+ std::string dump_file_path;
58
69
};
59
70
60
71
TEST_F (ProfilerETDumpTest, SingleProfileEvent) {
@@ -177,7 +188,7 @@ TEST_F(ProfilerETDumpTest, AllocationEvents) {
177
188
178
189
TEST_F (ProfilerETDumpTest, DebugEvent) {
179
190
for (size_t i = 0 ; i < 2 ; i++) {
180
- for (size_t j = 0 ; j < 2 ; j++) {
191
+ for (size_t j = 0 ; j < 3 ; j++) {
181
192
etdump_gen[i]->create_event_block (" test_block" );
182
193
183
194
void * ptr = malloc (2048 );
@@ -199,16 +210,22 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
199
210
// using span to record debug data
200
211
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
201
212
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
213
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
214
+
202
215
if (j == 0 ) {
203
216
ET_EXPECT_DEATH (
204
217
etdump_gen[i]->log_evalue (evalue_tensor),
205
218
" Must set data sink before writing tensor-like data" );
206
219
etdump_gen[i]->set_debug_buffer (buffer);
207
220
}
208
- // using data sink to record debug data
209
- else {
221
+ // using buffer data sink to record debug data
222
+ else if (j == 1 ) {
210
223
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
211
224
}
225
+ // using file data sink to record debug data
226
+ else {
227
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
228
+ }
212
229
213
230
etdump_gen[i]->log_evalue (evalue_tensor);
214
231
etdump_gen[i]->log_evalue (
@@ -221,7 +238,7 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
221
238
222
239
TEST_F (ProfilerETDumpTest, DebugEventTensorList) {
223
240
for (size_t i = 0 ; i < 2 ; i++) {
224
- for (size_t j = 0 ; j < 2 ; j++) {
241
+ for (size_t j = 0 ; j < 3 ; j++) {
225
242
TensorFactory<ScalarType::Int> tf;
226
243
executorch::aten::Tensor storage[2 ] = {tf.ones ({3 , 2 }), tf.ones ({3 , 2 })};
227
244
EValue evalue_1 (storage[0 ]);
@@ -238,15 +255,20 @@ TEST_F(ProfilerETDumpTest, DebugEventTensorList) {
238
255
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
239
256
240
257
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
258
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
241
259
242
260
// using span to record debug data
243
261
if (j == 0 ) {
244
262
etdump_gen[i]->set_debug_buffer (buffer);
245
263
}
246
- // using data sink to record debug data
247
- else {
264
+ // using buffer data sink to record debug data
265
+ else if (j == 1 ) {
248
266
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
249
267
}
268
+ // using file data sink to record debug dats
269
+ else {
270
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
271
+ }
250
272
251
273
etdump_gen[i]->log_evalue (evalue);
252
274
@@ -267,15 +289,20 @@ TEST_F(ProfilerETDumpTest, VerifyLogging) {
267
289
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
268
290
269
291
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
292
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
270
293
271
294
// using span to record debug data
272
295
if (j == 0 ) {
273
296
etdump_gen[i]->set_debug_buffer (buffer);
274
297
}
275
- // using data sink to record debug data
276
- else {
298
+ // using buffer data sink to record debug data
299
+ else if (j == 1 ) {
277
300
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
278
301
}
302
+ // using buffer data sink to record debug data
303
+ else {
304
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
305
+ }
279
306
280
307
etdump_gen[i]->log_evalue (evalue);
281
308
etdump_gen[i]->log_evalue (evalue, LoggedEValueType::kProgramOutput );
@@ -473,11 +500,12 @@ TEST_F(ProfilerETDumpTest, VerifyData) {
473
500
474
501
TEST_F (ProfilerETDumpTest, LogDelegateIntermediateOutput) {
475
502
for (size_t i = 0 ; i < 2 ; i++) {
476
- for (size_t j = 0 ; j < 2 ; j++) {
503
+ for (size_t j = 0 ; j < 3 ; j++) {
477
504
void * ptr = malloc (2048 );
478
505
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
479
506
480
507
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
508
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
481
509
482
510
etdump_gen[i]->create_event_block (" test_block" );
483
511
TensorFactory<ScalarType::Float> tf;
@@ -493,10 +521,14 @@ TEST_F(ProfilerETDumpTest, LogDelegateIntermediateOutput) {
493
521
" Must set data sink before writing tensor-like data" );
494
522
etdump_gen[i]->set_debug_buffer (buffer);
495
523
}
496
- // using data sink to record debug data
497
- else {
524
+ // using buffer data sink to record debug data
525
+ else if (j == 1 ) {
498
526
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
499
527
}
528
+ // using file data sink to record debug data
529
+ else {
530
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
531
+ }
500
532
501
533
// Log a tensor
502
534
etdump_gen[i]->log_intermediate_output_delegate (
@@ -546,22 +578,27 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) {
546
578
EValue evalue (tf.ones ({3 , 2 }));
547
579
548
580
for (size_t i = 0 ; i < 2 ; i++) {
549
- for (size_t j = 0 ; j < 2 ; j++) {
581
+ for (size_t j = 0 ; j < 3 ; j++) {
550
582
etdump_gen[i]->create_event_block (" test_block" );
551
583
552
584
void * ptr = malloc (2048 );
553
585
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
554
586
;
555
587
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
588
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
556
589
557
590
// using span to record debug data
558
591
if (j == 0 ) {
559
592
etdump_gen[i]->set_debug_buffer (buffer);
560
593
}
561
- // using data sink to record debug data
562
- else {
594
+ // using buffer data sink to record debug data
595
+ else if (j == 1 ) {
563
596
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
564
597
}
598
+ // using file data sink to record debug data
599
+ else {
600
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
601
+ }
565
602
566
603
// Event 0
567
604
etdump_gen[i]->log_intermediate_output_delegate (
0 commit comments