1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker * Copyright 2017 Google LLC
3*14675a02SAndroid Build Coastguard Worker *
4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker *
8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker *
10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker */
16*14675a02SAndroid Build Coastguard Worker
17*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h"
18*14675a02SAndroid Build Coastguard Worker
19*14675a02SAndroid Build Coastguard Worker #include <stdio.h>
20*14675a02SAndroid Build Coastguard Worker
21*14675a02SAndroid Build Coastguard Worker #include <array>
22*14675a02SAndroid Build Coastguard Worker #include <memory>
23*14675a02SAndroid Build Coastguard Worker #include <string>
24*14675a02SAndroid Build Coastguard Worker #include <utility>
25*14675a02SAndroid Build Coastguard Worker
26*14675a02SAndroid Build Coastguard Worker #include "gmock/gmock.h"
27*14675a02SAndroid Build Coastguard Worker #include "gtest/gtest.h"
28*14675a02SAndroid Build Coastguard Worker #include "absl/base/log_severity.h"
29*14675a02SAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
30*14675a02SAndroid Build Coastguard Worker #include "fcp/base/base_name.h"
31*14675a02SAndroid Build Coastguard Worker
32*14675a02SAndroid Build Coastguard Worker namespace fcp {
33*14675a02SAndroid Build Coastguard Worker namespace {
34*14675a02SAndroid Build Coastguard Worker
35*14675a02SAndroid Build Coastguard Worker using ::testing::Eq;
36*14675a02SAndroid Build Coastguard Worker using ::testing::MatchesRegex;
37*14675a02SAndroid Build Coastguard Worker using ::testing::Not;
38*14675a02SAndroid Build Coastguard Worker
39*14675a02SAndroid Build Coastguard Worker MATCHER(IsOk, "") { return arg.ok(); }
40*14675a02SAndroid Build Coastguard Worker
41*14675a02SAndroid Build Coastguard Worker MATCHER_P(IsOkAndHolds, m, "") {
42*14675a02SAndroid Build Coastguard Worker return testing::ExplainMatchResult(IsOk(), arg, result_listener) &&
43*14675a02SAndroid Build Coastguard Worker testing::ExplainMatchResult(m, arg.value(), result_listener);
44*14675a02SAndroid Build Coastguard Worker }
45*14675a02SAndroid Build Coastguard Worker
46*14675a02SAndroid Build Coastguard Worker class BaremetalLogger final : public internal::Logger {
47*14675a02SAndroid Build Coastguard Worker public:
Log(const char * file,int line,LogSeverity severity,const char * message)48*14675a02SAndroid Build Coastguard Worker void Log(const char* file, int line, LogSeverity severity,
49*14675a02SAndroid Build Coastguard Worker const char* message) override {
50*14675a02SAndroid Build Coastguard Worker absl::FPrintF(stderr, "%c %s:%d %s\n",
51*14675a02SAndroid Build Coastguard Worker absl::LogSeverityName(static_cast<absl::LogSeverity>(
52*14675a02SAndroid Build Coastguard Worker static_cast<int>(severity)))[0],
53*14675a02SAndroid Build Coastguard Worker BaseName(file), line, message);
54*14675a02SAndroid Build Coastguard Worker }
55*14675a02SAndroid Build Coastguard Worker };
56*14675a02SAndroid Build Coastguard Worker
57*14675a02SAndroid Build Coastguard Worker class MonitoringTest : public ::testing::TestWithParam<bool> {
58*14675a02SAndroid Build Coastguard Worker public:
SetUp()59*14675a02SAndroid Build Coastguard Worker void SetUp() override {
60*14675a02SAndroid Build Coastguard Worker if (replace_logger_) {
61*14675a02SAndroid Build Coastguard Worker prev_logger_ = internal::logger();
62*14675a02SAndroid Build Coastguard Worker internal::set_logger(&logger_);
63*14675a02SAndroid Build Coastguard Worker }
64*14675a02SAndroid Build Coastguard Worker }
TearDown()65*14675a02SAndroid Build Coastguard Worker void TearDown() override {
66*14675a02SAndroid Build Coastguard Worker if (replace_logger_) {
67*14675a02SAndroid Build Coastguard Worker internal::set_logger(prev_logger_);
68*14675a02SAndroid Build Coastguard Worker }
69*14675a02SAndroid Build Coastguard Worker }
70*14675a02SAndroid Build Coastguard Worker
71*14675a02SAndroid Build Coastguard Worker private:
72*14675a02SAndroid Build Coastguard Worker const bool replace_logger_ = GetParam();
73*14675a02SAndroid Build Coastguard Worker internal::Logger* prev_logger_ = nullptr;
74*14675a02SAndroid Build Coastguard Worker BaremetalLogger logger_;
75*14675a02SAndroid Build Coastguard Worker };
76*14675a02SAndroid Build Coastguard Worker
77*14675a02SAndroid Build Coastguard Worker #ifdef FCP_BAREMETAL
78*14675a02SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Baremetal, MonitoringTest, testing::Values(true));
79*14675a02SAndroid Build Coastguard Worker #else
80*14675a02SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Base, MonitoringTest, testing::Values(false));
81*14675a02SAndroid Build Coastguard Worker #endif
82*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogInfo)83*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogInfo) {
84*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
85*14675a02SAndroid Build Coastguard Worker FCP_LOG(INFO) << "info log of something happening";
86*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
87*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("I.*info log of something happening\n"));
88*14675a02SAndroid Build Coastguard Worker }
89*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogWarning)90*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogWarning) {
91*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
92*14675a02SAndroid Build Coastguard Worker FCP_LOG(WARNING) << "warning log of something happening";
93*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
94*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("W.*warning log of something happening\n"));
95*14675a02SAndroid Build Coastguard Worker }
96*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogError)97*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogError) {
98*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
99*14675a02SAndroid Build Coastguard Worker FCP_LOG(ERROR) << "error log of something happening";
100*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
101*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("E.*error log of something happening\n"));
102*14675a02SAndroid Build Coastguard Worker }
103*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogFatal)104*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogFatal) {
105*14675a02SAndroid Build Coastguard Worker ASSERT_DEATH({ FCP_LOG(FATAL) << "fatal log"; }, "fatal log");
106*14675a02SAndroid Build Coastguard Worker }
107*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusBuilderLogInfo)108*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusBuilderLogInfo) {
109*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
110*14675a02SAndroid Build Coastguard Worker Status status = (FCP_STATUS(ABORTED) << "something happened").LogInfo();
111*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
112*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("I.*something happened\n"));
113*14675a02SAndroid Build Coastguard Worker }
114*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusBuilderLogWarning)115*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusBuilderLogWarning) {
116*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
117*14675a02SAndroid Build Coastguard Worker Status status = (FCP_STATUS(ABORTED) << "something happened").LogWarning();
118*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
119*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("W.*something happened\n"));
120*14675a02SAndroid Build Coastguard Worker }
121*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusBuilderLogError)122*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusBuilderLogError) {
123*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
124*14675a02SAndroid Build Coastguard Worker Status status = (FCP_STATUS(ABORTED) << "something happened").LogError();
125*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
126*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("E.*something happened\n"));
127*14675a02SAndroid Build Coastguard Worker }
128*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusBuilderLogFatal)129*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusBuilderLogFatal) {
130*14675a02SAndroid Build Coastguard Worker ASSERT_DEATH(
131*14675a02SAndroid Build Coastguard Worker {
132*14675a02SAndroid Build Coastguard Worker Status status =
133*14675a02SAndroid Build Coastguard Worker (FCP_STATUS(ABORTED) << "something happened").LogFatal();
134*14675a02SAndroid Build Coastguard Worker },
135*14675a02SAndroid Build Coastguard Worker "something happened");
136*14675a02SAndroid Build Coastguard Worker }
137*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogIfTrue)138*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogIfTrue) {
139*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
140*14675a02SAndroid Build Coastguard Worker FCP_LOG_IF(INFO, true) << "some log";
141*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
142*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(output, MatchesRegex("I.*some log\n"));
143*14675a02SAndroid Build Coastguard Worker }
144*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,LogIfFalse)145*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, LogIfFalse) {
146*14675a02SAndroid Build Coastguard Worker testing::internal::CaptureStderr();
147*14675a02SAndroid Build Coastguard Worker FCP_LOG_IF(INFO, false) << "some log";
148*14675a02SAndroid Build Coastguard Worker std::string output = testing::internal::GetCapturedStderr();
149*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(output, "");
150*14675a02SAndroid Build Coastguard Worker }
151*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,CheckSucceeds)152*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, CheckSucceeds) { FCP_CHECK(1 < 2); }
153*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,CheckFails)154*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, CheckFails) {
155*14675a02SAndroid Build Coastguard Worker ASSERT_DEATH({ FCP_CHECK(1 < 0); }, "Check failed: 1 < 0.");
156*14675a02SAndroid Build Coastguard Worker }
157*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusOr)158*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusOr) {
159*14675a02SAndroid Build Coastguard Worker StatusOr<int> default_constructed_status;
160*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(default_constructed_status.ok());
161*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(default_constructed_status.status().code(), UNKNOWN);
162*14675a02SAndroid Build Coastguard Worker
163*14675a02SAndroid Build Coastguard Worker StatusOr<int> fail_status = FCP_STATUS(ABORTED) << "operation aborted";
164*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(fail_status.ok());
165*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(fail_status.status().code(), ABORTED);
166*14675a02SAndroid Build Coastguard Worker // TODO(team): Port StatusIs matcher to avoid casting message(),
167*14675a02SAndroid Build Coastguard Worker // which is string_view, to std::string.
168*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(fail_status.status().message(),
169*14675a02SAndroid Build Coastguard Worker MatchesRegex(".*operation aborted"));
170*14675a02SAndroid Build Coastguard Worker }
171*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusOrCopyAssignment)172*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusOrCopyAssignment) {
173*14675a02SAndroid Build Coastguard Worker StatusOr<int> fail_status = FCP_STATUS(ABORTED) << "operation aborted";
174*14675a02SAndroid Build Coastguard Worker StatusOr<int> copy_of_fail_status(fail_status);
175*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(copy_of_fail_status.ok());
176*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(copy_of_fail_status.status().code(), ABORTED);
177*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(copy_of_fail_status.status().message(),
178*14675a02SAndroid Build Coastguard Worker MatchesRegex(".*operation aborted"));
179*14675a02SAndroid Build Coastguard Worker
180*14675a02SAndroid Build Coastguard Worker StatusOr<int> ok_status = 42;
181*14675a02SAndroid Build Coastguard Worker StatusOr<int> copy_of_ok_status(ok_status);
182*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(copy_of_ok_status, IsOkAndHolds(Eq(42)));
183*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(copy_of_ok_status.value(), 42);
184*14675a02SAndroid Build Coastguard Worker }
185*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusOrMoveAssignment)186*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusOrMoveAssignment) {
187*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> fail_status = FCP_STATUS(ABORTED)
188*14675a02SAndroid Build Coastguard Worker << "operation aborted";
189*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> moved_fail_status(
190*14675a02SAndroid Build Coastguard Worker std::move(fail_status));
191*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(moved_fail_status.ok());
192*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(moved_fail_status.status().code(), ABORTED);
193*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(moved_fail_status.status().message(),
194*14675a02SAndroid Build Coastguard Worker MatchesRegex(".*operation aborted"));
195*14675a02SAndroid Build Coastguard Worker
196*14675a02SAndroid Build Coastguard Worker auto value = std::make_unique<std::string>("foobar");
197*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> ok_status = std::move(value);
198*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> moved_ok_status(std::move(ok_status));
199*14675a02SAndroid Build Coastguard Worker ASSERT_TRUE(moved_ok_status.ok());
200*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(*moved_ok_status.value(), "foobar");
201*14675a02SAndroid Build Coastguard Worker }
202*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusOrCopying)203*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusOrCopying) {
204*14675a02SAndroid Build Coastguard Worker StatusOr<int> fail_status = FCP_STATUS(ABORTED) << "operation aborted";
205*14675a02SAndroid Build Coastguard Worker StatusOr<int> copy_of_status = fail_status;
206*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(copy_of_status.ok());
207*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(copy_of_status.status().code(), ABORTED);
208*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(copy_of_status.status().message(),
209*14675a02SAndroid Build Coastguard Worker MatchesRegex(".*operation aborted"));
210*14675a02SAndroid Build Coastguard Worker
211*14675a02SAndroid Build Coastguard Worker StatusOr<int> ok_status = 42;
212*14675a02SAndroid Build Coastguard Worker copy_of_status = ok_status;
213*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(copy_of_status, IsOkAndHolds(Eq(42)));
214*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(copy_of_status.value(), 42);
215*14675a02SAndroid Build Coastguard Worker }
216*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusOrMoving)217*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusOrMoving) {
218*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> fail_status = FCP_STATUS(ABORTED)
219*14675a02SAndroid Build Coastguard Worker << "operation aborted";
220*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> moved_status = std::move(fail_status);
221*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(moved_status.ok());
222*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(moved_status.status().code(), ABORTED);
223*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(moved_status.status().message(),
224*14675a02SAndroid Build Coastguard Worker MatchesRegex(".*operation aborted"));
225*14675a02SAndroid Build Coastguard Worker
226*14675a02SAndroid Build Coastguard Worker auto value = std::make_unique<std::string>("foobar");
227*14675a02SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<std::string>> ok_status = std::move(value);
228*14675a02SAndroid Build Coastguard Worker moved_status = std::move(ok_status);
229*14675a02SAndroid Build Coastguard Worker ASSERT_TRUE(moved_status.ok());
230*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(*moved_status.value(), "foobar");
231*14675a02SAndroid Build Coastguard Worker }
232*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,StatusBuilder)233*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, StatusBuilder) {
234*14675a02SAndroid Build Coastguard Worker ASSERT_FALSE(FCP_STATUS(ABORTED).ok());
235*14675a02SAndroid Build Coastguard Worker ASSERT_EQ(FCP_STATUS(ABORTED).code(), ABORTED);
236*14675a02SAndroid Build Coastguard Worker }
237*14675a02SAndroid Build Coastguard Worker
TEST_P(MonitoringTest,FcpReturnIfError)238*14675a02SAndroid Build Coastguard Worker TEST_P(MonitoringTest, FcpReturnIfError) {
239*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(
240*14675a02SAndroid Build Coastguard Worker []() -> StatusOr<int> {
241*14675a02SAndroid Build Coastguard Worker Status fail_status = FCP_STATUS(ABORTED);
242*14675a02SAndroid Build Coastguard Worker FCP_RETURN_IF_ERROR(fail_status);
243*14675a02SAndroid Build Coastguard Worker return 0;
244*14675a02SAndroid Build Coastguard Worker }(),
245*14675a02SAndroid Build Coastguard Worker Not(IsOk()));
246*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(
247*14675a02SAndroid Build Coastguard Worker []() -> StatusOr<int> {
248*14675a02SAndroid Build Coastguard Worker FCP_RETURN_IF_ERROR(Status());
249*14675a02SAndroid Build Coastguard Worker return 0;
250*14675a02SAndroid Build Coastguard Worker }(),
251*14675a02SAndroid Build Coastguard Worker IsOkAndHolds(0));
252*14675a02SAndroid Build Coastguard Worker
253*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(
254*14675a02SAndroid Build Coastguard Worker []() -> StatusOr<int> {
255*14675a02SAndroid Build Coastguard Worker StatusOr<int> fail_statusor = FCP_STATUS(ABORTED);
256*14675a02SAndroid Build Coastguard Worker FCP_RETURN_IF_ERROR(fail_statusor);
257*14675a02SAndroid Build Coastguard Worker return 0;
258*14675a02SAndroid Build Coastguard Worker }(),
259*14675a02SAndroid Build Coastguard Worker Not(IsOk()));
260*14675a02SAndroid Build Coastguard Worker ASSERT_THAT(
261*14675a02SAndroid Build Coastguard Worker []() -> StatusOr<int> {
262*14675a02SAndroid Build Coastguard Worker FCP_RETURN_IF_ERROR(StatusOr<int>(0));
263*14675a02SAndroid Build Coastguard Worker return 0;
264*14675a02SAndroid Build Coastguard Worker }(),
265*14675a02SAndroid Build Coastguard Worker IsOkAndHolds(0));
266*14675a02SAndroid Build Coastguard Worker }
267*14675a02SAndroid Build Coastguard Worker
268*14675a02SAndroid Build Coastguard Worker } // namespace
269*14675a02SAndroid Build Coastguard Worker } // namespace fcp
270