blob: 81e484134cf05a375249adb9e3758700ead034db [file] [log] [blame]
// Copyright 2016 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 <utility>
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "components/metrics/public/interfaces/call_stack_profile_collector_test.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/sampled_profile.pb.h"
namespace metrics {
class CallStackProfileCollectorTestImpl
: public mojom::CallStackProfileCollectorTest {
public:
explicit CallStackProfileCollectorTestImpl(
mojo::InterfaceRequest<mojom::CallStackProfileCollectorTest> request)
: binding_(this, std::move(request)) {
}
// CallStackProfileCollectorTest:
void BounceSampledProfile(SampledProfile in,
BounceSampledProfileCallback callback) override {
std::move(callback).Run(in);
}
private:
mojo::Binding<CallStackProfileCollectorTest> binding_;
DISALLOW_COPY_AND_ASSIGN(CallStackProfileCollectorTestImpl);
};
class CallStackProfileStructTraitsTest : public testing::Test {
public:
CallStackProfileStructTraitsTest() : impl_(MakeRequest(&proxy_)) {}
protected:
base::MessageLoop message_loop_;
mojom::CallStackProfileCollectorTestPtr proxy_;
CallStackProfileCollectorTestImpl impl_;
DISALLOW_COPY_AND_ASSIGN(CallStackProfileStructTraitsTest);
};
// Checks serialization/deserialization of SampledProfile.
TEST_F(CallStackProfileStructTraitsTest, SampledProfile) {
// Construct a SampledProfile protocol buffer message.
SampledProfile input_proto;
CallStackProfile* proto_profile = input_proto.mutable_call_stack_profile();
CallStackProfile::Sample* proto_sample = proto_profile->add_sample();
proto_sample->set_count(1);
CallStackProfile::Location* location = proto_sample->add_frame();
location->set_address(0x10ULL);
location->set_module_id_index(0);
CallStackProfile::ModuleIdentifier* module_id =
proto_profile->add_module_id();
module_id->set_build_id("a");
module_id->set_name_md5_prefix(111U);
proto_profile->set_profile_duration_ms(1000);
proto_profile->set_sampling_period_ms(2000);
// Send the message round trip, and verify those values.
SampledProfile output_proto;
EXPECT_TRUE(
proxy_->BounceSampledProfile(std::move(input_proto), &output_proto));
const CallStackProfile& out_profile = output_proto.call_stack_profile();
ASSERT_EQ(1, out_profile.sample_size());
ASSERT_EQ(1, out_profile.sample(0).frame_size());
ASSERT_TRUE(out_profile.sample(0).frame(0).has_address());
EXPECT_EQ(0x10ULL, out_profile.sample(0).frame(0).address());
ASSERT_TRUE(out_profile.sample(0).frame(0).has_module_id_index());
EXPECT_EQ(0, out_profile.sample(0).frame(0).module_id_index());
ASSERT_EQ(1, out_profile.module_id().size());
ASSERT_TRUE(out_profile.module_id(0).has_build_id());
ASSERT_EQ("a", out_profile.module_id(0).build_id());
ASSERT_TRUE(out_profile.module_id(0).has_name_md5_prefix());
ASSERT_EQ(111U, out_profile.module_id(0).name_md5_prefix());
ASSERT_TRUE(out_profile.has_profile_duration_ms());
EXPECT_EQ(1000, out_profile.profile_duration_ms());
ASSERT_TRUE(out_profile.has_sampling_period_ms());
EXPECT_EQ(2000, out_profile.sampling_period_ms());
}
} // namespace metrics