Add unit tests for App group API 49/279549/2
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 11 Aug 2022 09:44:30 +0000 (18:44 +0900)
committerHwanKyu Jhun <h.jhun@samsung.com>
Thu, 11 Aug 2022 09:45:53 +0000 (09:45 +0000)
To refactor app group API, unit tests are added.
And, the parameter checks are added.

Change-Id: Id430b4b477096a6d9b6363f5d5d59b5617b0d211
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/app_group.c
test/unit_tests/test_app_group.cc [new file with mode: 0644]

index 9b57c92..6f0fc22 100644 (file)
@@ -47,10 +47,15 @@ API int aul_app_group_get_window(int pid)
        bundle *b;
        char buf[128];
 
+       if (pid < 1) {
+               _E("Invalid parameter");
+               return AUL_R_EINVAL;
+       }
+
        b = bundle_create();
        if (b == NULL) {
                _E("out of memory");
-               return -1;
+               return AUL_R_ENOMEM;
        }
 
        snprintf(buf, 128, "%d", pid);
@@ -67,11 +72,15 @@ API int aul_app_group_set_window(int wid)
        bundle *b;
        char buf[128];
 
-       b = bundle_create();
+       if (wid < 1) {
+               _E("Invalid parameter");
+               return AUL_R_EINVAL;
+       }
 
+       b = bundle_create();
        if (b == NULL) {
                _E("out of memory");
-               return -1;
+               return AUL_R_ENOMEM;
        }
 
        snprintf(buf, 128, "%d", wid);
@@ -89,6 +98,11 @@ API void aul_app_group_get_leader_pids(int *cnt, int **pids)
        app_pkt_t *pkt = NULL;
        int c;
 
