1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Worker #include <memory>
18*d57664e9SAndroid Build Coastguard Worker #include <type_traits>
19*d57664e9SAndroid Build Coastguard Worker #include <utility>
20*d57664e9SAndroid Build Coastguard Worker
21*d57664e9SAndroid Build Coastguard Worker #include "gmock/gmock.h"
22*d57664e9SAndroid Build Coastguard Worker #include "gtest/gtest.h"
23*d57664e9SAndroid Build Coastguard Worker #include "idmap2/Result.h"
24*d57664e9SAndroid Build Coastguard Worker
25*d57664e9SAndroid Build Coastguard Worker namespace android::idmap2 {
26*d57664e9SAndroid Build Coastguard Worker
27*d57664e9SAndroid Build Coastguard Worker struct Container {
28*d57664e9SAndroid Build Coastguard Worker uint32_t value; // NOLINT(misc-non-private-member-variables-in-classes)
29*d57664e9SAndroid Build Coastguard Worker };
30*d57664e9SAndroid Build Coastguard Worker
31*d57664e9SAndroid Build Coastguard Worker // Tests: Error
32*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,ErrorTraits)33*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, ErrorTraits) {
34*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_constructible<Error>::value);
35*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_assignable<Error>::value);
36*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_copy_constructible<Error>::value);
37*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_copy_assignable<Error>::value);
38*d57664e9SAndroid Build Coastguard Worker }
39*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,ErrorCtorFormat)40*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, ErrorCtorFormat) {
41*d57664e9SAndroid Build Coastguard Worker Error e("%s=0x%08x", "resid", 0x7f010002);
42*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(e.GetMessage(), "resid=0x7f010002");
43*d57664e9SAndroid Build Coastguard Worker }
44*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,ErrorPropagateParent)45*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, ErrorPropagateParent) {
46*d57664e9SAndroid Build Coastguard Worker Error e1("foo");
47*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(e1.GetMessage(), "foo");
48*d57664e9SAndroid Build Coastguard Worker
49*d57664e9SAndroid Build Coastguard Worker Error e2(e1, "bar");
50*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(e2.GetMessage(), "foo -> bar");
51*d57664e9SAndroid Build Coastguard Worker
52*d57664e9SAndroid Build Coastguard Worker Error e3(e2); // NOLINT(performance-unnecessary-copy-initialization)
53*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(e3.GetMessage(), "foo -> bar");
54*d57664e9SAndroid Build Coastguard Worker
55*d57664e9SAndroid Build Coastguard Worker Error e4(e3, "%02d", 1);
56*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(e4.GetMessage(), "foo -> bar -> 01");
57*d57664e9SAndroid Build Coastguard Worker }
58*d57664e9SAndroid Build Coastguard Worker
59*d57664e9SAndroid Build Coastguard Worker // Tests: Result<T> member functions
60*d57664e9SAndroid Build Coastguard Worker
61*d57664e9SAndroid Build Coastguard Worker // Result(const Result&)
TEST(ResultTests,CopyConstructor)62*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, CopyConstructor) {
63*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r1(42U);
64*d57664e9SAndroid Build Coastguard Worker
65*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r2(r1);
66*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r2);
67*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r2, 42U);
68*d57664e9SAndroid Build Coastguard Worker
69*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r3 = r2;
70*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r3);
71*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r3, 42U);
72*d57664e9SAndroid Build Coastguard Worker }
73*d57664e9SAndroid Build Coastguard Worker
74*d57664e9SAndroid Build Coastguard Worker // Result(const T&)
TEST(ResultTests,Constructor)75*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, Constructor) {
76*d57664e9SAndroid Build Coastguard Worker uint32_t v = 42U;
77*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r1(v);
78*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
79*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r1, 42U);
80*d57664e9SAndroid Build Coastguard Worker
81*d57664e9SAndroid Build Coastguard Worker Error e("foo");
82*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r2(e);
83*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
84*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
85*d57664e9SAndroid Build Coastguard Worker }
86*d57664e9SAndroid Build Coastguard Worker
87*d57664e9SAndroid Build Coastguard Worker // Result(const T&&)
TEST(ResultTests,MoveConstructor)88*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, MoveConstructor) {
89*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r1(42U);
90*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
91*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r1, 42U);
92*d57664e9SAndroid Build Coastguard Worker
93*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r2(Error("foo"));
94*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
95*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
96*d57664e9SAndroid Build Coastguard Worker }
97*d57664e9SAndroid Build Coastguard Worker
98*d57664e9SAndroid Build Coastguard Worker // operator=
TEST(ResultTests,CopyAssignmentOperator)99*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, CopyAssignmentOperator) {
100*d57664e9SAndroid Build Coastguard Worker // note: 'Result<...> r2 = r1;' calls the copy ctor
101*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r1(42U);
102*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r2(0U);
103*d57664e9SAndroid Build Coastguard Worker r2 = r1;
104*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r2);
105*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r2, 42U);
106*d57664e9SAndroid Build Coastguard Worker
107*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r3(Error("foo"));
108*d57664e9SAndroid Build Coastguard Worker r2 = r3;
109*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
110*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
111*d57664e9SAndroid Build Coastguard Worker }
112*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,MoveAssignmentOperator)113*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, MoveAssignmentOperator) {
114*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r(0U);
115*d57664e9SAndroid Build Coastguard Worker r = Result<uint32_t>(42U);
116*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r);
117*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r, 42U);
118*d57664e9SAndroid Build Coastguard Worker
119*d57664e9SAndroid Build Coastguard Worker r = Result<uint32_t>(Error("foo"));
120*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r);
121*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r.GetErrorMessage(), "foo");
122*d57664e9SAndroid Build Coastguard Worker }
123*d57664e9SAndroid Build Coastguard Worker
124*d57664e9SAndroid Build Coastguard Worker // operator bool()
TEST(ResultTests,BoolOperator)125*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, BoolOperator) {
126*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r1(42U);
127*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
128*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r1, 42U);
129*d57664e9SAndroid Build Coastguard Worker
130*d57664e9SAndroid Build Coastguard Worker Result<uint32_t> r2(Error("foo"));
131*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
132*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
133*d57664e9SAndroid Build Coastguard Worker }
134*d57664e9SAndroid Build Coastguard Worker
135*d57664e9SAndroid Build Coastguard Worker // operator*
TEST(ResultTests,IndirectionOperator)136*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, IndirectionOperator) {
137*d57664e9SAndroid Build Coastguard Worker const Result<uint32_t> r1(42U);
138*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
139*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(*r1, 42U);
140*d57664e9SAndroid Build Coastguard Worker
141*d57664e9SAndroid Build Coastguard Worker const Result<Container> r2(Container{42U});
142*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r2);
143*d57664e9SAndroid Build Coastguard Worker const Container& c = *r2;
144*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(c.value, 42U);
145*d57664e9SAndroid Build Coastguard Worker
146*d57664e9SAndroid Build Coastguard Worker Result<Container> r3(Container{42U});
147*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r3);
148*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ((*r3).value, 42U);
149*d57664e9SAndroid Build Coastguard Worker (*r3).value = 0U;
150*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ((*r3).value, 0U);
151*d57664e9SAndroid Build Coastguard Worker }
152*d57664e9SAndroid Build Coastguard Worker
153*d57664e9SAndroid Build Coastguard Worker // operator->
TEST(ResultTests,DereferenceOperator)154*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, DereferenceOperator) {
155*d57664e9SAndroid Build Coastguard Worker const Result<Container> r1(Container{42U});
156*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
157*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r1->value, 42U);
158*d57664e9SAndroid Build Coastguard Worker
159*d57664e9SAndroid Build Coastguard Worker Result<Container> r2(Container{42U});
160*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r2);
161*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2->value, 42U);
162*d57664e9SAndroid Build Coastguard Worker r2->value = 0U;
163*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2->value, 0U);
164*d57664e9SAndroid Build Coastguard Worker }
165*d57664e9SAndroid Build Coastguard Worker
166*d57664e9SAndroid Build Coastguard Worker // Tests: intended use of Result<T>
167*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,ResultTraits)168*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, ResultTraits) {
169*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_constructible<Result<uint32_t>>::value);
170*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_assignable<Result<uint32_t>>::value);
171*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_copy_constructible<Result<uint32_t>>::value);
172*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_copy_assignable<Result<uint32_t>>::value);
173*d57664e9SAndroid Build Coastguard Worker }
174*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,UnitTypeResult)175*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, UnitTypeResult) {
176*d57664e9SAndroid Build Coastguard Worker Result<Unit> r(Unit{});
177*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r);
178*d57664e9SAndroid Build Coastguard Worker }
179*d57664e9SAndroid Build Coastguard Worker
180*d57664e9SAndroid Build Coastguard Worker struct RefCountData {
181*d57664e9SAndroid Build Coastguard Worker int ctor; // NOLINT(misc-non-private-member-variables-in-classes)
182*d57664e9SAndroid Build Coastguard Worker int copy_ctor; // NOLINT(misc-non-private-member-variables-in-classes)
183*d57664e9SAndroid Build Coastguard Worker int dtor; // NOLINT(misc-non-private-member-variables-in-classes)
184*d57664e9SAndroid Build Coastguard Worker int move; // NOLINT(misc-non-private-member-variables-in-classes)
185*d57664e9SAndroid Build Coastguard Worker };
186*d57664e9SAndroid Build Coastguard Worker
187*d57664e9SAndroid Build Coastguard Worker class RefCountContainer {
188*d57664e9SAndroid Build Coastguard Worker public:
RefCountContainer(RefCountData & data)189*d57664e9SAndroid Build Coastguard Worker explicit RefCountContainer(RefCountData& data) : data_(data) {
190*d57664e9SAndroid Build Coastguard Worker ++data_.ctor;
191*d57664e9SAndroid Build Coastguard Worker }
192*d57664e9SAndroid Build Coastguard Worker
193*d57664e9SAndroid Build Coastguard Worker RefCountContainer(RefCountContainer const&) = delete;
194*d57664e9SAndroid Build Coastguard Worker
RefCountContainer(RefCountContainer && rhs)195*d57664e9SAndroid Build Coastguard Worker RefCountContainer(RefCountContainer&& rhs) noexcept : data_(rhs.data_) {
196*d57664e9SAndroid Build Coastguard Worker ++data_.copy_ctor;
197*d57664e9SAndroid Build Coastguard Worker }
198*d57664e9SAndroid Build Coastguard Worker
199*d57664e9SAndroid Build Coastguard Worker RefCountContainer& operator=(RefCountContainer const&) = delete;
200*d57664e9SAndroid Build Coastguard Worker
operator =(RefCountContainer && rhs)201*d57664e9SAndroid Build Coastguard Worker RefCountContainer& operator=(RefCountContainer&& rhs) noexcept {
202*d57664e9SAndroid Build Coastguard Worker data_ = rhs.data_;
203*d57664e9SAndroid Build Coastguard Worker ++data_.move;
204*d57664e9SAndroid Build Coastguard Worker return *this;
205*d57664e9SAndroid Build Coastguard Worker }
206*d57664e9SAndroid Build Coastguard Worker
~RefCountContainer()207*d57664e9SAndroid Build Coastguard Worker ~RefCountContainer() {
208*d57664e9SAndroid Build Coastguard Worker ++data_.dtor;
209*d57664e9SAndroid Build Coastguard Worker }
210*d57664e9SAndroid Build Coastguard Worker
211*d57664e9SAndroid Build Coastguard Worker private:
212*d57664e9SAndroid Build Coastguard Worker RefCountData& data_;
213*d57664e9SAndroid Build Coastguard Worker };
214*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,ReferenceCount)215*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, ReferenceCount) {
216*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_constructible<RefCountContainer>::value);
217*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(std::is_move_assignable<RefCountContainer>::value);
218*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(std::is_copy_constructible<RefCountContainer>::value);
219*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(std::is_copy_assignable<RefCountContainer>::value);
220*d57664e9SAndroid Build Coastguard Worker
221*d57664e9SAndroid Build Coastguard Worker RefCountData rc{0, 0, 0, 0};
222*d57664e9SAndroid Build Coastguard Worker { Result<RefCountContainer> r(RefCountContainer{rc}); }
223*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(rc.ctor, 1);
224*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(rc.copy_ctor, 1);
225*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(rc.move, 0);
226*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(rc.dtor, 2);
227*d57664e9SAndroid Build Coastguard Worker }
228*d57664e9SAndroid Build Coastguard Worker
CreateContainer(bool succeed)229*d57664e9SAndroid Build Coastguard Worker Result<Container> CreateContainer(bool succeed) {
230*d57664e9SAndroid Build Coastguard Worker if (!succeed) {
231*d57664e9SAndroid Build Coastguard Worker return Error("foo");
232*d57664e9SAndroid Build Coastguard Worker }
233*d57664e9SAndroid Build Coastguard Worker return Container{42U};
234*d57664e9SAndroid Build Coastguard Worker }
235*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,FunctionReturn)236*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, FunctionReturn) {
237*d57664e9SAndroid Build Coastguard Worker auto r1 = CreateContainer(true);
238*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
239*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r1->value, 42U);
240*d57664e9SAndroid Build Coastguard Worker
241*d57664e9SAndroid Build Coastguard Worker auto r2 = CreateContainer(false);
242*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
243*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
244*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetError().GetMessage(), "foo");
245*d57664e9SAndroid Build Coastguard Worker }
246*d57664e9SAndroid Build Coastguard Worker
FailToCreateContainer()247*d57664e9SAndroid Build Coastguard Worker Result<Container> FailToCreateContainer() {
248*d57664e9SAndroid Build Coastguard Worker auto container = CreateContainer(false);
249*d57664e9SAndroid Build Coastguard Worker if (!container) {
250*d57664e9SAndroid Build Coastguard Worker return Error(container.GetError(), "bar");
251*d57664e9SAndroid Build Coastguard Worker }
252*d57664e9SAndroid Build Coastguard Worker return container;
253*d57664e9SAndroid Build Coastguard Worker }
254*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,CascadeError)255*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, CascadeError) {
256*d57664e9SAndroid Build Coastguard Worker auto container = FailToCreateContainer();
257*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(container);
258*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(container.GetErrorMessage(), "foo -> bar");
259*d57664e9SAndroid Build Coastguard Worker }
260*d57664e9SAndroid Build Coastguard Worker
261*d57664e9SAndroid Build Coastguard Worker struct NoCopyContainer {
262*d57664e9SAndroid Build Coastguard Worker uint32_t value = 0; // NOLINT(misc-non-private-member-variables-in-classes)
263*d57664e9SAndroid Build Coastguard Worker NoCopyContainer() = default;
264*d57664e9SAndroid Build Coastguard Worker NoCopyContainer(const NoCopyContainer&) = delete;
265*d57664e9SAndroid Build Coastguard Worker NoCopyContainer& operator=(const NoCopyContainer&) = delete;
266*d57664e9SAndroid Build Coastguard Worker };
267*d57664e9SAndroid Build Coastguard Worker
CreateNoCopyContainer(bool succeed)268*d57664e9SAndroid Build Coastguard Worker Result<std::unique_ptr<NoCopyContainer>> CreateNoCopyContainer(bool succeed) {
269*d57664e9SAndroid Build Coastguard Worker if (!succeed) {
270*d57664e9SAndroid Build Coastguard Worker return Error("foo");
271*d57664e9SAndroid Build Coastguard Worker }
272*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<NoCopyContainer> p(new NoCopyContainer{});
273*d57664e9SAndroid Build Coastguard Worker p->value = 42U;
274*d57664e9SAndroid Build Coastguard Worker return std::move(p);
275*d57664e9SAndroid Build Coastguard Worker }
276*d57664e9SAndroid Build Coastguard Worker
TEST(ResultTests,UniquePtr)277*d57664e9SAndroid Build Coastguard Worker TEST(ResultTests, UniquePtr) {
278*d57664e9SAndroid Build Coastguard Worker auto r1 = CreateNoCopyContainer(true);
279*d57664e9SAndroid Build Coastguard Worker ASSERT_TRUE(r1);
280*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ((*r1)->value, 42U);
281*d57664e9SAndroid Build Coastguard Worker (*r1)->value = 0U;
282*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ((*r1)->value, 0U);
283*d57664e9SAndroid Build Coastguard Worker
284*d57664e9SAndroid Build Coastguard Worker auto r2 = CreateNoCopyContainer(false);
285*d57664e9SAndroid Build Coastguard Worker ASSERT_FALSE(r2);
286*d57664e9SAndroid Build Coastguard Worker ASSERT_EQ(r2.GetErrorMessage(), "foo");
287*d57664e9SAndroid Build Coastguard Worker }
288*d57664e9SAndroid Build Coastguard Worker
289*d57664e9SAndroid Build Coastguard Worker } // namespace android::idmap2
290