|  | // 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. | 
|  |  | 
|  | #ifndef SRC_COBALT_BIN_APP_COBALT_APP_H_ | 
|  | #define SRC_COBALT_BIN_APP_COBALT_APP_H_ | 
|  |  | 
|  | #include <fuchsia/cobalt/cpp/fidl.h> | 
|  | #include <fuchsia/metrics/cpp/fidl.h> | 
|  | #include <fuchsia/process/lifecycle/cpp/fidl.h> | 
|  | #include <lib/async-loop/cpp/loop.h> | 
|  | #include <lib/async/cpp/task.h> | 
|  | #include <lib/fidl/cpp/binding_set.h> | 
|  | #include <lib/fidl/cpp/interface_request.h> | 
|  | #include <lib/inspect/cpp/inspect.h> | 
|  | #include <lib/sys/cpp/component_context.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "src/cobalt/bin/app/aggregate_and_upload_impl.h" | 
|  | #include "src/cobalt/bin/app/cobalt_controller_impl.h" | 
|  | #include "src/cobalt/bin/app/configuration_data.h" | 
|  | #include "src/cobalt/bin/app/current_channel_provider.h" | 
|  | #include "src/cobalt/bin/app/diagnostics_impl.h" | 
|  | #include "src/cobalt/bin/app/process_lifecycle_impl.h" | 
|  | #include "src/cobalt/bin/app/user_consent_watcher.h" | 
|  | #include "src/cobalt/bin/utils/clock.h" | 
|  | #include "src/cobalt/bin/utils/fuchsia_http_client.h" | 
|  | #include "src/public/lib/statusor/statusor.h" | 
|  | #include "third_party/cobalt/src/public/cobalt_config.h" | 
|  | #include "third_party/cobalt/src/public/cobalt_service_interface.h" | 
|  |  | 
|  | namespace cobalt { | 
|  |  | 
|  | // Main app, which manages all of Cobalt's functionality. | 
|  | // | 
|  | // To test run: | 
|  | //    fx set --with-base //bundles/tools,//src/cobalt/bin:cobalt_tests; | 
|  | //    fx test cobalt_testapp_no_network | 
|  | class CobaltApp { | 
|  | public: | 
|  | // |dispatcher| The async_t to be used for all asynchronous operations. | 
|  | // | 
|  | // |lifecycle_handle| A zx::channel to this process's Lifecycle endpoint. May be invalid. | 
|  | // | 
|  | // |shutdown| Callback to shut down the async::Loop. Called by ProcessLifecycleImpl. | 
|  | // | 
|  | // |upload_schedule_cfg| Defines when the shipping_manager should upload | 
|  | //                       observations. | 
|  | // | 
|  | // |event_aggregator_backfill_days| The number of past days, in addition to the previous day, | 
|  | //                                  for which local aggregation generates observations. If  a | 
|  | //                                  device is unable to generate observations for more than this | 
|  | //                                  number of days, we may lose older aggregated data. | 
|  | // | 
|  | // |start_event_aggregator_worker| If true, starts the EventAggregatorManager's worker thread | 
|  | //                                 after constructing the EventAggregatorManager. | 
|  | // | 
|  | // |test_dont_backfill_empty_reports| If true, reports that have never had any events will be | 
|  | //                                    skipped in the observation generation backfill. Only enable | 
|  | //                                    this in tests. | 
|  | // | 
|  | // |use_memory_observation_store| If this is true, the observation stores will be in-memory | 
|  | //                                only, otherwise they will be file-system backed. | 
|  | // | 
|  | // |max_bytes_per_observation_store| The maximum number of bytes to store for each of the | 
|  | //                                   observation_stores. | 
|  | // | 
|  | // |storage_quotas| The storage quotas used by Cobalt's local aggregation. | 
|  | // | 
|  | // |product_name| A product name included in the SystemProfile that is implicitly part of every | 
|  | //                Cobalt metric. | 
|  | // | 
|  | //                Example: products/core.gni | 
|  | // | 
|  | // |board_name| A board name that may be included in the SystemProfile that is implicitly part | 
|  | //              of every Cobalt metric. | 
|  | // | 
|  | //              Examples: astro, vim2, qemu | 
|  | // | 
|  | // |version| The version of the running system included in the SystemProfile that is implicitly | 
|  | //           part of every Cobalt metric. | 
|  | // | 
|  | //           Example: 20190220_01_RC00 | 
|  | static lib::statusor::StatusOr<std::unique_ptr<CobaltApp>> CreateCobaltApp( | 
|  | std::unique_ptr<sys::ComponentContext> context, async_dispatcher_t* dispatcher, | 
|  | fidl::InterfaceRequest<fuchsia::process::lifecycle::Lifecycle> lifecycle_handle, | 
|  | fit::callback<void()> shutdown, inspect::Node inspect_node, | 
|  | UploadScheduleConfig upload_schedule_cfg, size_t event_aggregator_backfill_days, | 
|  | bool start_event_aggregator_worker, bool test_dont_backfill_empty_reports, | 
|  | bool use_memory_observation_store, size_t max_bytes_per_observation_store, | 
|  | StorageQuotas storage_quotas, const std::string& product_name, const std::string& board_name, | 
|  | const std::string& version); | 
|  |  | 
|  | private: | 
|  | friend class CobaltAppTest; | 
|  | friend class CreateCobaltConfigTest; | 
|  |  | 
|  | static CobaltConfig CreateCobaltConfig( | 
|  | async_dispatcher_t* dispatcher, const std::string& global_metrics_registry_path, | 
|  | const FuchsiaConfigurationData& configuration_data, FuchsiaSystemClockInterface* system_clock, | 
|  | utils::FuchsiaHTTPClient::LoaderFactory http_loader_factory, | 
|  | UploadScheduleConfig upload_schedule_cfg, size_t event_aggregator_backfill_days, | 
|  | bool test_dont_backfill_empty_reports, bool use_memory_observation_store, | 
|  | size_t max_bytes_per_observation_store, StorageQuotas storage_quotas, | 
|  | const std::string& product_name, const std::string& board_name, const std::string& version, | 
|  | std::unique_ptr<DiagnosticsImpl> diagnostics); | 
|  |  | 
|  | CobaltApp(std::unique_ptr<sys::ComponentContext> context, async_dispatcher_t* dispatcher, | 
|  | fidl::InterfaceRequest<fuchsia::process::lifecycle::Lifecycle> lifecycle_handle, | 
|  | fit::callback<void()> shutdown, inspect::Node inspect_node, | 
|  | inspect::Node inspect_config_node, | 
|  | std::unique_ptr<CobaltServiceInterface> cobalt_service, | 
|  | std::unique_ptr<FuchsiaSystemClockInterface> validated_clock, | 
|  | bool start_event_aggregator_worker, bool test_dont_backfill_empty_reports, | 
|  | bool watch_for_user_consent); | 
|  |  | 
|  | static encoder::ClientSecret getClientSecret(); | 
|  |  | 
|  | std::unique_ptr<sys::ComponentContext> context_; | 
|  |  | 
|  | inspect::Node inspect_node_; | 
|  | inspect::Node inspect_config_node_; | 
|  |  | 
|  | std::unique_ptr<CobaltServiceInterface> cobalt_service_; | 
|  |  | 
|  | std::unique_ptr<FuchsiaSystemClockInterface> validated_clock_; | 
|  |  | 
|  | std::unique_ptr<CobaltControllerImpl> controller_impl_; | 
|  | fidl::BindingSet<fuchsia::cobalt::Controller> controller_bindings_; | 
|  |  | 
|  | std::unique_ptr<MetricEventLoggerFactoryImpl> metric_event_logger_factory_impl_; | 
|  | fidl::BindingSet<fuchsia::metrics::MetricEventLoggerFactory> | 
|  | metric_event_logger_factory_bindings_; | 
|  |  | 
|  | std::unique_ptr<CurrentChannelProvider> current_channel_provider_; | 
|  |  | 
|  | std::unique_ptr<AggregateAndUploadImpl> aggregate_and_upload_impl_; | 
|  | fidl::BindingSet<fuchsia::cobalt::AggregateAndUpload> aggregate_and_upload_bindings_; | 
|  |  | 
|  | std::unique_ptr<cobalt::ProcessLifecycle> process_lifecycle_impl_; | 
|  |  | 
|  | std::unique_ptr<UserConsentWatcher> user_consent_watcher_; | 
|  |  | 
|  | CobaltApp(const CobaltApp&) = delete; | 
|  | CobaltApp& operator=(const CobaltApp&) = delete; | 
|  | CobaltApp(CobaltApp&&) = delete; | 
|  | CobaltApp& operator=(CobaltApp&&) = delete; | 
|  | }; | 
|  |  | 
|  | std::string ReadGlobalMetricsRegistryBytes(const std::string& global_metrics_registry_path); | 
|  |  | 
|  | }  // namespace cobalt | 
|  |  | 
|  | #endif  // SRC_COBALT_BIN_APP_COBALT_APP_H_ |