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

Side by Side Diff: services/service_manager/tests/connect/connect_test_package.cc

Issue 2486073003: Revert of Service Manager: Implement graceful service termination (Closed)
Patch Set: 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 12 matching lines...) Expand all
23 #include "services/service_manager/public/cpp/service_runner.h" 23 #include "services/service_manager/public/cpp/service_runner.h"
24 #include "services/service_manager/public/interfaces/service_factory.mojom.h" 24 #include "services/service_manager/public/interfaces/service_factory.mojom.h"
25 #include "services/service_manager/tests/connect/connect_test.mojom.h" 25 #include "services/service_manager/tests/connect/connect_test.mojom.h"
26 26
27 // Tests that multiple services can be packaged in a single service by 27 // Tests that multiple services can be packaged in a single service by
28 // implementing ServiceFactory; that these services can be specified by 28 // implementing ServiceFactory; that these services can be specified by
29 // the package's manifest and are thus registered with the PackageManager. 29 // the package's manifest and are thus registered with the PackageManager.
30 30
31 namespace service_manager { 31 namespace service_manager {
32 32
33 namespace {
34
35 void QuitLoop(base::RunLoop* loop) {
36 loop->Quit();
37 }
38
39 } // namespace
40
33 using GetTitleCallback = test::mojom::ConnectTestService::GetTitleCallback; 41 using GetTitleCallback = test::mojom::ConnectTestService::GetTitleCallback;
34 42
35 class ProvidedService 43 class ProvidedService
36 : public Service, 44 : public Service,
37 public InterfaceFactory<test::mojom::ConnectTestService>, 45 public InterfaceFactory<test::mojom::ConnectTestService>,
38 public InterfaceFactory<test::mojom::BlockedInterface>, 46 public InterfaceFactory<test::mojom::BlockedInterface>,
39 public InterfaceFactory<test::mojom::UserIdTest>, 47 public InterfaceFactory<test::mojom::UserIdTest>,
40 public test::mojom::ConnectTestService, 48 public test::mojom::ConnectTestService,
41 public test::mojom::BlockedInterface, 49 public test::mojom::BlockedInterface,
42 public test::mojom::UserIdTest, 50 public test::mojom::UserIdTest,
43 public base::SimpleThread { 51 public base::SimpleThread {
44 public: 52 public:
45 ProvidedService(const std::string& title, mojom::ServiceRequest request) 53 ProvidedService(const std::string& title, mojom::ServiceRequest request)
46 : base::SimpleThread(title), 54 : base::SimpleThread(title),
47 title_(title), 55 title_(title),
48 request_(std::move(request)) { 56 request_(std::move(request)) {
49 Start(); 57 Start();
50 } 58 }
51
52 ~ProvidedService() override { 59 ~ProvidedService() override {
53 Join(); 60 Join();
54 } 61 }
55 62
56 private: 63 private:
57 class ForwardingServiceImpl : public Service {
58 public:
59 explicit ForwardingServiceImpl(Service* service)
60 : service_(service) {}
61 ~ForwardingServiceImpl() override {}
62
63 // Service:
64 void OnStart(ServiceContext* context) override {
65 service_->OnStart(context);
66 }
67
68 bool OnConnect(const ServiceInfo& remote_info,
69 InterfaceRegistry* registry) override {
70 return service_->OnConnect(remote_info, registry);
71 }
72
73 bool OnStop() override { return service_->OnStop(); }
74
75 private:
76 Service* const service_;
77
78 DISALLOW_COPY_AND_ASSIGN(ForwardingServiceImpl);
79 };
80
81 // service_manager::Service: 64 // service_manager::Service:
82 void OnStart(ServiceContext* context) override { 65 void OnStart(ServiceContext* context) override {
83 context_ = context; 66 context_ = context;
84 bindings_.set_connection_error_handler( 67 bindings_.set_connection_error_handler(
85 base::Bind(&ProvidedService::OnConnectionError, 68 base::Bind(&ProvidedService::OnConnectionError,
86 base::Unretained(this))); 69 base::Unretained(this)));
87 } 70 }
88 71
89 bool OnConnect(const ServiceInfo& remote_info, 72 bool OnConnect(const ServiceInfo& remote_info,
90 InterfaceRegistry* registry) override { 73 InterfaceRegistry* registry) override {
(...skipping 28 matching lines...) Expand all
119 // InterfaceFactory<test::mojom::UserIdTest>: 102 // InterfaceFactory<test::mojom::UserIdTest>:
120 void Create(const Identity& remote_identity, 103 void Create(const Identity& remote_identity,
121 test::mojom::UserIdTestRequest request) override { 104 test::mojom::UserIdTestRequest request) override {
122 user_id_test_bindings_.AddBinding(this, std::move(request)); 105 user_id_test_bindings_.AddBinding(this, std::move(request));
123 } 106 }
124 107
125 // test::mojom::ConnectTestService: 108 // test::mojom::ConnectTestService:
126 void GetTitle(const GetTitleCallback& callback) override { 109 void GetTitle(const GetTitleCallback& callback) override {
127 callback.Run(title_); 110 callback.Run(title_);
128 } 111 }
129
130 void GetInstance(const GetInstanceCallback& callback) override { 112 void GetInstance(const GetInstanceCallback& callback) override {
131 callback.Run(context_->identity().instance()); 113 callback.Run(context_->identity().instance());
132 } 114 }
133 115
134 // test::mojom::BlockedInterface: 116 // test::mojom::BlockedInterface:
135 void GetTitleBlocked(const GetTitleBlockedCallback& callback) override { 117 void GetTitleBlocked(const GetTitleBlockedCallback& callback) override {
136 callback.Run("Called Blocked Interface!"); 118 callback.Run("Called Blocked Interface!");
137 } 119 }
138 120
139 // test::mojom::UserIdTest: 121 // test::mojom::UserIdTest:
140 void ConnectToClassAppAsDifferentUser( 122 void ConnectToClassAppAsDifferentUser(
141 const service_manager::Identity& target, 123 const service_manager::Identity& target,
142 const ConnectToClassAppAsDifferentUserCallback& callback) override { 124 const ConnectToClassAppAsDifferentUserCallback& callback) override {
143 Connector::ConnectParams params(target); 125 Connector::ConnectParams params(target);
144 std::unique_ptr<Connection> connection = 126 std::unique_ptr<Connection> connection =
145 context_->connector()->Connect(&params); 127 context_->connector()->Connect(&params);
146 { 128 {
147 base::RunLoop loop; 129 base::RunLoop loop;
148 connection->AddConnectionCompletedClosure(loop.QuitClosure()); 130 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop));
149 base::MessageLoop::ScopedNestableTaskAllower allow( 131 base::MessageLoop::ScopedNestableTaskAllower allow(
150 base::MessageLoop::current()); 132 base::MessageLoop::current());
151 loop.Run(); 133 loop.Run();
152 } 134 }
153 callback.Run(static_cast<int32_t>(connection->GetResult()), 135 callback.Run(static_cast<int32_t>(connection->GetResult()),
154 connection->GetRemoteIdentity()); 136 connection->GetRemoteIdentity());
155 } 137 }
156 138
157 // base::SimpleThread: 139 // base::SimpleThread:
158 void Run() override { 140 void Run() override {
159 ServiceRunner(new ForwardingServiceImpl(this)).Run( 141 ServiceRunner(this).Run(request_.PassMessagePipe().release().value(),
160 request_.PassMessagePipe().release().value(), false); 142 false);
161 caller_.reset(); 143 delete this;
162 bindings_.CloseAllBindings();
163 blocked_bindings_.CloseAllBindings();
164 user_id_test_bindings_.CloseAllBindings();
165 } 144 }
166 145
167 void OnConnectionError() { 146 void OnConnectionError() {
168 if (bindings_.empty()) 147 if (bindings_.empty())
169 base::MessageLoop::current()->QuitWhenIdle(); 148 base::MessageLoop::current()->QuitWhenIdle();
170 } 149 }
171 150
172 ServiceContext* context_ = nullptr; 151 ServiceContext* context_ = nullptr;
173 const std::string title_; 152 const std::string title_;
174 mojom::ServiceRequest request_; 153 mojom::ServiceRequest request_;
(...skipping 11 matching lines...) Expand all
186 public InterfaceFactory<test::mojom::ConnectTestService>, 165 public InterfaceFactory<test::mojom::ConnectTestService>,
187 public mojom::ServiceFactory, 166 public mojom::ServiceFactory,
188 public test::mojom::ConnectTestService { 167 public test::mojom::ConnectTestService {
189 public: 168 public:
190 ConnectTestService() {} 169 ConnectTestService() {}
191 ~ConnectTestService() override {} 170 ~ConnectTestService() override {}
192 171
193 private: 172 private:
194 // service_manager::Service: 173 // service_manager::Service:
195 void OnStart(ServiceContext* context) override { 174 void OnStart(ServiceContext* context) override {
196 context_ = context; 175 identity_ = context->identity();
197 176 bindings_.set_connection_error_handler(
198 base::Closure error_handler =
199 base::Bind(&ConnectTestService::OnConnectionError, 177 base::Bind(&ConnectTestService::OnConnectionError,
200 base::Unretained(this)); 178 base::Unretained(this)));
201 bindings_.set_connection_error_handler(error_handler);
202 service_factory_bindings_.set_connection_error_handler(error_handler);
203 } 179 }
204
205 bool OnConnect(const ServiceInfo& remote_info, 180 bool OnConnect(const ServiceInfo& remote_info,
206 InterfaceRegistry* registry) override { 181 InterfaceRegistry* registry) override {
207 registry->AddInterface<ServiceFactory>(this); 182 registry->AddInterface<ServiceFactory>(this);
208 registry->AddInterface<test::mojom::ConnectTestService>(this); 183 registry->AddInterface<test::mojom::ConnectTestService>(this);
209 return true; 184 return true;
210 } 185 }
211 186
212 bool OnStop() override {
213 provided_services_.clear();
214 return true;
215 }
216
217 // InterfaceFactory<mojom::ServiceFactory>: 187 // InterfaceFactory<mojom::ServiceFactory>:
218 void Create(const Identity& remote_identity, 188 void Create(const Identity& remote_identity,
219 mojom::ServiceFactoryRequest request) override { 189 mojom::ServiceFactoryRequest request) override {
220 service_factory_bindings_.AddBinding(this, std::move(request)); 190 service_factory_bindings_.AddBinding(this, std::move(request));
221 } 191 }
222 192
223 // InterfaceFactory<test::mojom::ConnectTestService>: 193 // InterfaceFactory<test::mojom::ConnectTestService>:
224 void Create(const Identity& remote_identity, 194 void Create(const Identity& remote_identity,
225 test::mojom::ConnectTestServiceRequest request) override { 195 test::mojom::ConnectTestServiceRequest request) override {
226 bindings_.AddBinding(this, std::move(request)); 196 bindings_.AddBinding(this, std::move(request));
227 } 197 }
228 198
229 // mojom::ServiceFactory: 199 // mojom::ServiceFactory:
230 void CreateService(mojom::ServiceRequest request, 200 void CreateService(mojom::ServiceRequest request,
231 const std::string& name) override { 201 const std::string& name) override {
232 if (name == "service:connect_test_a") { 202 if (name == "service:connect_test_a")
233 provided_services_.emplace_back( 203 new ProvidedService("A", std::move(request));
234 base::MakeUnique<ProvidedService>("A", std::move(request))); 204 else if (name == "service:connect_test_b")
235 } else if (name == "service:connect_test_b") { 205 new ProvidedService("B", std::move(request));
236 provided_services_.emplace_back(
237 base::MakeUnique<ProvidedService>("B", std::move(request)));
238 }
239 } 206 }
240 207
241 // test::mojom::ConnectTestService: 208 // test::mojom::ConnectTestService:
242 void GetTitle(const GetTitleCallback& callback) override { 209 void GetTitle(const GetTitleCallback& callback) override {
243 callback.Run("ROOT"); 210 callback.Run("ROOT");
244 } 211 }
245
246 void GetInstance(const GetInstanceCallback& callback) override { 212 void GetInstance(const GetInstanceCallback& callback) override {
247 callback.Run(context_->identity().instance()); 213 callback.Run(identity_.instance());
248 } 214 }
249 215
250 void OnConnectionError() { 216 void OnConnectionError() {
251 if (bindings_.empty() && service_factory_bindings_.empty()) 217 if (bindings_.empty())
252 context_->RequestQuit(); 218 base::MessageLoop::current()->QuitWhenIdle();
253 } 219 }
254 220
255 ServiceContext* context_ = nullptr; 221 Identity identity_;
256 std::vector<std::unique_ptr<Service>> delegates_; 222 std::vector<std::unique_ptr<Service>> delegates_;
257 mojo::BindingSet<mojom::ServiceFactory> service_factory_bindings_; 223 mojo::BindingSet<mojom::ServiceFactory> service_factory_bindings_;
258 mojo::BindingSet<test::mojom::ConnectTestService> bindings_; 224 mojo::BindingSet<test::mojom::ConnectTestService> bindings_;
259 std::list<std::unique_ptr<ProvidedService>> provided_services_;
260 225
261 DISALLOW_COPY_AND_ASSIGN(ConnectTestService); 226 DISALLOW_COPY_AND_ASSIGN(ConnectTestService);
262 }; 227 };
263 228
264 } // namespace service_manager 229 } // namespace service_manager
265 230
266 MojoResult ServiceMain(MojoHandle service_request_handle) { 231 MojoResult ServiceMain(MojoHandle service_request_handle) {
267 service_manager::ServiceRunner runner( 232 service_manager::ServiceRunner runner(
268 new service_manager::ConnectTestService); 233 new service_manager::ConnectTestService);
269 return runner.Run(service_request_handle); 234 return runner.Run(service_request_handle);
270 } 235 }
OLDNEW
« no previous file with comments | « services/service_manager/service_manager.cc ('k') | services/service_manager/tests/lifecycle/app_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698