Index: test/cctest/test-profile-generator.cc |
diff --git a/test/cctest/test-profile-generator.cc b/test/cctest/test-profile-generator.cc |
index 22b4e059a246993aa2bae921e16ed758377c23ee..884ca834fb263ef43de88f2473671da406ad4b3e 100644 |
--- a/test/cctest/test-profile-generator.cc |
+++ b/test/cctest/test-profile-generator.cc |
@@ -85,7 +85,8 @@ TEST(TokenEnumerator) { |
TEST(ProfileNodeFindOrAddChild) { |
- ProfileNode node(NULL, NULL); |
+ ProfileTree tree; |
+ ProfileNode node(&tree, NULL); |
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa", "", 0, |
TokenEnumerator::kNoSecurityToken); |
ProfileNode* childNode1 = node.FindOrAddChild(&entry1); |
@@ -113,7 +114,8 @@ TEST(ProfileNodeFindOrAddChild) { |
TEST(ProfileNodeFindOrAddChildForSameFunction) { |
const char* empty = ""; |
const char* aaa = "aaa"; |
- ProfileNode node(NULL, NULL); |
+ ProfileTree tree; |
+ ProfileNode node(&tree, NULL); |
CodeEntry entry1(i::Logger::FUNCTION_TAG, empty, aaa, empty, 0, |
TokenEnumerator::kNoSecurityToken); |
ProfileNode* childNode1 = node.FindOrAddChild(&entry1); |
@@ -607,7 +609,7 @@ class TestSetup { |
TEST(RecordTickSample) { |
TestSetup test_setup; |
CpuProfilesCollection profiles; |
- profiles.StartProfiling("", 1); |
+ profiles.StartProfiling("", 1, false); |
ProfileGenerator generator(&profiles); |
CodeEntry* entry1 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); |
CodeEntry* entry2 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb"); |
@@ -713,6 +715,88 @@ TEST(SampleRateCalculator) { |
} |
+static void CheckNodeIds(ProfileNode* node, int* expectedId) { |
+ CHECK_EQ((*expectedId)++, node->id()); |
+ for (int i = 0; i < node->children()->length(); i++) { |
+ CheckNodeIds(node->children()->at(i), expectedId); |
+ } |
+} |
+ |
+TEST(SampleIds) { |
+ TestSetup test_setup; |
+ CpuProfilesCollection profiles; |
+ profiles.StartProfiling("", 1, true); |
+ ProfileGenerator generator(&profiles); |
+ CodeEntry* entry1 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); |
+ CodeEntry* entry2 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb"); |
+ CodeEntry* entry3 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc"); |
+ generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200); |
+ generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100); |
+ generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50); |
+ |
+ // We are building the following calls tree: |
+ // -> aaa #3 - sample1 |
+ // (root)#1 -> aaa #2 -> bbb #4 -> ccc #5 - sample2 |
+ // -> ccc #6 -> aaa #7 - sample3 |
+ TickSample sample1; |
+ sample1.pc = ToAddress(0x1600); |
+ sample1.stack[0] = ToAddress(0x1510); |
+ sample1.frames_count = 1; |
+ generator.RecordTickSample(sample1); |
+ TickSample sample2; |
+ sample2.pc = ToAddress(0x1925); |
+ sample2.stack[0] = ToAddress(0x1780); |
+ sample2.stack[1] = ToAddress(0x10000); // non-existent. |
+ sample2.stack[2] = ToAddress(0x1620); |
+ sample2.frames_count = 3; |
+ generator.RecordTickSample(sample2); |
+ TickSample sample3; |
+ sample3.pc = ToAddress(0x1510); |
+ sample3.stack[0] = ToAddress(0x1910); |
+ sample3.stack[1] = ToAddress(0x1610); |
+ sample3.frames_count = 2; |
+ generator.RecordTickSample(sample3); |
+ |
+ CpuProfile* profile = |
+ profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1); |
+ int nodeId = 1; |
+ CheckNodeIds(profile->top_down()->root(), &nodeId); |
+ CHECK_EQ(7, nodeId - 1); |
+ |
+ CHECK_EQ(3, profile->samples_count()); |
+ int expected_id[] = {3, 5, 7}; |
+ for (int i = 0; i < 3; i++) { |
+ CHECK_EQ(expected_id[i], profile->sample(i)->id()); |
+ } |
+} |
+ |
+ |
+TEST(NoSamples) { |
+ TestSetup test_setup; |
+ CpuProfilesCollection profiles; |
+ profiles.StartProfiling("", 1, false); |
+ ProfileGenerator generator(&profiles); |
+ CodeEntry* entry1 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa"); |
+ generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200); |
+ |
+ // We are building the following calls tree: |
+ // (root)#1 -> aaa #2 -> aaa #3 - sample1 |
+ TickSample sample1; |
+ sample1.pc = ToAddress(0x1600); |
+ sample1.stack[0] = ToAddress(0x1510); |
+ sample1.frames_count = 1; |
+ generator.RecordTickSample(sample1); |
+ |
+ CpuProfile* profile = |
+ profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1); |
+ int nodeId = 1; |
+ CheckNodeIds(profile->top_down()->root(), &nodeId); |
+ CHECK_EQ(3, nodeId - 1); |
+ |
+ CHECK_EQ(0, profile->samples_count()); |
+} |
+ |
+ |
// --- P r o f i l e r E x t e n s i o n --- |
class ProfilerExtension : public v8::Extension { |
@@ -838,11 +922,12 @@ TEST(Issue51919) { |
for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) { |
i::Vector<char> title = i::Vector<char>::New(16); |
i::OS::SNPrintF(title, "%d", i); |
- CHECK(collection.StartProfiling(title.start(), i + 1)); // UID must be > 0. |
+ // UID must be > 0. |
+ CHECK(collection.StartProfiling(title.start(), i + 1, false)); |
titles[i] = title.start(); |
} |
CHECK(!collection.StartProfiling( |
- "maximum", CpuProfilesCollection::kMaxSimultaneousProfiles + 1)); |
+ "maximum", CpuProfilesCollection::kMaxSimultaneousProfiles + 1, false)); |
for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) |
i::DeleteArray(titles[i]); |
} |