1212
1313#include < executorch/devtools/etdump/data_sinks/buffer_data_sink.h>
1414#include < executorch/devtools/etdump/data_sinks/file_data_sink.h>
15+ #include < executorch/devtools/etdump/etdump_filter.h>
1516#include < executorch/devtools/etdump/etdump_flatcc.h>
1617#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
1718#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
@@ -33,6 +34,7 @@ using ::executorch::runtime::AllocatorID;
3334using ::executorch::runtime::ArrayRef;
3435using ::executorch::runtime::BoxedEvalueList;
3536using ::executorch::runtime::DelegateDebugIdType;
37+ using ::executorch::runtime::DelegateDebugIntId;
3638using ::executorch::runtime::Error;
3739using ::executorch::runtime::EValue;
3840using ::executorch::runtime::EventTracerEntry;
@@ -45,6 +47,8 @@ using ::executorch::runtime::testing::TensorFactory;
4547using ::executorch::etdump::BufferDataSink;
4648using ::executorch::etdump::FileDataSink;
4749
50+ using ::executorch::etdump::ETDumpFilter;
51+
4852class ProfilerETDumpTest : public ::testing::Test {
4953 protected:
5054 void SetUp () override {
@@ -75,6 +79,70 @@ class ProfilerETDumpTest : public ::testing::Test {
7579 " Must set data sink before writing tensor-like data" );
7680 }
7781
82+ void check_log_with_filter (
83+ const char * name,
84+ DelegateDebugIntId delegate_debug_index,
85+ bool use_tensor_input,
86+ bool expected_log,
87+ bool expected_ok) {
88+ TensorFactory<ScalarType::Float> tf;
89+ for (size_t i = 0 ; i < 2 ; i++) {
90+ const size_t buffer_size = 2048 ;
91+
92+ void * ptr = malloc (buffer_size);
93+ auto buffer_data_sink = BufferDataSink::create (ptr, buffer_size);
94+ auto filter = ETDumpFilter ();
95+ filter.add_regex (" filtered.*" );
96+ filter.set_debug_handle_range (1 , 10 );
97+ etdump_gen[i]->set_delegation_intermediate_output_filter (&filter);
98+
99+ etdump_gen[i]->create_event_block (" test_block" );
100+ etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
101+
102+ // size of empty etdump
103+ size_t initial_size = 68 ;
104+
105+ // Perform logging
106+
107+ if (use_tensor_input) {
108+ auto tensor = tf.ones ({3 , 2 });
109+ auto result = etdump_gen[i]->log_intermediate_output_delegate (
110+ name, delegate_debug_index, tensor);
111+ ASSERT_EQ (result.ok (), expected_ok);
112+ if (expected_ok) {
113+ ASSERT_EQ (result.get (), expected_log);
114+ }
115+ } else { // use tensor_list instead
116+ std::vector<Tensor> tensors = {tf.ones ({5 , 4 }), tf.ones ({7 , 6 })};
117+ Result<bool > result = etdump_gen[i]->log_intermediate_output_delegate (
118+ name,
119+ delegate_debug_index,
120+ ArrayRef<Tensor>(tensors.data (), tensors.size ()));
121+ ASSERT_EQ (result.ok (), expected_ok);
122+ if (expected_ok) {
123+ ASSERT_EQ (result.get (), expected_log);
124+ }
125+ }
126+
127+ // Get final size of etdump
128+ ETDumpResult final_result = etdump_gen[i]->get_etdump_data ();
129+ size_t final_size = final_result.size ;
130+ // Check if the size of etdump has changed based on logging success
131+ if (expected_log) {
132+ ASSERT_NE (initial_size, final_size); // Expect size change if logged
133+ } else {
134+ ASSERT_EQ (
135+ initial_size, final_size); // Expect no size change if not logged
136+ }
137+
138+ if (!etdump_gen[i]->is_static_etdump ()) {
139+ free (final_result.buf );
140+ }
141+
142+ free (ptr);
143+ }
144+ }
145+
78146 ETDumpGen* etdump_gen[2 ];
79147 uint8_t * buf = nullptr ;
80148 std::unique_ptr<TempFile> temp_file;
@@ -652,7 +720,7 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) {
652720
653721 void * ptr = malloc (2048 );
654722 Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
655- ;
723+
656724 auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
657725 auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
658726
@@ -892,3 +960,62 @@ TEST_F(ProfilerETDumpTest, WriteAfterGetETDumpData) {
892960 }
893961 }
894962}
963+
964+ TEST_F (ProfilerETDumpTest, LogWithRegexAndUnsetDelegateDebugIdOnTensor) {
965+ check_log_with_filter (
966+ " filtered_event" ,
967+ kUnsetDelegateDebugIntId ,
968+ /* use_tensor_input=*/ true ,
969+ /* expected_log=*/ false ,
970+ /* expected_ok=*/ true );
971+ }
972+
973+ TEST_F (ProfilerETDumpTest, LogWithRegexAndUnsetDelegateDebugIdOnTensorList) {
974+ check_log_with_filter (
975+ " filtered_event" ,
976+ kUnsetDelegateDebugIntId ,
977+ /* use_tensor_input=*/ true ,
978+ /* expected_log=*/ false ,
979+ /* expected_ok=*/ true );
980+ }
981+
982+ TEST_F (ProfilerETDumpTest, LogWithNullptrAndInRange) {
983+ check_log_with_filter (
984+ nullptr ,
985+ 5 ,
986+ /* use_tensor_input=*/ true ,
987+ /* expected_log=*/ false ,
988+ /* expected_ok=*/ true );
989+ }
990+ TEST_F (ProfilerETDumpTest, LogWithNonMatchingRegexAndOutOfRange) {
991+ check_log_with_filter (
992+ " unfiltered_event" ,
993+ kUnsetDelegateDebugIntId ,
994+ /* use_tensor_input=*/ true ,
995+ /* expected_log=*/ true ,
996+ /* expected_ok=*/ true );
997+ }
998+ TEST_F (ProfilerETDumpTest, LogWithNullptrAndOutOfRange) {
999+ check_log_with_filter (
1000+ nullptr ,
1001+ 20 ,
1002+ /* use_tensor_input=*/ true ,
1003+ /* expected_log=*/ true ,
1004+ /* expected_ok=*/ true );
1005+ }
1006+ TEST_F (ProfilerETDumpTest, LogWithRegexAndInRange) {
1007+ check_log_with_filter (
1008+ " filtered_event" ,
1009+ 5 ,
1010+ /* use_tensor_input=*/ true ,
1011+ /* expected_log=*/ false ,
1012+ /* expected_ok=*/ false );
1013+ }
1014+ TEST_F (ProfilerETDumpTest, LogWithNullptrAndUnsetDebugHandle) {
1015+ check_log_with_filter (
1016+ nullptr ,
1017+ kUnsetDelegateDebugIntId ,
1018+ /* use_tensor_input=*/ true ,
1019+ /* expected_log=*/ false ,
1020+ /* expected_ok=*/ false );
1021+ }
0 commit comments