privacy_filtering_check_unittest.cc 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/tracing/perfetto/privacy_filtering_check.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. #include "third_party/perfetto/protos/perfetto/trace/trace.pb.h"
  7. #include "third_party/perfetto/protos/perfetto/trace/trace_packet.pb.h"
  8. #include "third_party/perfetto/protos/perfetto/trace/track_event/process_descriptor.pb.h"
  9. #include "third_party/perfetto/protos/perfetto/trace/track_event/thread_descriptor.pb.h"
  10. #include "third_party/perfetto/protos/perfetto/trace/track_event/track_descriptor.pb.h"
  11. #include "third_party/perfetto/protos/perfetto/trace/track_event/track_event.pb.h"
  12. namespace tracing {
  13. void FillDisallowedTestField(perfetto::protos::TracePacket* packet) {
  14. auto* for_testing = packet->mutable_for_testing();
  15. for_testing->set_str("TestField");
  16. for_testing->set_counter(10);
  17. }
  18. perfetto::protos::Trace GetFilteredTrace(const perfetto::protos::Trace& trace) {
  19. std::string serialized = trace.SerializeAsString();
  20. PrivacyFilteringCheck check;
  21. check.RemoveBlockedFields(serialized);
  22. perfetto::protos::Trace filtered;
  23. EXPECT_TRUE(filtered.ParseFromString(serialized));
  24. return filtered;
  25. }
  26. TEST(PrivacyFilteringTest, EmptyTrace) {
  27. perfetto::protos::Trace trace;
  28. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  29. ASSERT_EQ(0, filtered.packet_size());
  30. }
  31. TEST(PrivacyFilteringTest, SafeToplevelField) {
  32. perfetto::protos::Trace trace;
  33. trace.add_packet()->set_timestamp(10);
  34. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  35. ASSERT_EQ(1, filtered.packet_size());
  36. EXPECT_EQ(10u, filtered.packet(0).timestamp());
  37. }
  38. TEST(PrivacyFilteringTest, SafeToplevelMessageField) {
  39. perfetto::protos::Trace trace;
  40. trace.add_packet()->mutable_track_event()->set_track_uuid(11);
  41. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  42. ASSERT_EQ(1, filtered.packet_size());
  43. EXPECT_EQ(11u, filtered.packet(0).track_event().track_uuid());
  44. }
  45. TEST(PrivacyFilteringTest, RepeatedFields) {
  46. perfetto::protos::Trace trace;
  47. auto* track_event = trace.add_packet()->mutable_track_event();
  48. track_event->add_debug_annotations()->set_name_iid(5);
  49. track_event->add_debug_annotations()->set_name_iid(2);
  50. track_event->add_debug_annotations()->set_name_iid(8);
  51. track_event->add_flow_ids(3);
  52. track_event->add_flow_ids(6);
  53. track_event->add_flow_ids(9);
  54. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  55. ASSERT_EQ(1, filtered.packet_size());
  56. EXPECT_EQ(0, filtered.packet(0).track_event().debug_annotations_size());
  57. EXPECT_EQ(3u, filtered.packet(0).track_event().flow_ids(0));
  58. EXPECT_EQ(6u, filtered.packet(0).track_event().flow_ids(1));
  59. EXPECT_EQ(9u, filtered.packet(0).track_event().flow_ids(2));
  60. }
  61. TEST(PrivacyFilteringTest, UnsafeToplevelField) {
  62. perfetto::protos::Trace trace;
  63. FillDisallowedTestField(trace.add_packet());
  64. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  65. ASSERT_EQ(0, filtered.packet_size());
  66. }
  67. TEST(PrivacyFilteringTest, SafeMessageWithOnlyUnsafeFields) {
  68. perfetto::protos::Trace trace;
  69. auto* packet = trace.add_packet();
  70. packet->mutable_track_event()->mutable_legacy_event();
  71. auto* debug_annotations =
  72. packet->mutable_track_event()->add_debug_annotations();
  73. debug_annotations->set_name_iid(2);
  74. debug_annotations->set_int_value(10);
  75. packet->mutable_track_event()->mutable_log_message()->set_body_iid(1);
  76. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  77. ASSERT_EQ(0, filtered.packet_size());
  78. }
  79. TEST(PrivacyFilteringTest, SafeAndUnsafeFields) {
  80. perfetto::protos::Trace trace;
  81. perfetto::protos::TracePacket* packet = trace.add_packet();
  82. FillDisallowedTestField(packet);
  83. packet->mutable_trace_packet_defaults()->set_timestamp_clock_id(11);
  84. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  85. ASSERT_EQ(1, filtered.packet_size());
  86. EXPECT_EQ(11u,
  87. filtered.packet(0).trace_packet_defaults().timestamp_clock_id());
  88. EXPECT_FALSE(filtered.packet(0).has_for_testing());
  89. }
  90. TEST(PrivacyFilteringTest, SafeAndUnsafePackets) {
  91. perfetto::protos::Trace trace;
  92. FillDisallowedTestField(trace.add_packet());
  93. trace.add_packet()->mutable_trace_packet_defaults()->set_timestamp_clock_id(
  94. 11);
  95. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  96. ASSERT_EQ(1, filtered.packet_size());
  97. EXPECT_FALSE(filtered.packet(0).has_for_testing());
  98. EXPECT_EQ(11u,
  99. filtered.packet(0).trace_packet_defaults().timestamp_clock_id());
  100. }
  101. TEST(PrivacyFilteringTest, NestedSafeAndUnsafeFields) {
  102. perfetto::protos::Trace trace;
  103. perfetto::protos::TracePacket* packet = trace.add_packet();
  104. FillDisallowedTestField(packet);
  105. packet->set_timestamp(50);
  106. auto* track_event = packet->mutable_track_event();
  107. track_event->set_track_uuid(11);
  108. track_event->mutable_log_message()->set_body_iid(10);
  109. track_event->set_name_iid(1);
  110. track_event->add_category_iids(2);
  111. auto* hist = track_event->mutable_chrome_histogram_sample();
  112. hist->set_name_hash(4);
  113. hist->set_name("hist");
  114. hist->set_sample(5);
  115. track_event->add_flow_ids(3);
  116. track_event->add_debug_annotations()->set_name_iid(2);
  117. track_event->add_flow_ids(6);
  118. track_event->add_debug_annotations()->set_name_iid(5);
  119. track_event->add_flow_ids(9);
  120. track_event->add_debug_annotations()->set_name_iid(8);
  121. perfetto::protos::Trace filtered = GetFilteredTrace(trace);
  122. ASSERT_EQ(1, filtered.packet_size());
  123. const auto& packet1 = filtered.packet(0);
  124. EXPECT_FALSE(packet1.has_for_testing());
  125. EXPECT_EQ(50u, packet1.timestamp());
  126. const auto& event = packet1.track_event();
  127. EXPECT_EQ(11u, event.track_uuid());
  128. EXPECT_FALSE(event.has_log_message());
  129. EXPECT_EQ(1u, event.name_iid());
  130. ASSERT_EQ(1, event.category_iids_size());
  131. EXPECT_EQ(2u, event.category_iids(0));
  132. EXPECT_EQ(0, event.debug_annotations_size());
  133. ASSERT_EQ(3, event.flow_ids_size());
  134. EXPECT_EQ(3u, event.flow_ids(0));
  135. EXPECT_EQ(6u, event.flow_ids(1));
  136. EXPECT_EQ(9u, event.flow_ids(2));
  137. const auto& histogram = event.chrome_histogram_sample();
  138. EXPECT_EQ(4u, histogram.name_hash());
  139. EXPECT_FALSE(histogram.has_name());
  140. EXPECT_EQ(5, histogram.sample());
  141. }
  142. } // namespace tracing