88
99#include < gtest/gtest.h>
1010#include < cstdio>
11+ #include < memory>
1112
1213#include < executorch/devtools/etdump/data_sinks/buffer_data_sink.h>
14+ #include < executorch/devtools/etdump/data_sinks/file_data_sink.h>
1315#include < executorch/devtools/etdump/etdump_flatcc.h>
1416#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
1517#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
18+ #include < executorch/extension/testing_util/temp_file.h>
1619#include < executorch/runtime/core/exec_aten/testing_util/tensor_factory.h>
1720#include < executorch/runtime/core/span.h>
1821#include < executorch/runtime/platform/runtime.h>
@@ -24,6 +27,7 @@ using ::executorch::aten::ScalarType;
2427using ::executorch::aten::Tensor;
2528using ::executorch::etdump::ETDumpGen;
2629using ::executorch::etdump::ETDumpResult;
30+ using ::executorch::extension::testing::TempFile;
2731using ::executorch::runtime::AllocatorID;
2832using ::executorch::runtime::ArrayRef;
2933using ::executorch::runtime::BoxedEvalueList;
@@ -36,6 +40,7 @@ using ::executorch::runtime::Tag;
3640using ::executorch::runtime::testing::TensorFactory;
3741
3842using ::executorch::etdump::BufferDataSink;
43+ using ::executorch::etdump::FileDataSink;
3944
4045class ProfilerETDumpTest : public ::testing::Test {
4146 protected:
@@ -45,6 +50,9 @@ class ProfilerETDumpTest : public ::testing::Test {
4550 const size_t buf_size = 512 * 1024 ;
4651 buf = (uint8_t *)malloc (buf_size * sizeof (uint8_t ));
4752 etdump_gen[1 ] = new ETDumpGen (Span<uint8_t >(buf, buf_size));
53+
54+ temp_file = std::make_unique<TempFile>(std::string ());
55+ dump_file_path = temp_file->path ();
4856 }
4957
5058 void TearDown () override {
@@ -55,6 +63,8 @@ class ProfilerETDumpTest : public ::testing::Test {
5563
5664 ETDumpGen* etdump_gen[2 ];
5765 uint8_t * buf = nullptr ;
66+ std::unique_ptr<TempFile> temp_file;
67+ std::string dump_file_path;
5868};
5969
6070TEST_F (ProfilerETDumpTest, SingleProfileEvent) {
@@ -177,7 +187,7 @@ TEST_F(ProfilerETDumpTest, AllocationEvents) {
177187
178188TEST_F (ProfilerETDumpTest, DebugEvent) {
179189 for (size_t i = 0 ; i < 2 ; i++) {
180- for (size_t j = 0 ; j < 2 ; j++) {
190+ for (size_t j = 0 ; j < 3 ; j++) {
181191 etdump_gen[i]->create_event_block (" test_block" );
182192
183193 void * ptr = malloc (2048 );
@@ -199,16 +209,22 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
199209 // using span to record debug data
200210 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
201211 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
212+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
213+
202214 if (j == 0 ) {
203215 ET_EXPECT_DEATH (
204216 etdump_gen[i]->log_evalue (evalue_tensor),
205217 " Must set data sink before writing tensor-like data" );
206218 etdump_gen[i]->set_debug_buffer (buffer);
207219 }
208- // using data sink to record debug data
209- else {
220+ // using buffer data sink to record debug data
221+ else if (j == 1 ) {
210222 etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
211223 }
224+ // using file data sink to record debug data
225+ else {
226+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
227+ }
212228
213229 etdump_gen[i]->log_evalue (evalue_tensor);
214230 etdump_gen[i]->log_evalue (
@@ -221,7 +237,7 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
221237
222238TEST_F (ProfilerETDumpTest, DebugEventTensorList) {
223239 for (size_t i = 0 ; i < 2 ; i++) {
224- for (size_t j = 0 ; j < 2 ; j++) {
240+ for (size_t j = 0 ; j < 3 ; j++) {
225241 TensorFactory<ScalarType::Int> tf;
226242 executorch::aten::Tensor storage[2 ] = {tf.ones ({3 , 2 }), tf.ones ({3 , 2 })};
227243 EValue evalue_1 (storage[0 ]);
@@ -238,15 +254,20 @@ TEST_F(ProfilerETDumpTest, DebugEventTensorList) {
238254 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
239255
240256 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
257+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
241258
242259 // using span to record debug data
243260 if (j == 0 ) {
244261 etdump_gen[i]->set_debug_buffer (buffer);
245262 }
246- // using data sink to record debug data
247- else {
263+ // using buffer data sink to record debug data
264+ else if (j == 1 ) {
248265 etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
249266 }
267+ // using file data sink to record debug dats
268+ else {
269+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
270+ }
250271
251272 etdump_gen[i]->log_evalue (evalue);
252273
@@ -267,15 +288,20 @@ TEST_F(ProfilerETDumpTest, VerifyLogging) {
267288 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
268289
269290 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
291+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
270292
271293 // using span to record debug data
272294 if (j == 0 ) {
273295 etdump_gen[i]->set_debug_buffer (buffer);
274296 }
275- // using data sink to record debug data
276- else {
297+ // using buffer data sink to record debug data
298+ else if (j == 1 ) {
277299 etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
278300 }
301+ // using buffer data sink to record debug data
302+ else {
303+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
304+ }
279305
280306 etdump_gen[i]->log_evalue (evalue);
281307 etdump_gen[i]->log_evalue (evalue, LoggedEValueType::kProgramOutput );
@@ -473,11 +499,12 @@ TEST_F(ProfilerETDumpTest, VerifyData) {
473499
474500TEST_F (ProfilerETDumpTest, LogDelegateIntermediateOutput) {
475501 for (size_t i = 0 ; i < 2 ; i++) {
476- for (size_t j = 0 ; j < 2 ; j++) {
502+ for (size_t j = 0 ; j < 3 ; j++) {
477503 void * ptr = malloc (2048 );
478504 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
479505
480506 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
507+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
481508
482509 etdump_gen[i]->create_event_block (" test_block" );
483510 TensorFactory<ScalarType::Float> tf;
@@ -493,10 +520,14 @@ TEST_F(ProfilerETDumpTest, LogDelegateIntermediateOutput) {
493520 " Must set data sink before writing tensor-like data" );
494521 etdump_gen[i]->set_debug_buffer (buffer);
495522 }
496- // using data sink to record debug data
497- else {
523+ // using buffer data sink to record debug data
524+ else if (j == 1 ) {
498525 etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
499526 }
527+ // using file data sink to record debug data
528+ else {
529+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
530+ }
500531
501532 // Log a tensor
502533 etdump_gen[i]->log_intermediate_output_delegate (
@@ -546,22 +577,27 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) {
546577 EValue evalue (tf.ones ({3 , 2 }));
547578
548579 for (size_t i = 0 ; i < 2 ; i++) {
549- for (size_t j = 0 ; j < 2 ; j++) {
580+ for (size_t j = 0 ; j < 3 ; j++) {
550581 etdump_gen[i]->create_event_block (" test_block" );
551582
552583 void * ptr = malloc (2048 );
553584 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
554585 ;
555586 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
587+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
556588
557589 // using span to record debug data
558590 if (j == 0 ) {
559591 etdump_gen[i]->set_debug_buffer (buffer);
560592 }
561- // using data sink to record debug data
562- else {
593+ // using buffer data sink to record debug data
594+ else if (j == 1 ) {
563595 etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
564596 }
597+ // using file data sink to record debug data
598+ else {
599+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
600+ }
565601
566602 // Event 0
567603 etdump_gen[i]->log_intermediate_output_delegate (
0 commit comments