/* * Copyright (C) 2024 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 #include #include #include #include using ::android::content::AttributionSourceState; using ::android::media::permission::AttrSourceIter::begin; using ::android::media::permission::AttrSourceIter::cbegin; using ::android::media::permission::AttrSourceIter::cend; using ::android::media::permission::AttrSourceIter::end; using ::android::media::permission::AttrSourceIter::ConstIter; using ::testing::ContainerEq; using ::testing::ElementsAreArray; using ::testing::Eq; using ::testing::Return; class AttrSourceIterTest : public ::testing::Test { public: AttrSourceIterTest() { mAttr.pid = 1; mAttr.uid = 1; AttributionSourceState next; next.pid = 2; next.uid = 2; AttributionSourceState nextnext; nextnext.pid = 3; nextnext.uid = 3; next.next = {nextnext}; mAttr.next = {next}; } protected: AttributionSourceState mAttr; }; TEST_F(AttrSourceIterTest, constIter) { const AttributionSourceState& ref = mAttr; std::vector mPids; std::transform(cbegin(ref), cend(), std::back_inserter(mPids), [](const auto& x) { return x.pid; }); EXPECT_THAT(mPids, ElementsAreArray({1, 2, 3})); } TEST_F(AttrSourceIterTest, nonConstIter) { AttributionSourceState expected; { expected.pid = 2; expected.uid = 1; AttributionSourceState expectedNext; expectedNext.pid = 4; expectedNext.uid = 2; AttributionSourceState expectedNextNext; expectedNextNext.pid = 6; expectedNextNext.uid = 3; expectedNext.next = {expectedNextNext}; expected.next = {expectedNext}; } std::for_each(begin(mAttr), end(), [](auto& x) { x.pid = x.pid * 2; }); EXPECT_THAT(mAttr, Eq(expected)); } TEST_F(AttrSourceIterTest, nonConstIterReferenceEquals) { const AttributionSourceState& ref = mAttr; std::vector attrs; std::transform(cbegin(ref), cend(), std::back_inserter(attrs), [](const auto& x) { return &x; }); std::for_each(begin(mAttr), end(), [](auto& x) { x.pid = x.pid * 2; }); std::vector attrsAfter; std::transform(cbegin(ref), cend(), std::back_inserter(attrsAfter), [](const auto& x) { return &x; }); EXPECT_THAT(attrs, ContainerEq(attrsAfter)); }