blob: 936fe0d097bc231ef7e5324657454a5b37f401f8 [file] [log] [blame]
// Copyright 2018 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 "components/metrics/call_stack_profile_metadata.h"
#include <utility>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/sampled_profile.pb.h"
namespace metrics {
TEST(CallStackProfileMetadataTest, MetadataRecorder_NoItems) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(0, name_hashes.size());
ASSERT_EQ(0, items.size());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_SetItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(1, name_hashes.size());
EXPECT_EQ(100u, name_hashes[0]);
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_EQ(10, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_SetKeyedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(1, name_hashes.size());
EXPECT_EQ(100u, name_hashes[0]);
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_TRUE(items[0].has_key());
EXPECT_EQ(50, items[0].key());
EXPECT_EQ(10, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_RepeatItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
// The second sample shouldn't have any metadata because it's all the same
// as the last sample.
EXPECT_EQ(1, name_hashes.size());
EXPECT_TRUE(items.empty());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_RepeatKeyedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
// The second sample shouldn't have any metadata because it's all the same
// as the last sample.
EXPECT_EQ(1, name_hashes.size());
EXPECT_TRUE(items.empty());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_ModifiedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Set(100, base::nullopt, 11);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
EXPECT_EQ(1, name_hashes.size());
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_EQ(11, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_ModifiedKeyedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Set(100, 50, 11);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
EXPECT_EQ(1, name_hashes.size());
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_TRUE(items[0].has_key());
EXPECT_EQ(50, items[0].key());
EXPECT_EQ(11, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_NewItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Set(101, base::nullopt, 11);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(2, name_hashes.size());
EXPECT_EQ(101u, name_hashes[1]);
ASSERT_EQ(1, items.size());
EXPECT_EQ(1, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_EQ(11, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_NewKeyedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Set(101, 50, 11);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(2, name_hashes.size());
EXPECT_EQ(101u, name_hashes[1]);
ASSERT_EQ(1, items.size());
EXPECT_EQ(1, items[0].name_hash_index());
EXPECT_TRUE(items[0].has_key());
EXPECT_EQ(50, items[0].key());
EXPECT_EQ(11, items[0].value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_RemovedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Remove(100, base::nullopt);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
EXPECT_EQ(1, name_hashes.size());
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_FALSE(items[0].has_value());
}
TEST(CallStackProfileMetadataTest, MetadataRecorder_RemovedKeyedItem) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Remove(100, 50);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
EXPECT_EQ(1, name_hashes.size());
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_TRUE(items[0].has_key());
EXPECT_EQ(50, items[0].key());
EXPECT_FALSE(items[0].has_value());
}
TEST(CallStackProfileMetadataTest,
MetadataRecorder_SetMixedUnkeyedAndKeyedItems) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 20);
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(2, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_EQ(20, items[0].value());
EXPECT_EQ(0, items[1].name_hash_index());
EXPECT_TRUE(items[1].has_key());
EXPECT_EQ(50, items[1].key());
EXPECT_EQ(10, items[1].value());
}
TEST(CallStackProfileMetadataTest,
MetadataRecorder_RemoveMixedUnkeyedAndKeyedItems) {
base::MetadataRecorder metadata_recorder;
CallStackProfileMetadata metadata;
google::protobuf::RepeatedField<uint64_t> name_hashes;
metadata_recorder.Set(100, base::nullopt, 20);
metadata_recorder.Set(100, 50, 10);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
(void)metadata.CreateSampleMetadata(&name_hashes);
metadata_recorder.Remove(100, base::nullopt);
metadata.RecordMetadata(metadata_recorder.CreateMetadataProvider().get());
google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items =
metadata.CreateSampleMetadata(&name_hashes);
ASSERT_EQ(1, items.size());
EXPECT_EQ(0, items[0].name_hash_index());
EXPECT_FALSE(items[0].has_key());
EXPECT_FALSE(items[0].has_value());
}
} // namespace metrics