blob: 4820a5411af18afaf9f224662568eafed18c1abc [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <fuchsia/modular/cpp/fidl.h>
#include <lib/app_driver/cpp/app_driver.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/component/cpp/startup_context.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fit/function.h>
#include "peridot/bin/context_engine/context_engine_impl.h"
namespace modular {
class ContextEngineApp {
public:
ContextEngineApp(component::StartupContext* const context) {
auto component_context =
context
->ConnectToEnvironmentService<fuchsia::modular::ComponentContext>();
component_context->GetEntityResolver(entity_resolver_.NewRequest());
context_engine_impl_ =
std::make_unique<ContextEngineImpl>(entity_resolver_.get());
context->outgoing().AddPublicService<fuchsia::modular::ContextEngine>(
[this](
fidl::InterfaceRequest<fuchsia::modular::ContextEngine> request) {
context_engine_impl_->AddBinding(std::move(request));
});
}
void Terminate(fit::function<void()> done) { done(); }
fxl::WeakPtr<ContextDebugImpl> debug() {
return context_engine_impl_->debug();
}
private:
fuchsia::modular::EntityResolverPtr entity_resolver_;
std::unique_ptr<ContextEngineImpl> context_engine_impl_;
FXL_DISALLOW_COPY_AND_ASSIGN(ContextEngineApp);
};
} // namespace modular
int main(int argc, const char** argv) {
async::Loop loop(&kAsyncLoopConfigAttachToThread);
auto context = component::StartupContext::CreateFromStartupInfo();
auto context_engine_app =
std::make_unique<modular::ContextEngineApp>(context.get());
fxl::WeakPtr<modular::ContextDebugImpl> debug = context_engine_app->debug();
debug->GetIdleWaiter()->SetLoop(&loop);
modular::AppDriver<modular::ContextEngineApp> driver(
context->outgoing().deprecated_services(), std::move(context_engine_app),
[&loop] { loop.Quit(); });
// The |WaitUntilIdle| debug functionality escapes the main message loop to
// perform its test.
do {
loop.Run();
loop.ResetQuit();
} while (debug && debug->GetIdleWaiter()->FinishIdleCheck());
return 0;
}