summaryrefslogtreecommitdiff
path: root/apexd/apex_database_test.cpp
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2019-02-07 11:44:04 -0800
committerAndreas Gampe <agampe@google.com>2019-02-07 11:55:38 -0800
commit7149e2f72831b0accfed797ebd74afdedbd18af7 (patch)
tree83e2c403cae1354f29627dd129776fc2150bfa86 /apexd/apex_database_test.cpp
parente9173d6dda7df975ad589d78d8a76752f123feba (diff)
Apexd: Make MountedApexData '<' an actual total order
The previous implementation was incorrect and violated Compare requirements for std::map. Add tests. Bug: 116593293 Test: atest apex_database_test Change-Id: Ic97061184559675985ebfa75afeb29a3f09e559a
Diffstat (limited to 'apexd/apex_database_test.cpp')
-rw-r--r--apexd/apex_database_test.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/apexd/apex_database_test.cpp b/apexd/apex_database_test.cpp
new file mode 100644
index 0000000..609e75c
--- /dev/null
+++ b/apexd/apex_database_test.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2019 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 <string>
+
+#include <android-base/macros.h>
+#include <gtest/gtest.h>
+
+#include "apex_database.h"
+
+namespace android {
+namespace apex {
+namespace {
+
+using MountedApexData = MountedApexDatabase::MountedApexData;
+
+TEST(MountedApexDataTest, LinearOrder) {
+ constexpr const char* kLoopName[] = {"loop1", "loop1", "loop2",
+ "loop2", "loop3", "loop3"};
+ constexpr const char* kPath[] = {"path1", "path2", "path1",
+ "path2", "path1", "path3"};
+ constexpr size_t kCount = arraysize(kLoopName);
+
+ MountedApexData data[kCount];
+ for (size_t i = 0; i < kCount; ++i) {
+ data[i] = MountedApexData(kLoopName[i], kPath[i]);
+ }
+
+ for (size_t i = 0; i < kCount; ++i) {
+ for (size_t j = i; j < kCount; ++j) {
+ if (i != j) {
+ EXPECT_TRUE(data[i] < data[j]) << i << " < " << j;
+ }
+ EXPECT_FALSE(data[j] < data[i]) << "! " << j << " < " << i;
+ }
+ }
+}
+
+size_t CountPackages(const MountedApexDatabase& db) {
+ size_t ret = 0;
+ db.ForallMountedApexes([&ret](const std::string& a ATTRIBUTE_UNUSED,
+ const MountedApexData& b ATTRIBUTE_UNUSED,
+ bool c ATTRIBUTE_UNUSED) { ++ret; });
+ return ret;
+}
+
+bool Contains(const MountedApexDatabase& db, const std::string& package,
+ const std::string& loop_name, const std::string& full_path) {
+ bool found = false;
+ db.ForallMountedApexes([&](const std::string& p, const MountedApexData& d,
+ bool b ATTRIBUTE_UNUSED) {
+ if (package == p && loop_name == d.loop_name && full_path == d.full_path) {
+ found = true;
+ }
+ });
+ return found;
+}
+
+bool ContainsPackage(const MountedApexDatabase& db, const std::string& package,
+ const std::string& loop_name,
+ const std::string& full_path) {
+ bool found = false;
+ db.ForallMountedApexes(
+ package, [&](const MountedApexData& d, bool b ATTRIBUTE_UNUSED) {
+ if (loop_name == d.loop_name && full_path == d.full_path) {
+ found = true;
+ }
+ });
+ return found;
+}
+
+TEST(ApexDatabaseTest, AddRemovedMountedApex) {
+ constexpr const char* kPackage = "package";
+ constexpr const char* kLoopName = "loop";
+ constexpr const char* kPath = "path";
+
+ MountedApexDatabase db;
+ ASSERT_EQ(CountPackages(db), 0u);
+
+ db.AddMountedApex(kPackage, false, kLoopName, kPath);
+ ASSERT_TRUE(Contains(db, kPackage, kLoopName, kPath));
+ ASSERT_TRUE(ContainsPackage(db, kPackage, kLoopName, kPath));
+
+ db.RemoveMountedApex(kPackage, kPath);
+ EXPECT_FALSE(Contains(db, kPackage, kLoopName, kPath));
+ EXPECT_FALSE(ContainsPackage(db, kPackage, kLoopName, kPath));
+}
+
+TEST(ApexDatabaseTest, MountMultiple) {
+ constexpr const char* kPackage[] = {"package", "package", "package",
+ "package"};
+ constexpr const char* kLoopName[] = {"loop", "loop", "loop3", "loop4"};
+ constexpr const char* kPath[] = {"path", "path2", "path", "path4"};
+
+ MountedApexDatabase db;
+ ASSERT_EQ(CountPackages(db), 0u);
+
+ for (size_t i = 0; i < arraysize(kPackage); ++i) {
+ db.AddMountedApex(kPackage[i], false, kLoopName[i], kPath[i]);
+ }
+
+ ASSERT_EQ(CountPackages(db), 4u);
+ for (size_t i = 0; i < arraysize(kPackage); ++i) {
+ ASSERT_TRUE(Contains(db, kPackage[i], kLoopName[i], kPath[i]));
+ ASSERT_TRUE(ContainsPackage(db, kPackage[i], kLoopName[i], kPath[i]));
+ }
+
+ db.RemoveMountedApex(kPackage[0], kPath[0]);
+ EXPECT_FALSE(Contains(db, kPackage[0], kLoopName[0], kPath[0]));
+ EXPECT_FALSE(ContainsPackage(db, kPackage[0], kLoopName[0], kPath[0]));
+ EXPECT_TRUE(Contains(db, kPackage[1], kLoopName[1], kPath[1]));
+ EXPECT_TRUE(ContainsPackage(db, kPackage[1], kLoopName[1], kPath[1]));
+ EXPECT_TRUE(Contains(db, kPackage[2], kLoopName[2], kPath[2]));
+ EXPECT_TRUE(ContainsPackage(db, kPackage[2], kLoopName[2], kPath[2]));
+ EXPECT_TRUE(Contains(db, kPackage[3], kLoopName[3], kPath[3]));
+ EXPECT_TRUE(ContainsPackage(db, kPackage[3], kLoopName[3], kPath[3]));
+}
+
+} // namespace
+} // namespace apex
+} // namespace android
+
+int main(int argc, char** argv) {
+ android::base::InitLogging(argv, &android::base::StderrLogger);
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}