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

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: added some comments about std::move Created 4 years, 1 month 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 <utility>
8 #include <vector> 9 #include <vector>
9 10
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h" 13 #include "base/run_loop.h"
13 #include "components/metrics/call_stack_profile_params.h" 14 #include "components/metrics/call_stack_profile_params.h"
14 #include "mojo/public/cpp/bindings/binding.h" 15 #include "mojo/public/cpp/bindings/binding.h"
15 #include "mojo/public/cpp/bindings/interface_request.h" 16 #include "mojo/public/cpp/bindings/interface_request.h"
16 #include "services/shell/public/cpp/interface_provider.h" 17 #include "services/shell/public/cpp/interface_provider.h"
17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 10 matching lines...) Expand all
28 class Receiver : public mojom::CallStackProfileCollector { 29 class Receiver : public mojom::CallStackProfileCollector {
29 public: 30 public:
30 using CallStackProfile = base::StackSamplingProfiler::CallStackProfile; 31 using CallStackProfile = base::StackSamplingProfiler::CallStackProfile;
31 32
32 Receiver(mojom::CallStackProfileCollectorRequest request) 33 Receiver(mojom::CallStackProfileCollectorRequest request)
33 : binding_(this, std::move(request)) {} 34 : binding_(this, std::move(request)) {}
34 ~Receiver() override {} 35 ~Receiver() override {}
35 36
36 void Collect(const CallStackProfileParams& params, 37 void Collect(const CallStackProfileParams& params,
37 base::TimeTicks start_timestamp, 38 base::TimeTicks start_timestamp,
38 const std::vector<CallStackProfile>& profiles) override { 39 std::vector<CallStackProfile> profiles) override {
39 this->profiles.push_back(ChildCallStackProfileCollector::ProfilesState( 40 this->profiles.push_back(ChildCallStackProfileCollector::ProfilesState(
40 params, 41 params,
41 start_timestamp, 42 start_timestamp,
42 profiles)); 43 std::move(profiles)));
43 } 44 }
44 45
45 std::vector<ChildCallStackProfileCollector::ProfilesState> profiles; 46 std::vector<ChildCallStackProfileCollector::ProfilesState> profiles;
46 47
47 private: 48 private:
48 mojo::Binding<mojom::CallStackProfileCollector> binding_; 49 mojo::Binding<mojom::CallStackProfileCollector> binding_;
49 50
50 DISALLOW_COPY_AND_ASSIGN(Receiver); 51 DISALLOW_COPY_AND_ASSIGN(Receiver);
51 }; 52 };
52 53
53 ChildCallStackProfileCollectorTest() 54 ChildCallStackProfileCollectorTest()
54 : receiver_impl_(new Receiver(GetProxy(&receiver_))) {} 55 : receiver_impl_(new Receiver(GetProxy(&receiver_))) {}
55 56
56 void CollectProfiles( 57 void CollectEmptyProfiles(
57 const CallStackProfileParams& params, 58 const CallStackProfileParams& params,
58 const base::StackSamplingProfiler::CallStackProfiles& profiles) { 59 size_t profile_count) {
59 child_collector_.GetProfilerCallback(params).Run(profiles); 60 base::StackSamplingProfiler::CallStackProfiles profiles;
61 for (size_t i = 0; i < profile_count; ++i)
62 profiles.push_back(base::StackSamplingProfiler::CallStackProfile());
63 child_collector_.GetProfilerCallback(params).Run(std::move(profiles));
60 } 64 }
61 65
62 const std::vector<ChildCallStackProfileCollector::ProfilesState>& 66 const std::vector<ChildCallStackProfileCollector::ProfilesState>&
63 profiles() const { 67 profiles() const {
64 return child_collector_.profiles_; 68 return child_collector_.profiles_;
65 } 69 }
66 70
67 base::MessageLoop loop_; 71 base::MessageLoop loop_;
68 mojom::CallStackProfileCollectorPtr receiver_; 72 mojom::CallStackProfileCollectorPtr receiver_;
69 std::unique_ptr<Receiver> receiver_impl_; 73 std::unique_ptr<Receiver> receiver_impl_;
70 ChildCallStackProfileCollector child_collector_; 74 ChildCallStackProfileCollector child_collector_;
71 75
72 DISALLOW_COPY_AND_ASSIGN(ChildCallStackProfileCollectorTest); 76 DISALLOW_COPY_AND_ASSIGN(ChildCallStackProfileCollectorTest);
73 }; 77 };
74 78
75 // Test the behavior when an interface is provided. 79 // Test the behavior when an interface is provided.
76 TEST_F(ChildCallStackProfileCollectorTest, InterfaceProvided) { 80 TEST_F(ChildCallStackProfileCollectorTest, InterfaceProvided) {
77 EXPECT_EQ(0u, profiles().size()); 81 EXPECT_EQ(0u, profiles().size());
78 82
79 // Add profiles before providing the interface. 83 // Add profiles before providing the interface.
80 CollectProfiles( 84 CollectEmptyProfiles(
81 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, 85 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS,
82 CallStackProfileParams::UI_THREAD, 86 CallStackProfileParams::UI_THREAD,
83 CallStackProfileParams::JANKY_TASK, 87 CallStackProfileParams::JANKY_TASK,
84 CallStackProfileParams::PRESERVE_ORDER), 88 CallStackProfileParams::PRESERVE_ORDER),
85 { base::StackSamplingProfiler::CallStackProfile(), 89 2);
86 base::StackSamplingProfiler::CallStackProfile() });
87 ASSERT_EQ(1u, profiles().size()); 90 ASSERT_EQ(1u, profiles().size());
88 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS, 91 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS,
89 profiles()[0].params.process); 92 profiles()[0].params.process);
90 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread); 93 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread);
91 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger); 94 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger);
92 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 95 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
93 profiles()[0].params.ordering_spec); 96 profiles()[0].params.ordering_spec);
94 base::TimeTicks start_timestamp = profiles()[0].start_timestamp; 97 base::TimeTicks start_timestamp = profiles()[0].start_timestamp;
95 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 98 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
96 base::TimeTicks::Now() - start_timestamp); 99 base::TimeTicks::Now() - start_timestamp);
97 EXPECT_EQ(2u, profiles()[0].profiles.size()); 100 EXPECT_EQ(2u, profiles()[0].profiles.size());
98 101
99 // Set the interface. The profiles should be passed to it. 102 // Set the interface. The profiles should be passed to it.
100 child_collector_.SetParentProfileCollector(std::move(receiver_)); 103 child_collector_.SetParentProfileCollector(std::move(receiver_));
101 base::RunLoop().RunUntilIdle(); 104 base::RunLoop().RunUntilIdle();
102 EXPECT_EQ(0u, profiles().size()); 105 EXPECT_EQ(0u, profiles().size());
103 ASSERT_EQ(1u, receiver_impl_->profiles.size()); 106 ASSERT_EQ(1u, receiver_impl_->profiles.size());
104 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, 107 EXPECT_EQ(CallStackProfileParams::JANKY_TASK,
105 receiver_impl_->profiles[0].params.trigger); 108 receiver_impl_->profiles[0].params.trigger);
106 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 109 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
107 receiver_impl_->profiles[0].params.ordering_spec); 110 receiver_impl_->profiles[0].params.ordering_spec);
108 EXPECT_EQ(start_timestamp, receiver_impl_->profiles[0].start_timestamp); 111 EXPECT_EQ(start_timestamp, receiver_impl_->profiles[0].start_timestamp);
109 EXPECT_EQ(2u, receiver_impl_->profiles[0].profiles.size()); 112 EXPECT_EQ(2u, receiver_impl_->profiles[0].profiles.size());
110 113
111 // Add profiles after providing the interface. They should also be passed to 114 // Add profiles after providing the interface. They should also be passed to
112 // it. 115 // it.
113 receiver_impl_->profiles.clear(); 116 receiver_impl_->profiles.clear();
114 CollectProfiles( 117 CollectEmptyProfiles(
115 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS, 118 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS,
116 CallStackProfileParams::GPU_MAIN_THREAD, 119 CallStackProfileParams::GPU_MAIN_THREAD,
117 CallStackProfileParams::THREAD_HUNG, 120 CallStackProfileParams::THREAD_HUNG,
118 CallStackProfileParams::PRESERVE_ORDER), 121 CallStackProfileParams::PRESERVE_ORDER),
119 { base::StackSamplingProfiler::CallStackProfile() }); 122 1);
120 base::RunLoop().RunUntilIdle(); 123 base::RunLoop().RunUntilIdle();
121 EXPECT_EQ(0u, profiles().size()); 124 EXPECT_EQ(0u, profiles().size());
122 ASSERT_EQ(1u, receiver_impl_->profiles.size()); 125 ASSERT_EQ(1u, receiver_impl_->profiles.size());
123 EXPECT_EQ(CallStackProfileParams::GPU_PROCESS, 126 EXPECT_EQ(CallStackProfileParams::GPU_PROCESS,
124 receiver_impl_->profiles[0].params.process); 127 receiver_impl_->profiles[0].params.process);
125 EXPECT_EQ(CallStackProfileParams::GPU_MAIN_THREAD, 128 EXPECT_EQ(CallStackProfileParams::GPU_MAIN_THREAD,
126 receiver_impl_->profiles[0].params.thread); 129 receiver_impl_->profiles[0].params.thread);
127 EXPECT_EQ(CallStackProfileParams::THREAD_HUNG, 130 EXPECT_EQ(CallStackProfileParams::THREAD_HUNG,
128 receiver_impl_->profiles[0].params.trigger); 131 receiver_impl_->profiles[0].params.trigger);
129 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 132 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
130 receiver_impl_->profiles[0].params.ordering_spec); 133 receiver_impl_->profiles[0].params.ordering_spec);
131 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 134 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
132 (base::TimeTicks::Now() - 135 (base::TimeTicks::Now() -
133 receiver_impl_->profiles[0].start_timestamp)); 136 receiver_impl_->profiles[0].start_timestamp));
134 EXPECT_EQ(1u, receiver_impl_->profiles[0].profiles.size()); 137 EXPECT_EQ(1u, receiver_impl_->profiles[0].profiles.size());
135 } 138 }
136 139
137 TEST_F(ChildCallStackProfileCollectorTest, InterfaceNotProvided) { 140 TEST_F(ChildCallStackProfileCollectorTest, InterfaceNotProvided) {
138 EXPECT_EQ(0u, profiles().size()); 141 EXPECT_EQ(0u, profiles().size());
139 142
140 // Add profiles before providing a null interface. 143 // Add profiles before providing a null interface.
141 CollectProfiles( 144 CollectEmptyProfiles(
142 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, 145 CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS,
143 CallStackProfileParams::UI_THREAD, 146 CallStackProfileParams::UI_THREAD,
144 CallStackProfileParams::JANKY_TASK, 147 CallStackProfileParams::JANKY_TASK,
145 CallStackProfileParams::PRESERVE_ORDER), 148 CallStackProfileParams::PRESERVE_ORDER),
146 { base::StackSamplingProfiler::CallStackProfile(), 149 2);
147 base::StackSamplingProfiler::CallStackProfile() });
148 ASSERT_EQ(1u, profiles().size()); 150 ASSERT_EQ(1u, profiles().size());
149 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS, 151 EXPECT_EQ(CallStackProfileParams::BROWSER_PROCESS,
150 profiles()[0].params.process); 152 profiles()[0].params.process);
151 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread); 153 EXPECT_EQ(CallStackProfileParams::UI_THREAD, profiles()[0].params.thread);
152 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger); 154 EXPECT_EQ(CallStackProfileParams::JANKY_TASK, profiles()[0].params.trigger);
153 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER, 155 EXPECT_EQ(CallStackProfileParams::PRESERVE_ORDER,
154 profiles()[0].params.ordering_spec); 156 profiles()[0].params.ordering_spec);
155 EXPECT_GE(base::TimeDelta::FromMilliseconds(10), 157 EXPECT_GE(base::TimeDelta::FromMilliseconds(10),
156 base::TimeTicks::Now() - profiles()[0].start_timestamp); 158 base::TimeTicks::Now() - profiles()[0].start_timestamp);
157 EXPECT_EQ(2u, profiles()[0].profiles.size()); 159 EXPECT_EQ(2u, profiles()[0].profiles.size());
158 160
159 // Set the null interface. The profiles should be flushed. 161 // Set the null interface. The profiles should be flushed.
160 child_collector_.SetParentProfileCollector( 162 child_collector_.SetParentProfileCollector(
161 mojom::CallStackProfileCollectorPtr()); 163 mojom::CallStackProfileCollectorPtr());
162 base::RunLoop().RunUntilIdle(); 164 base::RunLoop().RunUntilIdle();
163 EXPECT_EQ(0u, profiles().size()); 165 EXPECT_EQ(0u, profiles().size());
164 166
165 // Add profiles after providing a null interface. They should also be flushed. 167 // Add profiles after providing a null interface. They should also be flushed.
166 CollectProfiles( 168 CollectEmptyProfiles(
167 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS, 169 CallStackProfileParams(CallStackProfileParams::GPU_PROCESS,
168 CallStackProfileParams::GPU_MAIN_THREAD, 170 CallStackProfileParams::GPU_MAIN_THREAD,
169 CallStackProfileParams::THREAD_HUNG, 171 CallStackProfileParams::THREAD_HUNG,
170 CallStackProfileParams::PRESERVE_ORDER), 172 CallStackProfileParams::PRESERVE_ORDER),
171 { base::StackSamplingProfiler::CallStackProfile() }); 173 1);
172 EXPECT_EQ(0u, profiles().size()); 174 EXPECT_EQ(0u, profiles().size());
173 } 175 }
174 176
175 } // namespace metrics 177 } // namespace metrics
OLDNEW
« no previous file with comments | « components/metrics/child_call_stack_profile_collector.cc ('k') | components/metrics/public/cpp/call_stack_profile.typemap » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698