Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(510)

Side by Side Diff: components/metrics/child_call_stack_profile_collector_unittest.cc

Issue 2438073002: Use movable types for CallStackProfile(s) to remove copying of data. (Closed)
Patch Set: fix tests and build problems Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/metrics/child_call_stack_profile_collector.h" 5 #include "components/metrics/child_call_stack_profile_collector.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 17 matching lines...) Expand all
28 class Receiver : public mojom::CallStackProfileCollector { 28 class Receiver : public mojom::CallStackProfileCollector {
29 public: 29 public:
30 using CallStackProfile = base::StackSamplingProfiler::CallStackProfile; 30 using CallStackProfile = base::StackSamplingProfiler::CallStackProfile;
31 31
32 Receiver(mojom::CallStackProfileCollectorRequest request) 32 Receiver(mojom::CallStackProfileCollectorRequest request)
33 : binding_(this, std::move(request)) {} 33 : binding_(this, std::move(request)) {}
34 ~Receiver() override {} 34 ~Receiver() override {}
35 35
36 void Collect(const CallStackProfileParams& params, 36 void Collect(const CallStackProfileParams& params,
37 base::TimeTicks start_timestamp, 37 base::TimeTicks start_timestamp,
38 const std::vector<CallStackProfile>& profiles) override { 38 std::vector<CallStackProfile> profiles) override {
39 this->profiles.push_back(ChildCallStackProfileCollector::ProfilesState( 39 this->profiles.push_back(ChildCallStackProfileCollector::ProfilesState(
40 params, 40 params,
41 start_timestamp, 41 start_timestamp,
42 profiles)); 42 std::move(profiles)));
43 } 43 }
44 44
45 std::vector<ChildCallStackProfileCollector::ProfilesState> profiles; 45 std::vector<ChildCallStackProfileCollector::ProfilesState> profiles;
46 46
47 private: 47 private:
48 mojo::Binding<mojom::CallStackProfileCollector> binding_; 48 mojo::Binding<mojom::CallStackProfileCollector> binding_;
49 49
50 DISALLOW_COPY_AND_ASSIGN(Receiver); 50 DISALLOW_COPY_AND_ASSIGN(Receiver);
51 }; 51 };
52 52
53 ChildCallStackProfileCollectorTest() 53 ChildCallStackProfileCollectorTest()
54 : receiver_impl_(new Receiver(GetProxy(&receiver_))) {} 54 : receiver_impl_(new Receiver(GetProxy(&receiver_))) {}
55 55
56 void CollectProfiles( 56 void CollectProfiles(
Mike Wittman 2016/10/21 18:05:29 This function can be removed.
bcwhite 2016/10/24 13:17:45 Done.
57 const CallStackProfileParams& params, 57 const CallStackProfileParams& params,
58 const base::StackSamplingProfiler::CallStackProfiles& profiles) { 58 base::StackSamplingProfiler::CallStackProfiles profiles) {
59 child_collector_.GetProfilerCallback(params).Run(profiles); 59 child_collector_.GetProfilerCallback(params).Run(std::move(profiles));
60 }
61
62 void CollectEmptyProfiles(
63 const CallStackProfileParams& params,
64 size_t profile_count) {
65 base::StackSamplingProfiler::CallStackProfiles profiles;
66 for (size_t i = 0; i < profile_count; ++i)
67 profiles.push_back(base::StackSamplingProfiler::CallStackProfile());
68 child_collector_.GetProfilerCallback(params).Run(std::move(profiles));
60 } 69 }
61 70
62 const std::vector<ChildCallStackProfileCollector::ProfilesState>& 71 const std::vector<ChildCallStackProfileCollector::ProfilesState>&
63 profiles() const { 72 profiles() const {
64 return child_collector_.profiles_; 73 return child_collector_.profiles_;
65 } 74 }
66 75
67 base::MessageLoop loop_; 76 base::MessageLoop loop_;
68 mojom::CallStackProfileCollectorPtr receiver_; 77 mojom::CallStackProfileCollectorPtr receiver_;
69 std::unique_ptr<Receiver> receiver_impl_; 78 std::unique_ptr<Receiver> receiver_impl_;
70 ChildCallStackProfileCollector child_collector_; 79 ChildCallStackProfileCollector child_collector_;
71 80
72 DISALLOW_COPY_AND_ASSIGN(ChildCallStackProfileCollectorTest); 81 DISALLOW_COPY_AND_ASSIGN(ChildCallStackProfileCollectorTest);
73 }; 82 };
74 83
75 // Test the behavior when an interface is provided. 84 // Test the behavior when an interface is provided.
76 TEST_F(ChildCallStackProfileCollectorTest, InterfaceProvided) { 85 TEST_F(ChildCallStackProfileCollectorTest, InterfaceProvided) {
77 EXPECT_EQ(0u, profiles().size()); 86 EXPECT_EQ(0u, profiles().size());
78 87
79 // Add profiles before providing the interface. 88 // Add profiles before providing the interface.
80 CollectProfiles( 89 CollectEmptyProfiles(
81 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, 90 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS,
82 CallStackProfileParams::UI_THREAD, 91 CallStackProfileParams::UI_THREAD,
83 CallStackProfileParams::JANKY_TASK, 92 CallStackProfileParams::JANKY_TASK,
84 CallStackProfileParams::PRESERVE_ORDER), 93 CallStackProfileParams::PRESERVE_ORDER),
85 { base::StackSamplingProfiler::CallStackProfile(), 94 2);
86 base::StackSamplingProfiler::CallStackProfile() });
87 ASSERT_EQ(1u, profiles().size()); 95 ASSERT_EQ(1u, profiles().size());
88 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS, 96 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS,
89 profiles()[0].params.process); 97 profiles()[0].params.process);
90 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread); 98 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread);
91 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger); 99 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger);
92 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 100 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
93 profiles()[0].params.ordering_spec); 101 profiles()[0].params.ordering_spec);
94 base::TimeTicks start_timestamp = profiles()[0].start_timestamp; 102 base::TimeTicks start_timestamp = profiles()[0].start_timestamp;
95 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 103 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
96 base::TimeTicks::Now() - start_timestamp); 104 base::TimeTicks::Now() - start_timestamp);
97 EXPECT_EQ(2u, profiles()[0].profiles.size()); 105 EXPECT_EQ(2u, profiles()[0].profiles.size());
98 106
99 // Set the interface. The profiles should be passed to it. 107 // Set the interface. The profiles should be passed to it.
100 child_collector_.SetParentProfileCollector(std::move(receiver_)); 108 child_collector_.SetParentProfileCollector(std::move(receiver_));
101 base::RunLoop().RunUntilIdle(); 109 base::RunLoop().RunUntilIdle();
102 EXPECT_EQ(0u, profiles().size()); 110 EXPECT_EQ(0u, profiles().size());
103 ASSERT_EQ(1u, receiver_impl_->profiles.size()); 111 ASSERT_EQ(1u, receiver_impl_->profiles.size());
104 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, 112 EXPECT_EQ(CallStackProfileParams::JANKY_TASK,
105 receiver_impl_->profiles[0].params.trigger); 113 receiver_impl_->profiles[0].params.trigger);
106 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 114 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
107 receiver_impl_->profiles[0].params.ordering_spec); 115 receiver_impl_->profiles[0].params.ordering_spec);
108 EXPECT_EQ(start_timestamp, receiver_impl_->profiles[0].start_timestamp); 116 EXPECT_EQ(start_timestamp, receiver_impl_->profiles[0].start_timestamp);
109 EXPECT_EQ(2u, receiver_impl_->profiles[0].profiles.size()); 117 EXPECT_EQ(2u, receiver_impl_->profiles[0].profiles.size());
110 118
111 // Add profiles after providing the interface. They should also be passed to 119 // Add profiles after providing the interface. They should also be passed to
112 // it. 120 // it.
113 receiver_impl_->profiles.clear(); 121 receiver_impl_->profiles.clear();
114 CollectProfiles( 122 CollectEmptyProfiles(
115 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS, 123 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS,
116 CallStackProfileParams::GPU_MAIN_THREAD, 124 CallStackProfileParams::GPU_MAIN_THREAD,
117 CallStackProfileParams::THREAD_HUNG, 125 CallStackProfileParams::THREAD_HUNG,
118 CallStackProfileParams::PRESERVE_ORDER), 126 CallStackProfileParams::PRESERVE_ORDER),
119 { base::StackSamplingProfiler::CallStackProfile() }); 127 1);
120 base::RunLoop().RunUntilIdle(); 128 base::RunLoop().RunUntilIdle();
121 EXPECT_EQ(0u, profiles().size()); 129 EXPECT_EQ(0u, profiles().size());
122 ASSERT_EQ(1u, receiver_impl_->profiles.size()); 130 ASSERT_EQ(1u, receiver_impl_->profiles.size());
123 EXPECT_EQ(CallStackProfileParams::GPU_PROCESS, 131 EXPECT_EQ(CallStackProfileParams::GPU_PROCESS,
124 receiver_impl_->profiles[0].params.process); 132 receiver_impl_->profiles[0].params.process);
125 EXPECT_EQ(CallStackProfileParams::GPU_MAIN_THREAD, 133 EXPECT_EQ(CallStackProfileParams::GPU_MAIN_THREAD,
126 receiver_impl_->profiles[0].params.thread); 134 receiver_impl_->profiles[0].params.thread);
127 EXPECT_EQ(CallStackProfileParams::THREAD_HUNG, 135 EXPECT_EQ(CallStackProfileParams::THREAD_HUNG,
128 receiver_impl_->profiles[0].params.trigger); 136 receiver_impl_->profiles[0].params.trigger);
129 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 137 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
130 receiver_impl_->profiles[0].params.ordering_spec); 138 receiver_impl_->profiles[0].params.ordering_spec);
131 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 139 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
132 (base::TimeTicks::Now() - 140 (base::TimeTicks::Now() -
133 receiver_impl_->profiles[0].start_timestamp)); 141 receiver_impl_->profiles[0].start_timestamp));
134 EXPECT_EQ(1u, receiver_impl_->profiles[0].profiles.size()); 142 EXPECT_EQ(1u, receiver_impl_->profiles[0].profiles.size());
135 } 143 }
136 144
137 TEST_F(ChildCallStackProfileCollectorTest, InterfaceNotProvided) { 145 TEST_F(ChildCallStackProfileCollectorTest, InterfaceNotProvided) {
138 EXPECT_EQ(0u, profiles().size()); 146 EXPECT_EQ(0u, profiles().size());
139 147
140 // Add profiles before providing a null interface. 148 // Add profiles before providing a null interface.
141 CollectProfiles( 149 CollectEmptyProfiles(
142 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, 150 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS,
143 CallStackProfileParams::UI_THREAD, 151 CallStackProfileParams::UI_THREAD,
144 CallStackProfileParams::JANKY_TASK, 152 CallStackProfileParams::JANKY_TASK,
145 CallStackProfileParams::PRESERVE_ORDER), 153 CallStackProfileParams::PRESERVE_ORDER),
146 { base::StackSamplingProfiler::CallStackProfile(), 154 2);
147 base::StackSamplingProfiler::CallStackProfile() });
148 ASSERT_EQ(1u, profiles().size()); 155 ASSERT_EQ(1u, profiles().size());
149 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS, 156 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS,
150 profiles()[0].params.process); 157 profiles()[0].params.process);
151 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread); 158 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread);
152 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger); 159 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger);
153 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 160 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
154 profiles()[0].params.ordering_spec); 161 profiles()[0].params.ordering_spec);
155 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 162 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
156 base::TimeTicks::Now() - profiles()[0].start_timestamp); 163 base::TimeTicks::Now() - profiles()[0].start_timestamp);
157 EXPECT_EQ(2u, profiles()[0].profiles.size()); 164 EXPECT_EQ(2u, profiles()[0].profiles.size());
158 165
159 // Set the null interface. The profiles should be flushed. 166 // Set the null interface. The profiles should be flushed.
160 child_collector_.SetParentProfileCollector( 167 child_collector_.SetParentProfileCollector(
161 mojom::CallStackProfileCollectorPtr()); 168 mojom::CallStackProfileCollectorPtr());
162 base::RunLoop().RunUntilIdle(); 169 base::RunLoop().RunUntilIdle();
163 EXPECT_EQ(0u, profiles().size()); 170 EXPECT_EQ(0u, profiles().size());
164 171
165 // Add profiles after providing a null interface. They should also be flushed. 172 // Add profiles after providing a null interface. They should also be flushed.
166 CollectProfiles( 173 CollectEmptyProfiles(
167 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS, 174 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS,
168 CallStackProfileParams::GPU_MAIN_THREAD, 175 CallStackProfileParams::GPU_MAIN_THREAD,
169 CallStackProfileParams::THREAD_HUNG, 176 CallStackProfileParams::THREAD_HUNG,
170 CallStackProfileParams::PRESERVE_ORDER), 177 CallStackProfileParams::PRESERVE_ORDER),
171 { base::StackSamplingProfiler::CallStackProfile() }); 178 1);
172 EXPECT_EQ(0u, profiles().size()); 179 EXPECT_EQ(0u, profiles().size());
173 } 180 }
174 181
175 } // namespace metrics 182 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698