| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <iterator> | 5 #include <iterator> |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/trace_event/heap_profiler_allocation_context.h" | 9 #include "base/trace_event/heap_profiler_allocation_context.h" |
| 10 #include "base/trace_event/heap_profiler_stack_frame_deduplicator.h" | 10 #include "base/trace_event/heap_profiler_stack_frame_deduplicator.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 12 |
| 13 namespace base { | 13 namespace base { |
| 14 namespace trace_event { | 14 namespace trace_event { |
| 15 | 15 |
| 16 // Define all strings once, because the deduplicator requires pointer equality, | 16 // Define all strings once, because the deduplicator requires pointer equality, |
| 17 // and string interning is unreliable. | 17 // and string interning is unreliable. |
| 18 const char kBrowserMain[] = "BrowserMain"; | 18 const char kBrowserMain[] = "BrowserMain"; |
| 19 const char kRendererMain[] = "RendererMain"; | 19 const char kRendererMain[] = "RendererMain"; |
| 20 const char kCreateWidget[] = "CreateWidget"; | 20 const char kCreateWidget[] = "CreateWidget"; |
| 21 const char kInitialize[] = "Initialize"; | 21 const char kInitialize[] = "Initialize"; |
| 22 const char kMalloc[] = "malloc"; | 22 const char kMalloc[] = "malloc"; |
| 23 | 23 |
| 24 TEST(StackFrameDeduplicatorTest, SingleBacktrace) { | 24 TEST(StackFrameDeduplicatorTest, SingleBacktrace) { |
| 25 StackFrame bt[] = {kBrowserMain, kCreateWidget, kMalloc}; | 25 StackFrame bt[] = {kBrowserMain, kCreateWidget, kMalloc}; |
| 26 | 26 |
| 27 // The call tree should look like this (index in brackets). | 27 // The call tree should look like this (index in brackets). |
| 28 // | 28 // |
| 29 // BrowserMain [0] | 29 // BrowserMain [0] |
| 30 // CreateWidget [1] | 30 // CreateWidget [1] |
| 31 // malloc [2] | 31 // malloc [2] |
| 32 | 32 |
| 33 scoped_refptr<StackFrameDeduplicator> dedup = new StackFrameDeduplicator; | 33 scoped_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator); |
| 34 ASSERT_EQ(2, dedup->Insert(std::begin(bt), std::end(bt))); | 34 ASSERT_EQ(2, dedup->Insert(std::begin(bt), std::end(bt))); |
| 35 | 35 |
| 36 auto iter = dedup->begin(); | 36 auto iter = dedup->begin(); |
| 37 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); | 37 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); |
| 38 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); | 38 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); |
| 39 | 39 |
| 40 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); | 40 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); |
| 41 ASSERT_EQ(0, (iter + 1)->parent_frame_index); | 41 ASSERT_EQ(0, (iter + 1)->parent_frame_index); |
| 42 | 42 |
| 43 ASSERT_EQ(kMalloc, (iter + 2)->frame); | 43 ASSERT_EQ(kMalloc, (iter + 2)->frame); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 56 // The call tree should look like this (index in brackets). | 56 // The call tree should look like this (index in brackets). |
| 57 // | 57 // |
| 58 // BrowserMain [0] | 58 // BrowserMain [0] |
| 59 // CreateWidget [1] | 59 // CreateWidget [1] |
| 60 // RendererMain [2] | 60 // RendererMain [2] |
| 61 // CreateWidget [3] | 61 // CreateWidget [3] |
| 62 // | 62 // |
| 63 // Note that there will be two instances of CreateWidget, | 63 // Note that there will be two instances of CreateWidget, |
| 64 // with different parents. | 64 // with different parents. |
| 65 | 65 |
| 66 scoped_refptr<StackFrameDeduplicator> dedup = new StackFrameDeduplicator; | 66 scoped_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator); |
| 67 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); | 67 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); |
| 68 ASSERT_EQ(3, dedup->Insert(std::begin(bt1), std::end(bt1))); | 68 ASSERT_EQ(3, dedup->Insert(std::begin(bt1), std::end(bt1))); |
| 69 | 69 |
| 70 auto iter = dedup->begin(); | 70 auto iter = dedup->begin(); |
| 71 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); | 71 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); |
| 72 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); | 72 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); |
| 73 | 73 |
| 74 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); | 74 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); |
| 75 ASSERT_EQ(0, (iter + 1)->parent_frame_index); | 75 ASSERT_EQ(0, (iter + 1)->parent_frame_index); |
| 76 | 76 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 88 StackFrame bt1[] = {kBrowserMain, kInitialize}; | 88 StackFrame bt1[] = {kBrowserMain, kInitialize}; |
| 89 | 89 |
| 90 // The call tree should look like this (index in brackets). | 90 // The call tree should look like this (index in brackets). |
| 91 // | 91 // |
| 92 // BrowserMain [0] | 92 // BrowserMain [0] |
| 93 // CreateWidget [1] | 93 // CreateWidget [1] |
| 94 // Initialize [2] | 94 // Initialize [2] |
| 95 // | 95 // |
| 96 // Note that BrowserMain will be re-used. | 96 // Note that BrowserMain will be re-used. |
| 97 | 97 |
| 98 scoped_refptr<StackFrameDeduplicator> dedup = new StackFrameDeduplicator; | 98 scoped_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator); |
| 99 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); | 99 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); |
| 100 ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1))); | 100 ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1))); |
| 101 | 101 |
| 102 auto iter = dedup->begin(); | 102 auto iter = dedup->begin(); |
| 103 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); | 103 ASSERT_EQ(kBrowserMain, (iter + 0)->frame); |
| 104 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); | 104 ASSERT_EQ(-1, (iter + 0)->parent_frame_index); |
| 105 | 105 |
| 106 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); | 106 ASSERT_EQ(kCreateWidget, (iter + 1)->frame); |
| 107 ASSERT_EQ(0, (iter + 1)->parent_frame_index); | 107 ASSERT_EQ(0, (iter + 1)->parent_frame_index); |
| 108 | 108 |
| 109 ASSERT_EQ(kInitialize, (iter + 2)->frame); | 109 ASSERT_EQ(kInitialize, (iter + 2)->frame); |
| 110 ASSERT_EQ(0, (iter + 2)->parent_frame_index); | 110 ASSERT_EQ(0, (iter + 2)->parent_frame_index); |
| 111 | 111 |
| 112 ASSERT_EQ(iter + 3, dedup->end()); | 112 ASSERT_EQ(iter + 3, dedup->end()); |
| 113 | 113 |
| 114 // Inserting the same backtrace again should return the index of the existing | 114 // Inserting the same backtrace again should return the index of the existing |
| 115 // node. | 115 // node. |
| 116 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); | 116 ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0))); |
| 117 ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1))); | 117 ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1))); |
| 118 ASSERT_EQ(dedup->begin() + 3, dedup->end()); | 118 ASSERT_EQ(dedup->begin() + 3, dedup->end()); |
| 119 } | 119 } |
| 120 | 120 |
| 121 TEST(StackFrameDeduplicatorTest, NullPaddingIsRemoved) { | 121 TEST(StackFrameDeduplicatorTest, NullPaddingIsRemoved) { |
| 122 StackFrame bt0[] = {kBrowserMain, nullptr, nullptr, nullptr}; | 122 StackFrame bt0[] = {kBrowserMain, nullptr, nullptr, nullptr}; |
| 123 | 123 |
| 124 scoped_refptr<StackFrameDeduplicator> dedup = new StackFrameDeduplicator; | 124 scoped_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator); |
| 125 | 125 |
| 126 // There are four frames in the backtrace, but the null pointers should be | 126 // There are four frames in the backtrace, but the null pointers should be |
| 127 // skipped, so only one frame is inserted, which will have index 0. | 127 // skipped, so only one frame is inserted, which will have index 0. |
| 128 ASSERT_EQ(4u, arraysize(bt0)); | 128 ASSERT_EQ(4u, arraysize(bt0)); |
| 129 ASSERT_EQ(0, dedup->Insert(std::begin(bt0), std::end(bt0))); | 129 ASSERT_EQ(0, dedup->Insert(std::begin(bt0), std::end(bt0))); |
| 130 ASSERT_EQ(dedup->begin() + 1, dedup->end()); | 130 ASSERT_EQ(dedup->begin() + 1, dedup->end()); |
| 131 } | 131 } |
| 132 | 132 |
| 133 } // namespace trace_event | 133 } // namespace trace_event |
| 134 } // namespace base | 134 } // namespace base |
| OLD | NEW |