blob: fdca497a6f9ad6d52238d1058ed0c4f2ab580bc9 [file] [log] [blame]
// Copyright 2014 The Chromium 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 "base/bind.h"
#include "services/test_service/test_request_tracker_impl.h"
namespace mojo {
namespace test {
TrackingContext::TrackingContext() : next_id(1) {}
TrackingContext::~TrackingContext() {}
TestRequestTrackerImpl::TestRequestTrackerImpl(TrackingContext* context)
: context_(context), weak_factory_(this) {
}
TestRequestTrackerImpl::~TestRequestTrackerImpl() {
}
void TestRequestTrackerImpl::RecordStats(
uint64_t client_id,
ServiceStatsPtr stats) {
assert(context_->ids_to_names.find(client_id) !=
context_->ids_to_names.end());
context_->records[client_id].push_back(*stats);
}
void TestRequestTrackerImpl::OnConnectionEstablished() {
uint64_t id = context_->next_id++;
client()->SetIdAndReturnName(id,
base::Bind(&TestRequestTrackerImpl::UploaderNameCallback,
weak_factory_.GetWeakPtr(),
id));
}
void TestRequestTrackerImpl::UploaderNameCallback(
uint64_t id, const mojo::String& name) {
DCHECK(context_->ids_to_names.find(id) == context_->ids_to_names.end());
context_->ids_to_names[id] = name;
}
TestTrackedRequestServiceImpl::TestTrackedRequestServiceImpl(
TrackingContext* context)
: context_(context) {
}
TestTrackedRequestServiceImpl::~TestTrackedRequestServiceImpl() {
}
void TestTrackedRequestServiceImpl::GetReport(
const mojo::Callback<void(mojo::Array<ServiceReportPtr>)>& callback) {
mojo::Array<ServiceReportPtr> reports;
for (AllRecordsMap::const_iterator it1 = context_->records.begin();
it1 != context_->records.end(); ++it1) {
ServiceReportPtr report(ServiceReport::New());
report->service_name = context_->ids_to_names[it1->first];
double mean_health_numerator = 0;
size_t num_samples = it1->second.size();
if (num_samples == 0)
continue;
for (std::vector<ServiceStats>::const_iterator it2 = it1->second.begin();
it2 != it1->second.end(); ++it2) {
report->total_requests += it2->num_new_requests;
mean_health_numerator += it2->health;
}
report->mean_health = mean_health_numerator / num_samples;
reports.push_back(report.Pass());
}
callback.Run(reports.Pass());
}
} // namespace test
} // namespace mojo