liburingutils: Add unit tests

Bug: 385143770
Test: IOUringSocketHandler_tests
Change-Id: I57de1b3bccee3e6e997786b9dd001a9cb7d625a5
Signed-off-by: Akilesh Kailash <akailash@google.com>
diff --git a/Android.bp b/Android.bp
index f625107..fa190bc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -9,7 +9,10 @@
         "src/IOUringSocketHandler.cpp",
     ],
 
-    cflags: ["-Werror"],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
 
     export_include_dirs: ["include"],
 
@@ -43,8 +46,8 @@
     ],
     static_libs: [
         "liburing",
-    ],
-    shared_libs: [
         "liburingutils",
+        "libbase",
+        "liblog",
     ],
 }
diff --git a/include/IOUringSocketHandler/IOUringSocketHandler.h b/include/IOUringSocketHandler/IOUringSocketHandler.h
index 226a5b2..6322ef0 100644
--- a/include/IOUringSocketHandler/IOUringSocketHandler.h
+++ b/include/IOUringSocketHandler/IOUringSocketHandler.h
@@ -60,7 +60,7 @@
 
     // Allocate 'num_buffers' of size 'buf_size'
     //
-    // num_buffers: The number of buffers to allocate.
+    // num_buffers: The number of buffers to allocate - Should be power of 2.
     // buf_size: The size of each buffer in bytes.
     //
     // This function allocates a set of buffers that will be used for I/O operations
diff --git a/src/IOUringSocketHandler.cpp b/src/IOUringSocketHandler.cpp
index 0c68281..253158b 100644
--- a/src/IOUringSocketHandler.cpp
+++ b/src/IOUringSocketHandler.cpp
@@ -115,6 +115,7 @@
 void IOUringSocketHandler::DeRegisterBuffers() {
     if (registered_buffers_) {
         io_uring_free_buf_ring(&mCtx->ring, br_, num_buffers_, bgid_);
+        registered_buffers_ = false;
     }
     buffers_.clear();
     num_buffers_ = 0;
diff --git a/src/IOUringSocketHandler_test.cpp b/src/IOUringSocketHandler_test.cpp
index 67361f6..bd352cf 100644
--- a/src/IOUringSocketHandler_test.cpp
+++ b/src/IOUringSocketHandler_test.cpp
@@ -20,12 +20,59 @@
 
 class IOUringSocketHandlerTest : public testing::Test {
 public:
-    void testIsIouringEnabled(bool expectedResult) {
-        EXPECT_EQ(IOUringSocketHandler::isIouringEnabled(), expectedResult);
+    bool IsIouringEnabled() {
+        return IOUringSocketHandler::isIouringEnabled();
     }
+
+protected:
+    std::unique_ptr<IOUringSocketHandler> handler_;
+    void InitializeHandler(int socket_fd = 1);
+    int queue_depth_ = 10;
 };
 
-TEST_F(IOUringSocketHandlerTest, ReturnsIouringNotEnabled) {
-    // TODO: b/385143770 - Change this behavior to check the OS version and Liburing version.
-    testIsIouringEnabled(false);
+void IOUringSocketHandlerTest::InitializeHandler(int socket_fd) {
+    handler_ = std::make_unique<IOUringSocketHandler>(socket_fd);
+}
+
+TEST_F(IOUringSocketHandlerTest, SetupIoUring) {
+    if (!IsIouringEnabled()) {
+        return;
+    }
+    InitializeHandler();
+    EXPECT_TRUE(handler_->SetupIoUring(queue_depth_));
+}
+
+TEST_F(IOUringSocketHandlerTest, AllocateAndRegisterBuffers) {
+    if (!IsIouringEnabled()) {
+        return;
+    }
+    InitializeHandler();
+    EXPECT_TRUE(handler_->SetupIoUring(queue_depth_));
+    EXPECT_TRUE(handler_->AllocateAndRegisterBuffers(8, 4096));
+}
+
+TEST_F(IOUringSocketHandlerTest, MultipleAllocateAndRegisterBuffers) {
+    if (!IsIouringEnabled()) {
+        return;
+    }
+    InitializeHandler();
+
+    EXPECT_TRUE(handler_->SetupIoUring(queue_depth_));
+
+    EXPECT_TRUE(handler_->AllocateAndRegisterBuffers(4, 4096));
+    handler_->DeRegisterBuffers();
+
+    EXPECT_TRUE(handler_->AllocateAndRegisterBuffers(2, 1024*1024L));
+    handler_->DeRegisterBuffers();
+
+    EXPECT_TRUE(handler_->AllocateAndRegisterBuffers(32, 1024));
+    handler_->DeRegisterBuffers();
+
+    // num_buffers should be power of 2
+    EXPECT_FALSE(handler_->AllocateAndRegisterBuffers(5, 4096));
+}
+
+int main(int argc, char** argv) {
+    ::testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
 }