summaryrefslogtreecommitdiff
path: root/init/epoll_test.cpp
diff options
context:
space:
mode:
authoralk3pInjection <webmaster@raspii.tech>2021-10-12 16:30:00 +0800
committeralk3pInjection <webmaster@raspii.tech>2021-10-12 16:30:00 +0800
commite133954adc84ad6faae8d80986a6a6291f1f94e8 (patch)
treec244bd262d86a8953cd2031a044863518006fc81 /init/epoll_test.cpp
parent2ef3b59442f291e6230eef14c81b906752acf748 (diff)
parent5ef7f7b23dac0f210fd2c60a04b41fa8da11d1dd (diff)
Merge remote-tracking branch 'upstream/lineage-18.1' into lineage-18.1lineage-18.1
* upstream/lineage-18.1: Use std::shared_ptr in Epoll's callback list. init: do not create dev.mnt. properties for emulated mounts Change-Id: I7384327c412f75ab3c9c62cb82640f9988702a03
Diffstat (limited to 'init/epoll_test.cpp')
-rw-r--r--init/epoll_test.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/init/epoll_test.cpp b/init/epoll_test.cpp
new file mode 100644
index 000000000..9236cd53e
--- /dev/null
+++ b/init/epoll_test.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2021 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 "epoll.h"
+
+#include <sys/unistd.h>
+
+#include <unordered_set>
+
+#include <android-base/file.h>
+#include <gtest/gtest.h>
+
+namespace android {
+namespace init {
+
+std::unordered_set<void*> sValidObjects;
+
+class CatchDtor final {
+ public:
+ CatchDtor() { sValidObjects.emplace(this); }
+ CatchDtor(const CatchDtor&) { sValidObjects.emplace(this); }
+ ~CatchDtor() {
+ auto iter = sValidObjects.find(this);
+ if (iter != sValidObjects.end()) {
+ sValidObjects.erase(iter);
+ }
+ }
+};
+
+TEST(epoll, UnregisterHandler) {
+ Epoll epoll;
+ ASSERT_RESULT_OK(epoll.Open());
+
+ int fds[2];
+ ASSERT_EQ(pipe(fds), 0);
+
+ CatchDtor catch_dtor;
+ bool handler_invoked;
+ auto handler = [&, catch_dtor]() -> void {
+ auto result = epoll.UnregisterHandler(fds[0]);
+ ASSERT_EQ(result.ok(), !handler_invoked);
+ handler_invoked = true;
+ ASSERT_NE(sValidObjects.find((void*)&catch_dtor), sValidObjects.end());
+ };
+
+ epoll.RegisterHandler(fds[0], std::move(handler));
+
+ uint8_t byte = 0xee;
+ ASSERT_TRUE(android::base::WriteFully(fds[1], &byte, sizeof(byte)));
+
+ auto results = epoll.Wait({});
+ ASSERT_RESULT_OK(results);
+ ASSERT_EQ(results->size(), size_t(1));
+
+ for (const auto& function : *results) {
+ (*function)();
+ (*function)();
+ }
+ ASSERT_TRUE(handler_invoked);
+}
+
+} // namespace init
+} // namespace android