| /* |
| * Copyright (C) 2025 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <gtest/gtest.h> |
| |
| #include <memory> |
| #include <sstream> |
| |
| #include <android-base/file.h> |
| #include <memory_trace/TraceInfo.h> |
| |
| #include "OpGenAnalysis.h" |
| #include "OpOverlapAnalysis.h" |
| |
| class AnalysisTest : public ::testing::Test { |
| protected: |
| template <typename Analysis> |
| void Gather(std::stringstream& res) { |
| auto analysis = std::make_unique<Analysis>(); |
| analysis->Gather(*trace_info_); |
| analysis->StreamResult(res, " "); |
| } |
| |
| void InitTraceInfo(const char* contents) { |
| TemporaryFile tf; |
| ASSERT_NE(-1, tf.fd); |
| ASSERT_TRUE(android::base::WriteStringToFd(contents, tf.fd)); |
| close(tf.fd); |
| |
| trace_info_.reset(new memory_trace::TraceInfo); |
| trace_info_->Init(tf.path); |
| } |
| |
| private: |
| std::unique_ptr<memory_trace::TraceInfo> trace_info_; |
| }; |
| |
| TEST_F(AnalysisTest, Average) { |
| const char* const entries = |
| "1234: malloc 0x0 32 1 1101\n" |
| "1234: malloc 0x10 32 2001 3001\n" |
| "1234: malloc 0x20 32 4001 4901\n"; |
| ASSERT_NO_FATAL_FAILURE(InitTraceInfo(entries)); |
| |
| std::stringstream result; |
| Gather<OpAverageAnalysis>(result); |
| |
| std::string expected = |
| " malloc: avg exec time = 1000.0 ns\n" |
| " calloc: avg exec time = 0.0 ns\n" |
| " memalign: avg exec time = 0.0 ns\n" |
| " realloc: avg exec time = 0.0 ns\n" |
| " free: avg exec time = 0.0 ns\n"; |
| EXPECT_EQ(expected, result.str()); |
| } |
| |
| TEST_F(AnalysisTest, MinMax) { |
| const char* const entries = |
| "1234: malloc 0x0 32 1 1001\n" |
| "1234: malloc 0x10 32 2001 3001\n" |
| "1234: malloc 0x20 32 4001 5001\n"; |
| ASSERT_NO_FATAL_FAILURE(InitTraceInfo(entries)); |
| |
| std::stringstream result; |
| Gather<OpMinMaxAnalysis>(result); |
| |
| std::string expected = |
| " malloc: min exec time = 1000 ns, max exec time = 1000 ns\n" |
| " calloc: min exec time = 0 ns, max exec time = 0 ns\n" |
| " memalign: min exec time = 0 ns, max exec time = 0 ns\n" |
| " realloc: min exec time = 0 ns, max exec time = 0 ns\n" |
| " free: min exec time = 0 ns, max exec time = 0 ns\n"; |
| EXPECT_EQ(expected, result.str()); |
| } |
| |
| TEST_F(AnalysisTest, Overlap) { |
| const char* const entries = |
| "1234: malloc 0x0 32 1 1001\n" |
| "1235: malloc 0x30 256 600 800\n" |
| "1236: malloc 0x10 48 500 2500\n" |
| "1237: malloc 0x20 128 2200 3200\n"; |
| ASSERT_NO_FATAL_FAILURE(InitTraceInfo(entries)); |
| |
| std::stringstream result; |
| Gather<OpOverlapAnalysis>(result); |
| |
| EXPECT_EQ(" Overlap of all operations is 1001 ns\n", result.str()); |
| } |