1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstdio>
17 
18 #include "ecmascript/dfx/hprof/heap_profiler_interface.h"
19 #include "ecmascript/dfx/hprof/heap_profiler.h"
20 #include "ecmascript/dfx/hprof/heap_sampling.h"
21 #include "ecmascript/dfx/stackinfo/js_stackgetter.h"
22 #include "ecmascript/tests/test_helper.h"
23 
24 using namespace panda::ecmascript;
25 
26 namespace panda::test {
27 class HeapSamplingTest : public testing::Test {
28 public:
SetUpTestCase()29     static void SetUpTestCase()
30     {
31         GTEST_LOG_(INFO) << "SetUpTestCase";
32     }
33 
TearDownTestCase()34     static void TearDownTestCase()
35     {
36         GTEST_LOG_(INFO) << "TearDownCase";
37     }
38 
39     void SetUp() override
40     {
41         TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
42         instance->SetEnableForceGC(false);
43     }
44 
45     void TearDown() override
46     {
47         TestHelper::DestroyEcmaVMWithScope(instance, scope);
48     }
49 
50     EcmaVM *instance {nullptr};
51     EcmaHandleScope *scope {nullptr};
52     JSThread *thread {nullptr};
53 };
54 
HWTEST_F_L0(HeapSamplingTest, StartHeapSampling)55 HWTEST_F_L0(HeapSamplingTest, StartHeapSampling)
56 {
57     HeapProfilerInterface *heapProfile = HeapProfilerInterface::GetInstance(instance);
58     uint64_t samplingInterval = 1 << 15; // default interval
59     int stackDepth = 128; // default depth
60     bool result = heapProfile->StartHeapSampling(samplingInterval, stackDepth);
61     ASSERT_TRUE(result);
62     result = heapProfile->StartHeapSampling(samplingInterval, stackDepth);
63     ASSERT_FALSE(result);
64 }
65 
HWTEST_F_L0(HeapSamplingTest, StopHeapSampling)66 HWTEST_F_L0(HeapSamplingTest, StopHeapSampling)
67 {
68     HeapProfilerInterface *heapProfile = HeapProfilerInterface::GetInstance(instance);
69     uint64_t samplingInterval = 1 << 15; // default interval
70     int stackDepth = 128; // default depth
71     bool result = heapProfile->StartHeapSampling(samplingInterval, stackDepth);
72     ASSERT_TRUE(result);
73     heapProfile->StopHeapSampling();
74     result = heapProfile->StartHeapSampling(samplingInterval, stackDepth);
75     ASSERT_TRUE(result);
76 }
77 
HWTEST_F_L0(HeapSamplingTest, GetAllocationProfile)78 HWTEST_F_L0(HeapSamplingTest, GetAllocationProfile)
79 {
80     HeapProfilerInterface *heapProfile = HeapProfilerInterface::GetInstance(instance);
81     const SamplingInfo *result = heapProfile->GetAllocationProfile();
82     ASSERT_TRUE(result == nullptr);
83     uint64_t samplingInterval = 1 << 15; // default interval
84     int stackDepth = 128; // default depth
85     heapProfile->StartHeapSampling(samplingInterval, stackDepth);
86     result = heapProfile->GetAllocationProfile();
87     EXPECT_TRUE(result != nullptr);
88     EXPECT_TRUE(result->head_.callFrameInfo_.functionName_ == "(root)");
89 }
90 
HWTEST_F_L0(HeapSamplingTest, ImplementSampling)91 HWTEST_F_L0(HeapSamplingTest, ImplementSampling)
92 {
93     uint64_t samplingInterval = 1 << 15; // default interval
94     int stackDepth = 128; // default depth
95     std::unique_ptr<HeapSampling> heapSampling = std::make_unique<HeapSampling>(instance,
96         const_cast<Heap *>(instance->GetHeap()), samplingInterval, stackDepth);
97     size_t size = 1U << 15U; // default size
98     Address addr = 0;
99     heapSampling->ImplementSampling(addr, size);
100     const SamplingInfo *result = heapSampling->GetAllocationProfile();
101     EXPECT_TRUE(result != nullptr);
102     EXPECT_TRUE(result->samples_[0].size_ == size);
103 }
104 }  // namespace panda::test
105