12
12
13
13
#include < executorch/devtools/etdump/data_sinks/buffer_data_sink.h>
14
14
#include < executorch/devtools/etdump/data_sinks/file_data_sink.h>
15
+ #include < executorch/devtools/etdump/etdump_filter.h>
15
16
#include < executorch/devtools/etdump/etdump_flatcc.h>
16
17
#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
17
18
#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
@@ -33,6 +34,7 @@ using ::executorch::runtime::AllocatorID;
33
34
using ::executorch::runtime::ArrayRef;
34
35
using ::executorch::runtime::BoxedEvalueList;
35
36
using ::executorch::runtime::DelegateDebugIdType;
37
+ using ::executorch::runtime::DelegateDebugIntId;
36
38
using ::executorch::runtime::Error;
37
39
using ::executorch::runtime::EValue;
38
40
using ::executorch::runtime::EventTracerEntry;
@@ -45,6 +47,8 @@ using ::executorch::runtime::testing::TensorFactory;
45
47
using ::executorch::etdump::BufferDataSink;
46
48
using ::executorch::etdump::FileDataSink;
47
49
50
+ using ::executorch::etdump::ETDumpFilter;
51
+
48
52
class ProfilerETDumpTest : public ::testing::Test {
49
53
protected:
50
54
void SetUp () override {
@@ -75,6 +79,70 @@ class ProfilerETDumpTest : public ::testing::Test {
75
79
" Must set data sink before writing tensor-like data" );
76
80
}
77
81
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
+
78
146
ETDumpGen* etdump_gen[2 ];
79
147
uint8_t * buf = nullptr ;
80
148
std::unique_ptr<TempFile> temp_file;
@@ -652,7 +720,7 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) {
652
720
653
721
void * ptr = malloc (2048 );
654
722
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
655
- ;
723
+
656
724
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
657
725
auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
658
726
@@ -892,3 +960,62 @@ TEST_F(ProfilerETDumpTest, WriteAfterGetETDumpData) {
892
960
}
893
961
}
894
962
}
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