xref: /aosp_15_r20/art/odrefresh/odr_metrics_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "odr_metrics.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <unistd.h>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include <chrono>
22*795d594fSAndroid Build Coastguard Worker #include <cstdint>
23*795d594fSAndroid Build Coastguard Worker #include <fstream>
24*795d594fSAndroid Build Coastguard Worker #include <memory>
25*795d594fSAndroid Build Coastguard Worker #include <string>
26*795d594fSAndroid Build Coastguard Worker #include <thread>
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
29*795d594fSAndroid Build Coastguard Worker #include "base/common_art_test.h"
30*795d594fSAndroid Build Coastguard Worker #include "odr_metrics_record.h"
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker namespace art {
33*795d594fSAndroid Build Coastguard Worker namespace odrefresh {
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker using std::chrono_literals::operator""ms;  // NOLINT
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker class OdrMetricsTest : public CommonArtTest {
38*795d594fSAndroid Build Coastguard Worker  public:
SetUp()39*795d594fSAndroid Build Coastguard Worker   void SetUp() override {
40*795d594fSAndroid Build Coastguard Worker     CommonArtTest::SetUp();
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker     scratch_dir_ = std::make_unique<ScratchDir>();
43*795d594fSAndroid Build Coastguard Worker     metrics_file_path_ = scratch_dir_->GetPath() + "/metrics.xml";
44*795d594fSAndroid Build Coastguard Worker     cache_directory_ = scratch_dir_->GetPath() + "/dir";
45*795d594fSAndroid Build Coastguard Worker     mkdir(cache_directory_.c_str(), S_IRWXU);
46*795d594fSAndroid Build Coastguard Worker   }
47*795d594fSAndroid Build Coastguard Worker 
TearDown()48*795d594fSAndroid Build Coastguard Worker   void TearDown() override {
49*795d594fSAndroid Build Coastguard Worker     scratch_dir_.reset();
50*795d594fSAndroid Build Coastguard Worker   }
51*795d594fSAndroid Build Coastguard Worker 
MetricsFileExists() const52*795d594fSAndroid Build Coastguard Worker   bool MetricsFileExists() const {
53*795d594fSAndroid Build Coastguard Worker     const char* path = metrics_file_path_.c_str();
54*795d594fSAndroid Build Coastguard Worker     return OS::FileExists(path);
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker 
GetCacheDirectory() const57*795d594fSAndroid Build Coastguard Worker   const std::string GetCacheDirectory() const { return cache_directory_; }
GetMetricsFilePath() const58*795d594fSAndroid Build Coastguard Worker   const std::string GetMetricsFilePath() const { return metrics_file_path_; }
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker  protected:
61*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ScratchDir> scratch_dir_;
62*795d594fSAndroid Build Coastguard Worker   std::string metrics_file_path_;
63*795d594fSAndroid Build Coastguard Worker   std::string cache_directory_;
64*795d594fSAndroid Build Coastguard Worker };
65*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,MetricsFileIsNotCreatedIfNotEnabled)66*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, MetricsFileIsNotCreatedIfNotEnabled) {
67*795d594fSAndroid Build Coastguard Worker   // Metrics file is (potentially) written in OdrMetrics destructor.
68*795d594fSAndroid Build Coastguard Worker   {
69*795d594fSAndroid Build Coastguard Worker     OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
70*795d594fSAndroid Build Coastguard Worker     metrics.SetArtApexVersion(99);
71*795d594fSAndroid Build Coastguard Worker     metrics.SetTrigger(OdrMetrics::Trigger::kApexVersionMismatch);
72*795d594fSAndroid Build Coastguard Worker     metrics.SetStage(OdrMetrics::Stage::kCheck);
73*795d594fSAndroid Build Coastguard Worker     metrics.SetStatus(OdrMetrics::Status::kNoSpace);
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(MetricsFileExists());
76*795d594fSAndroid Build Coastguard Worker }
77*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,MetricsFileIsCreatedIfEnabled)78*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, MetricsFileIsCreatedIfEnabled) {
79*795d594fSAndroid Build Coastguard Worker   // Metrics file is (potentially) written in OdrMetrics destructor.
80*795d594fSAndroid Build Coastguard Worker   {
81*795d594fSAndroid Build Coastguard Worker     OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
82*795d594fSAndroid Build Coastguard Worker     metrics.SetEnabled(true);
83*795d594fSAndroid Build Coastguard Worker     metrics.SetArtApexVersion(101);
84*795d594fSAndroid Build Coastguard Worker     metrics.SetTrigger(OdrMetrics::Trigger::kDexFilesChanged);
85*795d594fSAndroid Build Coastguard Worker     metrics.SetStage(OdrMetrics::Stage::kCheck);
86*795d594fSAndroid Build Coastguard Worker     metrics.SetStatus(OdrMetrics::Status::kNoSpace);
87*795d594fSAndroid Build Coastguard Worker   }
88*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(MetricsFileExists());
89*795d594fSAndroid Build Coastguard Worker }
90*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,CacheSpaceValuesAreUpdated)91*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, CacheSpaceValuesAreUpdated) {
92*795d594fSAndroid Build Coastguard Worker   OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
93*795d594fSAndroid Build Coastguard Worker   metrics.CaptureSpaceFreeEnd();
94*795d594fSAndroid Build Coastguard Worker   OdrMetricsRecord record = metrics.ToRecord();
95*795d594fSAndroid Build Coastguard Worker   EXPECT_GT(record.cache_space_free_start_mib, 0);
96*795d594fSAndroid Build Coastguard Worker   EXPECT_GT(record.cache_space_free_end_mib, 0);
97*795d594fSAndroid Build Coastguard Worker }
98*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,PrimaryBcpResultWithValue)99*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, PrimaryBcpResultWithValue) {
100*795d594fSAndroid Build Coastguard Worker   OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
101*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
102*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kPrimaryBootClasspath,
103*795d594fSAndroid Build Coastguard Worker       100,
104*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kExited, .exit_code = 0, .signal = 0});
105*795d594fSAndroid Build Coastguard Worker   metrics.SetBcpCompilationType(OdrMetrics::Stage::kPrimaryBootClasspath,
106*795d594fSAndroid Build Coastguard Worker                                 OdrMetrics::BcpCompilationType::kMainline);
107*795d594fSAndroid Build Coastguard Worker   OdrMetricsRecord record = metrics.ToRecord();
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_compilation_millis, 100);
110*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.status, ExecResult::Status::kExited);
111*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.exit_code, 0);
112*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.signal, 0);
113*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_compilation_type,
114*795d594fSAndroid Build Coastguard Worker             static_cast<int32_t>(OdrMetrics::BcpCompilationType::kMainline));
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_compilation_millis, 0);
117*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.status, kExecResultNotRun);
118*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_compilation_type,
119*795d594fSAndroid Build Coastguard Worker             static_cast<int32_t>(OdrMetrics::BcpCompilationType::kUnknown));
120*795d594fSAndroid Build Coastguard Worker 
121*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_compilation_millis, 0);
122*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_dex2oat_result.status, kExecResultNotRun);
123*795d594fSAndroid Build Coastguard Worker }
124*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,PrimaryBcpResultWithoutValue)125*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, PrimaryBcpResultWithoutValue) {
126*795d594fSAndroid Build Coastguard Worker   OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker   OdrMetricsRecord record = metrics.ToRecord();
129*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.status, kExecResultNotRun);
130*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.exit_code, -1);
131*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.signal, 0);
132*795d594fSAndroid Build Coastguard Worker }
133*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,SecondaryBcpResultWithValue)134*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, SecondaryBcpResultWithValue) {
135*795d594fSAndroid Build Coastguard Worker   OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
136*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
137*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kPrimaryBootClasspath,
138*795d594fSAndroid Build Coastguard Worker       100,
139*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kExited, .exit_code = 0, .signal = 0});
140*795d594fSAndroid Build Coastguard Worker   metrics.SetBcpCompilationType(OdrMetrics::Stage::kPrimaryBootClasspath,
141*795d594fSAndroid Build Coastguard Worker                                 OdrMetrics::BcpCompilationType::kMainline);
142*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
143*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kSecondaryBootClasspath,
144*795d594fSAndroid Build Coastguard Worker       200,
145*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kTimedOut, .exit_code = 3, .signal = 0});
146*795d594fSAndroid Build Coastguard Worker   metrics.SetBcpCompilationType(OdrMetrics::Stage::kSecondaryBootClasspath,
147*795d594fSAndroid Build Coastguard Worker                                 OdrMetrics::BcpCompilationType::kPrimaryAndMainline);
148*795d594fSAndroid Build Coastguard Worker   OdrMetricsRecord record = metrics.ToRecord();
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_compilation_millis, 100);
151*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.status, ExecResult::Status::kExited);
152*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.exit_code, 0);
153*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.signal, 0);
154*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_compilation_type,
155*795d594fSAndroid Build Coastguard Worker             static_cast<int32_t>(OdrMetrics::BcpCompilationType::kMainline));
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_compilation_millis, 200);
158*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.status, ExecResult::Status::kTimedOut);
159*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.exit_code, 3);
160*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.signal, 0);
161*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_compilation_type,
162*795d594fSAndroid Build Coastguard Worker             static_cast<int32_t>(OdrMetrics::BcpCompilationType::kPrimaryAndMainline));
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_compilation_millis, 0);
165*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_dex2oat_result.status, kExecResultNotRun);
166*795d594fSAndroid Build Coastguard Worker }
167*795d594fSAndroid Build Coastguard Worker 
TEST_F(OdrMetricsTest,SystemServerResultWithValue)168*795d594fSAndroid Build Coastguard Worker TEST_F(OdrMetricsTest, SystemServerResultWithValue) {
169*795d594fSAndroid Build Coastguard Worker   OdrMetrics metrics(GetCacheDirectory(), GetMetricsFilePath());
170*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
171*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kPrimaryBootClasspath,
172*795d594fSAndroid Build Coastguard Worker       100,
173*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kExited, .exit_code = 0, .signal = 0});
174*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
175*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kSecondaryBootClasspath,
176*795d594fSAndroid Build Coastguard Worker       200,
177*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kTimedOut, .exit_code = 3, .signal = 0});
178*795d594fSAndroid Build Coastguard Worker   metrics.SetDex2OatResult(
179*795d594fSAndroid Build Coastguard Worker       OdrMetrics::Stage::kSystemServerClasspath,
180*795d594fSAndroid Build Coastguard Worker       300,
181*795d594fSAndroid Build Coastguard Worker       ExecResult{.status = ExecResult::Status::kSignaled, .exit_code = 2, .signal = 9});
182*795d594fSAndroid Build Coastguard Worker   OdrMetricsRecord record = metrics.ToRecord();
183*795d594fSAndroid Build Coastguard Worker 
184*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_compilation_millis, 100);
185*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.status, ExecResult::Status::kExited);
186*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.exit_code, 0);
187*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.primary_bcp_dex2oat_result.signal, 0);
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_compilation_millis, 200);
190*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.status, ExecResult::Status::kTimedOut);
191*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.exit_code, 3);
192*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.secondary_bcp_dex2oat_result.signal, 0);
193*795d594fSAndroid Build Coastguard Worker 
194*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_compilation_millis, 300);
195*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_dex2oat_result.status, ExecResult::Status::kSignaled);
196*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_dex2oat_result.exit_code, 2);
197*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(record.system_server_dex2oat_result.signal, 9);
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker }  // namespace odrefresh
201*795d594fSAndroid Build Coastguard Worker }  // namespace art
202