1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/test_service/test_request_tracker_impl.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test {
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TrackingContext::TrackingContext() : next_id(1) {}
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TrackingContext::~TrackingContext() {}
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestRequestTrackerImpl::TestRequestTrackerImpl(TrackingContext* context)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     : context_(context), weak_factory_(this) {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequestTrackerImpl::~TestRequestTrackerImpl() {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestRequestTrackerImpl::RecordStats(
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      uint64_t client_id,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ServiceStatsPtr stats) {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  assert(context_->ids_to_names.find(client_id) !=
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         context_->ids_to_names.end());
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  context_->records[client_id].push_back(*stats);
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestRequestTrackerImpl::OnConnectionEstablished() {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  uint64_t id = context_->next_id++;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client()->SetIdAndReturnName(id,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&TestRequestTrackerImpl::UploaderNameCallback,
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 weak_factory_.GetWeakPtr(),
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 id));
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestRequestTrackerImpl::UploaderNameCallback(
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    uint64_t id, const mojo::String& name) {
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(context_->ids_to_names.find(id) == context_->ids_to_names.end());
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  context_->ids_to_names[id] = name;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestTrackedRequestServiceImpl::TestTrackedRequestServiceImpl(
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TrackingContext* context)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : context_(context) {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestTrackedRequestServiceImpl::~TestTrackedRequestServiceImpl() {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestTrackedRequestServiceImpl::GetReport(
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const mojo::Callback<void(mojo::Array<ServiceReportPtr>)>& callback) {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  mojo::Array<ServiceReportPtr> reports;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (AllRecordsMap::const_iterator it1 = context_->records.begin();
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       it1 != context_->records.end(); ++it1) {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ServiceReportPtr report(ServiceReport::New());
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    report->service_name = context_->ids_to_names[it1->first];
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    double mean_health_numerator = 0;
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    size_t num_samples = it1->second.size();
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (num_samples == 0)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (std::vector<ServiceStats>::const_iterator it2 = it1->second.begin();
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         it2 != it1->second.end(); ++it2) {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      report->total_requests += it2->num_new_requests;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      mean_health_numerator += it2->health;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    report->mean_health = mean_health_numerator / num_samples;
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    reports.push_back(report.Pass());
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  callback.Run(reports.Pass());
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace test
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
76