+       if (cnt == NULL || pids == NULL) {
+               _E("Invalid parameter");
+               return;
+       }
+
        *cnt = 0;
        *pids = NULL;
        fd = aul_sock_send_raw(AUL_UTIL_PID, getuid(),
@@ -127,8 +141,12 @@ API void aul_app_group_get_group_pids(int leader_pid, int *cnt, int **pids)
        *cnt = 0;
        *pids = NULL;
 
-       b = bundle_create();
+       if (leader_pid < 1 || cnt == NULL || pids == NULL) {
+               _E("Invalid parameter");
+               return;
+       }
 
+       b = bundle_create();
        if (b == NULL) {
                _E("out of memory");
                return;
@@ -175,8 +193,12 @@ API int aul_app_group_get_leader_pid(int pid)
        bundle *b;
        char buf[128];
 
-       b = bundle_create();
+       if (pid < 1) {
+               _E("Invalid parameter");
+               return AUL_R_EINVAL;
+       }
 
+       b = bundle_create();
        if (b == NULL) {
                _E("out of memory");
                return -1;
@@ -224,8 +246,12 @@ API int aul_app_group_get_fg_flag(int pid)
        bundle *b;
        char buf[128];
 
-       b = bundle_create();
+       if (pid < 1) {
+               _E("Invalid parameter");
+               return AUL_R_EINVAL;
+       }
 
+       b = bundle_create();
        if (b == NULL) {
                _E("out of memory");
                return -1;
@@ -244,6 +270,11 @@ API void aul_app_group_lower(int *exit)
        int ret;
        unsigned char dummy[1] = { 0 };
 
+       if (exit == NULL) {
+               _E("Invalid parameter");
+               return;
+       }
+
        ret = aul_sock_send_raw(AUL_UTIL_PID, getuid(), APP_GROUP_LOWER,
                        dummy, 0, AUL_SOCK_NONE);
        if (ret < 0)
@@ -258,6 +289,11 @@ API void aul_app_group_get_idle_pids(int *cnt, int **pids)
        app_pkt_t *pkt = NULL;
        int c;
 
+       if (cnt == NULL || pids == NULL) {
+               _E("Invalid parameter");
+               return;
+       }
+
        *cnt = 0;
        *pids = NULL;
        fd = aul_sock_send_raw(AUL_UTIL_PID, getuid(),
@@ -293,7 +329,7 @@ API int aul_app_group_activate_below(const char *below_appid)
        bundle *b;
 
        if (below_appid == NULL)
-               return -1;
+               return AUL_R_EINVAL;
 
        b = bundle_create();
 
@@ -315,7 +351,7 @@ API int aul_app_group_activate_above(const char *above_appid)
        bundle *b;
 
        if (above_appid == NULL)
-               return -1;
+               return AUL_R_EINVAL;
 
        b = bundle_create();
 
@@ -337,7 +373,7 @@ API int aul_app_group_set_window_v2(const char *id, int wid)
        bundle *b;
        int ret;
 
-       if (!id) {
+       if (!id || wid < 0) {
                _E("Invalid parameter");
                return AUL_R_EINVAL;
        }
diff --git a/test/unit_tests/test_app_group.cc b/test/unit_tests/test_app_group.cc
new file mode 100644 (file)
index 0000000..593c00c
--- /dev/null
@@ -0,0 +1,910 @@
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * 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 <aul.h>
+#include <aul_app_group.h>
+#include <aul_cmd.h>
+#include <aul_sock.h>
+#include <gtest/gtest.h>
+#include <stdlib.h>
+
+#include <bundle_cpp.h>
+
+#include <iostream>
+#include <memory>
+
+#include "mock/mock_hook.h"
+#include "mock/socket_mock.h"
+#include "mock/test_fixture.h"
+#include "src/launch.h"
+
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::Return;
+using ::testing::SetArgPointee;
+using ::testing::Invoke;
+using ::testing::SaveArg;
+
+namespace {
+
+constexpr const char kBelowAppId[] = "org.tizen.below";
+constexpr const char kAboveAppId[] = "org.tizen.above";
+constexpr const char kInstanceId[] = "hello@org.tizen.hello";
+constexpr const char kPkgId[] = "org.tizen.hello";
+constexpr const char kAppId[] = "org.tizen.hello";
+constexpr const int kWid = 128;
+constexpr const int kFgFlag = 1;
+constexpr const int kStatus = STATUS_VISIBLE;
+
+class Mocks : virtual public ::testing::NiceMock<SocketMock> {};
+
+}  // namespace
+
+class AppGroupTest : public TestFixture {
+ public:
+  AppGroupTest() : TestFixture(std::make_unique<::Mocks>()) {}
+
+  virtual void SetUp() {
+    if (!aul_is_initialized())
+      aul_launch_init(nullptr, nullptr);
+  }
+
+  virtual void TearDown() {
+    if (aul_is_initialized())
+      aul_launch_fini();
+  }
+
+  tizen_base::Bundle MakeAppGroupInfoBundle() {
+    return {
+      { AUL_K_INSTANCE_ID, kInstanceId },
+      { AUL_K_PID, std::to_string(getpid()) },
+      { AUL_K_APPID, kAppId },
+      { AUL_K_PKGID, kPkgId },
+      { AUL_K_WID, std::to_string(kWid) },
+      { AUL_K_FG_FLAG, std::to_string(kFgFlag) },
+      { AUL_K_STATUS, std::to_string(kStatus) }
+    };
+  }
+
+  std::shared_ptr<app_pkt_t> MakePacket(const std::vector<int>& pids) {
+    app_pkt_t* pkt =
+        static_cast<app_pkt_t*>(
+            calloc(1, sizeof(app_pkt_t) + pids.size() * sizeof(int)));
+    if (pkt == nullptr)
+      return nullptr;
+
+    pkt->opt = AUL_SOCK_NONE;
+    pkt->cmd = APP_GET_INFO_OK;
+    pkt->len = pids.size() * sizeof(int);
+    memcpy(pkt->data, pids.data(), pids.size() * sizeof(int));
+    return std::shared_ptr<app_pkt_t>(pkt, free);
+
+  }
+
+  std::shared_ptr<app_pkt_t> MakePacket(tizen_base::Bundle b) {
+    auto raw = b.ToRaw();
+    app_pkt_t* pkt =
+        static_cast<app_pkt_t*>(calloc(1, sizeof(app_pkt_t) + raw.second));
+    if (pkt == nullptr)
+      return nullptr;
+
+    pkt->opt = AUL_SOCK_BUNDLE;
+    pkt->cmd = APP_GET_INFO_OK;
+    pkt->len = raw.second;
+    memcpy(pkt->data, raw.first.get(), raw.second);
+
+    return std::shared_ptr<app_pkt_t>(pkt, free);
+  }
+
+  bool touched_ = false;
+};
+
+TEST_F(AppGroupTest, aul_app_group_get_window_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = kWid;
+        memcpy(buf, &ret, sizeof(int));
+        return n;
+      }));
+
+  int ret = aul_app_group_get_window(getpid());
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, kWid);
+  EXPECT_EQ(cmd, APP_GROUP_GET_WINDOW);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_PID), std::to_string(getpid()));
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_window_N) {
+  int ret = aul_app_group_get_window(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_set_window_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+
+  int ret = aul_app_group_set_window(kWid);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_SET_WINDOW);
+  EXPECT_EQ(opt, (AUL_SOCK_NOREPLY | AUL_SOCK_BUNDLE));
+  EXPECT_EQ(b.GetString(AUL_K_WID), std::to_string(kWid));
+}
+
+TEST_F(AppGroupTest, aul_app_group_set_window_N) {
+  int ret = aul_app_group_set_window(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_leader_pids_P) {
+  int cmd = -1;
+  int opt = -1;
+  std::vector<int> pids { 101, 103 };
+  auto pkt = MakePacket(pids);
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(2)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  int cnt = -1;
+  int* leader_pids = nullptr;
+  aul_app_group_get_leader_pids(&cnt, &leader_pids);
+  EXPECT_NE(leader_pids, nullptr);
+  auto leader_pids_auto = std::unique_ptr<int, decltype(std::free)*>(
+      leader_pids, std::free);
+
+  EXPECT_EQ(cmd, APP_GROUP_GET_LEADER_PIDS);
+  EXPECT_EQ(opt, AUL_SOCK_ASYNC);
+  EXPECT_EQ(cnt, 2);
+  EXPECT_EQ(leader_pids[0], pids[0]);
+  EXPECT_EQ(leader_pids[1], pids[1]);
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_group_pids_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+  std::vector<int> pids { 201, 203, 205 };
+  auto pkt = MakePacket(pids);
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(2)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  int cnt = -1;
+  int* group_pids = nullptr;
+  aul_app_group_get_group_pids(getpid(), &cnt, &group_pids);
+  EXPECT_NE(group_pids, nullptr);
+  auto group_pids_auto = std::unique_ptr<int, decltype(std::free)*>(
+      group_pids, std::free);
+
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(cmd, APP_GROUP_GET_GROUP_PIDS);
+  EXPECT_EQ(opt, (AUL_SOCK_BUNDLE | AUL_SOCK_ASYNC));
+  EXPECT_EQ(b.GetString(AUL_K_LEADER_PID), std::to_string(getpid()));
+  EXPECT_EQ(cnt, 3);
+  EXPECT_EQ(group_pids[0], pids[0]);
+  EXPECT_EQ(group_pids[1], pids[1]);
+  EXPECT_EQ(group_pids[2], pids[2]);
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_leader_pid_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = 301;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int leader_pid = aul_app_group_get_leader_pid(getpid());
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(leader_pid, 301);
+  EXPECT_EQ(cmd, APP_GROUP_GET_LEADER_PID);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_PID), std::to_string(getpid()));
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_leader_pid_N) {
+  int ret = aul_app_group_get_leader_pid(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_clear_top_P) {
+  int cmd = -1;
+  int opt = -1;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = AUL_R_OK;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int ret = aul_app_group_clear_top();
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_CLEAR_TOP);
+  EXPECT_EQ(opt, AUL_SOCK_NONE);
+}
+
+TEST_F(AppGroupTest, aul_app_group_is_top_P) {
+  std::vector<int> pids { 201, 203, getpid() };
+  auto pkt = MakePacket(pids);
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(3)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = 201;
+        memcpy(buf, &ret, n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  int ret = aul_app_group_is_top();
+  EXPECT_EQ(ret, 1);
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_fg_flag_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = 1;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int fg_flag = aul_app_group_get_fg_flag(getpid());
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(fg_flag, 1);
+  EXPECT_EQ(cmd, APP_GROUP_GET_FG);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_PID), std::to_string(getpid()));
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_fg_flag_N) {
+  int ret = aul_app_group_get_fg_flag(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_lower_P) {
+  int cmd = -1;
+  int opt = -1;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = 1;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int exit = 0;
+  aul_app_group_lower(&exit);
+  EXPECT_EQ(exit, 1);
+  EXPECT_EQ(cmd, APP_GROUP_LOWER);
+  EXPECT_EQ(opt, AUL_SOCK_NONE);
+}
+
+TEST_F(AppGroupTest, aul_app_group_get_idle_pids_P) {
+  int cmd = -1;
+  int opt = -1;
+  std::vector<int> pids { 501, 503, 505 };
+  auto pkt = MakePacket(pids);
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(2)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  int cnt = -1;
+  int* idle_pids = nullptr;
+  aul_app_group_get_idle_pids(&cnt, &idle_pids);
+  EXPECT_NE(idle_pids, nullptr);
+  auto idle_pids_auto = std::unique_ptr<int, decltype(std::free)*>(
+      idle_pids, std::free);
+
+  EXPECT_EQ(cmd, APP_GROUP_GET_IDLE_PIDS);
+  EXPECT_EQ(opt, AUL_SOCK_ASYNC);
+  EXPECT_EQ(cnt, 3);
+  EXPECT_EQ(idle_pids[0], pids[0]);
+  EXPECT_EQ(idle_pids[1], pids[1]);
+  EXPECT_EQ(idle_pids[2], pids[2]);
+}
+
+TEST_F(AppGroupTest, aul_app_group_activate_below_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = AUL_R_OK;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int ret = aul_app_group_activate_below(kBelowAppId);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_ACTIVATE_BELOW);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_APPID), kBelowAppId);
+}
+
+TEST_F(AppGroupTest, aul_app_group_activate_below_N) {
+  int ret = aul_app_group_activate_below(nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_activate_above_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = AUL_R_OK;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  int ret = aul_app_group_activate_above(kAboveAppId);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_ACTIVATE_ABOVE);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_APPID), kAboveAppId);
+}
+
+TEST_F(AppGroupTest, aul_app_group_activate_above_N) {
+  int ret = aul_app_group_activate_above(nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_set_window_v2_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+
+  int ret = aul_app_group_set_window_v2(kInstanceId, kWid);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_SET_WINDOW_V2);
+  EXPECT_EQ(opt, (AUL_SOCK_BUNDLE | AUL_SOCK_NOREPLY));
+  EXPECT_EQ(b.GetString(AUL_K_INSTANCE_ID), kInstanceId);
+  EXPECT_EQ(b.GetString(AUL_K_WID), std::to_string(kWid));
+}
+
+TEST_F(AppGroupTest, aul_app_group_set_window_v2_N) {
+  int ret = aul_app_group_set_window_v2(kInstanceId, -1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+
+  ret = aul_app_group_set_window_v2(nullptr, 128);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_lower_v2_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int ret = 1;
+        memcpy(buf, &ret, n);
+        return n;
+      }));
+
+  bool exit = false;
+  int ret = aul_app_group_lower_v2(kInstanceId, &exit);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(exit, true);
+  EXPECT_EQ(cmd, APP_GROUP_LOWER_V2);
+  EXPECT_EQ(opt, AUL_SOCK_BUNDLE);
+  EXPECT_EQ(b.GetString(AUL_K_INSTANCE_ID), kInstanceId);
+}
+
+TEST_F(AppGroupTest, aul_app_group_lower_v2_N) {
+  int ret = aul_app_group_lower_v2(kInstanceId, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+
+  bool exit;
+  ret = aul_app_group_lower_v2(nullptr, &exit);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_leader_ids_P) {
+  int cmd = -1;
+  int opt = -1;
+  std::vector<std::string> ids = { kInstanceId };
+  tizen_base::Bundle b;
+  b.Add(AUL_K_LEADER_IDS, ids);
+  auto pkt = MakePacket(std::move(b));
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(2)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  touched_ = false;
+  int ret = aul_app_group_foreach_leader_ids(
+      [](const char* appid, void* user_data) {
+        if (strcmp(appid, kInstanceId) == 0) {
+          auto* test = static_cast<AppGroupTest*>(user_data);
+          test->touched_ = true;
+        }
+      }, this);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_GET_LEADER_IDS);
+  EXPECT_EQ(opt, AUL_SOCK_ASYNC);
+  EXPECT_EQ(touched_, true);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_leader_ids_N) {
+  int ret = aul_app_group_foreach_leader_ids(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_group_info_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+  auto pkt = MakePacket(MakeAppGroupInfoBundle());
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(3)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int count = 1;
+        memcpy(buf, &count, n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  touched_ = false;
+  int ret = aul_app_group_foreach_group_info(kInstanceId,
+      [](aul_app_group_info_h info, void* user_data) {
+        const char* id = nullptr;
+        aul_app_group_info_get_id(info, &id);
+
+        pid_t pid = -1;
+        aul_app_group_info_get_pid(info, &pid);
+
+        const char* appid = nullptr;
+        aul_app_group_info_get_appid(info, &appid);
+
+        const char* pkgid = nullptr;
+        aul_app_group_info_get_pkgid(info, &pkgid);
+
+        int wid = -1;
+        aul_app_group_info_get_window(info, &wid);
+
+        bool fg_flag = false;
+        aul_app_group_info_get_fg_flag(info, &fg_flag);
+
+        int status = -1;
+        aul_app_group_info_get_status(info, &status);
+
+        if (id && strcmp(id, kInstanceId) == 0 &&
+            pid == getpid() &&
+            appid && strcmp(appid, kAppId) == 0 &&
+            pkgid && strcmp(pkgid, kPkgId) == 0 &&
+            wid == kWid &&
+            fg_flag == true &&
+            status == STATUS_VISIBLE) {
+          auto* test = static_cast<AppGroupTest*>(user_data);
+          test->touched_ = true;
+        }
+      }, this);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_GET_GROUP_INFO);
+  EXPECT_EQ(opt, (AUL_SOCK_BUNDLE | AUL_SOCK_ASYNC));
+  EXPECT_EQ(touched_, true);
+  EXPECT_EQ(b.GetString(AUL_K_LEADER_ID), kInstanceId);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_group_info_N) {
+  int ret = aul_app_group_foreach_group_info(kInstanceId, nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+
+  ret = aul_app_group_foreach_group_info(nullptr,
+      [](aul_app_group_info_h info, void* user_data) {
+      }, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_idle_info_P) {
+  int cmd = -1;
+  int opt = -1;
+  auto pkt = MakePacket(MakeAppGroupInfoBundle());
+  EXPECT_NE(pkt, nullptr);
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        return n;
+      }));
+  EXPECT_CALL(GetMock<SocketMock>(), recv(_, _, _, _))
+      .Times(3)
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        int count = 1;
+        memcpy(buf, &count, n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt.get(), n);
+        return n;
+      }))
+      .WillOnce(Invoke([&](int fd, void* buf, size_t n, int flags) -> ssize_t {
+        memcpy(buf, pkt->data, n);
+        return n;
+      }));
+
+  touched_ = false;
+  int ret = aul_app_group_foreach_idle_info(
+      [](aul_app_group_info_h info, void* user_data) {
+        const char* id = nullptr;
+        aul_app_group_info_get_id(info, &id);
+        if (id && strcmp(id, kInstanceId) == 0) {
+          auto* test = static_cast<AppGroupTest*>(user_data);
+          test->touched_ = true;
+        }
+      }, this);
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_GET_IDLE_INFO);
+  EXPECT_EQ(opt, AUL_SOCK_ASYNC);
+  EXPECT_EQ(touched_, true);
+}
+
+TEST_F(AppGroupTest, aul_app_group_foreach_idle_info_N) {
+  int ret = aul_app_group_foreach_idle_info(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_id_N) {
+  int ret = aul_app_group_info_get_id(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_pid_N) {
+  int ret = aul_app_group_info_get_pid(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_appid_N) {
+  int ret = aul_app_group_info_get_appid(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_pkgid_N) {
+  int ret = aul_app_group_info_get_pkgid(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_window_N) {
+  int ret = aul_app_group_info_get_window(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_fg_flag_N) {
+  int ret = aul_app_group_info_get_fg_flag(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_info_get_status_N) {
+  int ret = aul_app_group_info_get_status(nullptr, nullptr);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_add_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+
+  int ret = aul_app_group_add(kWid);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_ADD);
+  EXPECT_EQ(opt, (AUL_SOCK_BUNDLE | AUL_SOCK_NOREPLY));
+  EXPECT_EQ(b.GetString(AUL_K_WID), std::to_string(kWid));
+}
+
+TEST_F(AppGroupTest, aul_app_group_add_N) {
+  int ret = aul_app_group_add(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}
+
+TEST_F(AppGroupTest, aul_app_group_remove_P) {
+  int cmd = -1;
+  int opt = -1;
+  bundle* kb = nullptr;
+
+  EXPECT_CALL(GetMock<SocketMock>(), send(_, _, _, _))
+      .Times(1)
+      .WillOnce(Invoke([&](int fd, const void* buf, size_t n, int flags)
+          -> ssize_t {
+        const app_pkt_t* pkt = reinterpret_cast<const app_pkt_t*>(buf);
+        cmd = pkt->cmd;
+        opt = pkt->opt;
+        kb = bundle_decode(pkt->data, pkt->len);
+        return n;
+      }));
+
+  int ret = aul_app_group_remove(kWid);
+  EXPECT_NE(kb, nullptr);
+  tizen_base::Bundle b(kb, false, true);
+
+  EXPECT_EQ(ret, AUL_R_OK);
+  EXPECT_EQ(cmd, APP_GROUP_REMOVE);
+  EXPECT_EQ(opt, (AUL_SOCK_BUNDLE | AUL_SOCK_NOREPLY));
+  EXPECT_EQ(b.GetString(AUL_K_WID), std::to_string(kWid));
+}
+
+TEST_F(AppGroupTest, aul_app_group_remove_N) {
+  int ret = aul_app_group_remove(-1);
+  EXPECT_EQ(ret, AUL_R_EINVAL);
+}