utest: fix all failed tests and add new tests
[platform/core/uifw/libtdm.git] / utests / src / ut_tdm_pp.cpp
index d412e7f..8cd08bb 100644 (file)
@@ -3,6 +3,8 @@
  * Copyright 2016 Samsung Electronics co., Ltd. All Rights Reserved.
  *
  * Contact: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
+ * Contact: Andrii Sokolenko <a.sokolenko@samsung.com>
+ * Contact: Roman Marchenko <r.marchenko@samsung.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
 **************************************************************************/
 
 #include "gtest/gtest.h"
+#include "ut_common.h"
+#include "tdm.h"
+extern "C" {
+#include "tbm_bufmgr.h"
+#include "tbm_drm_helper.h"
+}
+
+#include <sys/epoll.h>
+#include <sys/timerfd.h>
+#include <list>
+#include <limits.h>
+
+#define SIZE_ALIGN(value, base) (((value) + ((base) - 1)) & ~((base) - 1))
+
+class TDMPPWithoutCreation : public testing::Test {
+protected:
+       tdm_display *dpy = NULL;
+       tbm_bufmgr bufmgr;
+       tdm_display_capability display_capability = (tdm_display_capability)0;
+       bool has_pp = false;
+       std::list<tbm_surface_h> buffers_list;
+
+       virtual void SetEnvs()
+       {
+               setenv("TDM_DLOG", "1", 1);
+               setenv("XDG_RUNTIME_DIR", "/run", 1);
+               setenv("TBM_DLOG", "1", 1);
+               setenv("TDM_DEBUG_MODULE", "all", 1);
+               setenv("TDM_DEBUG", "1", 1);
+               setenv("TBM_DISPLAY_SERVER", "1", 1);
+       }
 
-#include "tbm_stubs.h"
-#include "stub_pthread.h"
-#include "stub_stdlib.h"
-#include "stub_tdm_helper.h"
-#include "stub_backend.h"
-#include "stub_tdm_buffer.h"
-#include "stub_unistd.h"
-#include "stub_tdm_thread.h"
-#include "stub_tdm_helper.h"
-#include "stub_tdm_buffer.h"
-
-#include "tdm_pp.c"
-
-//local stubs for callbeck functions
-static int stub_pp_destroy_is_called = 0;
-static int stub_tdm_pp_done_handler_is_called;
-
-static void stub_pp_destroy(tdm_pp *pp)
-{
-       (void)pp;
+       virtual void UnsetEnvs()
+       {
+               unsetenv("TDM_DLOG");
+               unsetenv("XDG_RUNTIME_DIR");
+               unsetenv("TBM_DLOG");
+               unsetenv("TDM_DEBUG_MODULE");
+               unsetenv("TDM_DEBUG");
+               unsetenv("TBM_DISPLAY_SERVER");
+       }
 
-       stub_pp_destroy_is_called = 1;
-}
+       void SetUp(void)
+       {
+               tdm_error error = TDM_ERROR_NONE;
 
-static int stub_pp_set_done_handler_is_called = 0;
-static int stub_pp_set_done_handler_error = 0;
-static tdm_error stub_pp_set_done_handler(tdm_pp *pp, tdm_pp_done_handler func,
-                                                                void *user_data)
-{
-       (void)pp;
-       (void)func;
-       (void)user_data;
+               SetEnvs();
 
-       if (stub_pp_set_done_handler_error)
-               return TDM_ERROR_OPERATION_FAILED;
+               bufmgr = tbm_bufmgr_init(-1);
+               ASSERT_FALSE(bufmgr == NULL);
 
-       stub_pp_set_done_handler_is_called = 1;
-       return TDM_ERROR_NONE;
-}
+               dpy = tdm_display_init(&error);
+               ASSERT_TRUE(error == TDM_ERROR_NONE);
+               ASSERT_FALSE(dpy == NULL);
 
-static int stub_display_create_pp_is_called = 0;
-static int stub_display_create_pp_error = 0;
-static tdm_pp *stub_display_create_pp(tdm_backend_data *bdata, tdm_error *error)
-{
-       (void)bdata;
+               error = tdm_display_get_capabilities(dpy, &display_capability);
+#ifdef FAIL_ON_UNSUPPORTED
+               ASSERT_TRUE(display_capability & TDM_DISPLAY_CAPABILITY_PP);
+#endif
+               ASSERT_TRUE(error == TDM_ERROR_NONE);
 
-       if (stub_display_create_pp_error) {
-               if (error)
-                       *error = TDM_ERROR_OPERATION_FAILED;
-               return NULL;
+               if (display_capability & TDM_DISPLAY_CAPABILITY_PP)
+                       has_pp = true;
        }
-       stub_display_create_pp_is_called = 1;
-       static int backend_pp;
-       return &backend_pp;
-}
-
-static int stub_pp_attach_is_called = 0;
-static int stub_pp_attach_error = 0;
-tdm_error stub_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst)
-{
-       (void)pp;
-       (void)src;
-       (void)dst;
 
-       if (stub_pp_attach_error)
-               return TDM_ERROR_OPERATION_FAILED;
-
-       stub_pp_attach_is_called = 1;
-       return TDM_ERROR_NONE;
-}
+       void TearDown(void)
+       {
+               if (dpy)
+                       tdm_display_deinit(dpy);
+               if (bufmgr)
+                       tbm_bufmgr_deinit(bufmgr);
 
-static void stub_tdm_pp_done_handler(tdm_pp *pp, tbm_surface_h src,
-                                                                       tbm_surface_h dst, void *user_data)
-{
-       (void)pp;
-       (void)src;
-       (void)dst;
-       (void)user_data;
+               UnsetEnvs();
+       }
+};
+
+class TDMPP : public TDMPPWithoutCreation {
+protected:
+       tdm_pp *pp = NULL;
+       const tbm_format *formats = NULL;
+       int format_count = 0;
+       int min_w = 0;
+       int min_h = 0;
+       int max_w = 0;
+       int max_h = 0;
+       int preferred_align = 0;
+       int default_src_w = 128;
+       int default_src_h = 256;
+       int default_dst_w = 512;
+       int default_dst_h = 1024;
+
+       void SetUp(void)
+       {
+               tdm_error error;
+
+               ASSERT_NO_FATAL_FAILURE(TDMPPWithoutCreation::SetUp());
+
+               if (!has_pp)
+                       return;
+
+               pp = tdm_display_create_pp(dpy, &error);
+               ASSERT_NE(NULL, pp);
+               ASSERT_EQ(TDM_ERROR_NONE, error);
+
+               error =
+                       tdm_display_get_pp_available_formats(dpy, &formats, &format_count);
+               ASSERT_EQ(TDM_ERROR_NONE, error);
+               ASSERT_NE(NULL, formats);
+               ASSERT_GE(format_count, 0);
+
+               error =
+                               tdm_display_get_pp_available_size(dpy, &min_w, &min_h,
+                                                                                                 &max_w, &max_h, &preferred_align);
+               ASSERT_EQ(TDM_ERROR_NONE, error);
+               if (preferred_align > 0) {
+                       default_src_w = SIZE_ALIGN(default_src_w, preferred_align);
+                       default_src_h = SIZE_ALIGN(default_src_h, preferred_align);
+                       default_dst_w = SIZE_ALIGN(default_dst_w, preferred_align);
+                       default_dst_h = SIZE_ALIGN(default_dst_h, preferred_align);
+               }
+               if (min_w > default_src_w)
+                       default_src_w = min_w;
+               if (min_h > default_src_h)
+                       default_src_h = min_h;
+               if (max_w > 0 && max_w < default_dst_w)
+                       default_dst_w = max_w;
+               if (max_h > 0 && max_h < default_dst_h)
+                       default_dst_h = max_h;
+       }
 
-       stub_tdm_pp_done_handler_is_called = 1;
-}
+       void TearDown(void)
+       {
+               if (pp)
+                       tdm_pp_destroy(pp);
 
-static void _init_test()
-{
-       stub_tdm_buffer_init();
-       stub_tdm_helper_init();
-       stub_tdm_buffer_init();
-       stub_tdm_thread_init();
-       stub_unistd_init();
-       stub_pthread_init();
-       stub_backend_init();
-       stub_tbm_init();
-       stub_stdlib_init();
-       stub_pp_destroy_is_called = 0;
-       stub_pp_set_done_handler_is_called = 0;
-       stub_pp_set_done_handler_error = 0;
-       stub_display_create_pp_is_called = 0;
-       stub_pp_attach_is_called = 0;
-       stub_pp_attach_error = 0;
-       stub_tdm_pp_done_handler_is_called = 0;
-       stub_display_create_pp_error = 0;
-       tdm_debug_dump = TDM_DUMP_FLAG_PP;
-       tdm_debug_module = TDM_DEBUG_BUFFER;
-}
+               for (auto it = buffers_list.begin(); it != buffers_list.end(); ++it) {
+                       tbm_surface_destroy(*it);
+               }
 
-/* UNIT TESTS */
+               buffers_list.clear();
 
-/* tdm_pp_commit */
+               TDMPPWithoutCreation::TearDown();
+       }
 
-TEST(tdm_pp_commit, work_flow_success_3)
-{
-       tdm_error error = TDM_ERROR_OPERATION_FAILED;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-       tdm_pp_private_buffer b_1, b_2;
+       void UtGetPPInfoWithScale(tdm_info_pp *info)
+       {
+               memset((void *)info, 0, sizeof(tdm_info_pp));
+
+               info->src_config.size.h = default_src_w;
+               info->src_config.size.v = default_src_h;
+               info->src_config.pos.x = 0;
+               info->src_config.pos.y = 0;
+               info->src_config.pos.w = default_src_w;
+               info->src_config.pos.h = default_src_h;
+               info->src_config.format = formats[0];
+               info->dst_config.size.h = default_dst_w;
+               info->dst_config.size.v = default_dst_h;
+               info->dst_config.pos.x = 0;
+               info->dst_config.pos.y = 0;
+               info->dst_config.pos.w = default_dst_w;
+               info->dst_config.pos.h = default_dst_h;
+               info->dst_config.format = formats[0];
+       }
 
-       _init_test();
+       void UtGetPPInfoWithScaleAndTransform(tdm_info_pp *info)
+       {
+               UtGetPPInfoWithScale(info);
 
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_commit = pp_commit;
+               info->transform = TDM_TRANSFORM_180;
+       }
 
-       LIST_INITHEAD(&pp.pending_buffer_list);
-       LIST_INITHEAD(&pp.buffer_list);
+       void UtGetPPInfoWithWrongInfo(tdm_info_pp *info)
+       {
+               info->src_config.size.h = UINT_MAX;
+               info->src_config.size.v = UINT_MAX;
+               info->src_config.pos.x = 0;
+               info->src_config.pos.y = 0;
+               info->src_config.pos.w = UINT_MAX;
+               info->src_config.pos.h = UINT_MAX;
+               info->src_config.format = INT_MAX;
+               info->dst_config.size.h = UINT_MAX;
+               info->dst_config.size.v = UINT_MAX;
+               info->dst_config.pos.x = 0;
+               info->dst_config.pos.y = 0;
+               info->dst_config.pos.w = UINT_MAX;
+               info->dst_config.pos.h = UINT_MAX;
+               info->dst_config.format = INT_MAX;
+       }
 
-       LIST_ADD(&b_1.link, &pp.pending_buffer_list);
-       LIST_ADD(&b_2.link, &pp.pending_buffer_list);
+       tbm_surface_h
+       UtCreateBuffer(int w, int h, tbm_format format)
+       {
+               tbm_surface_h buffer;
 
+               buffer = tbm_surface_create(w, h, format);
+               if (buffer)
+                       buffers_list.push_back(buffer);
 
-       error = tdm_pp_commit(&pp);
+               return buffer;
+       }
+};
+
+void UtPpDoneHandler(tdm_pp *pp, tbm_surface_h src,
+                                                       tbm_surface_h dst, void *user_data);
+
+class TDMPPCommit : public TDMPP {
+public:
+       friend void UtPpDoneHandler(tdm_pp *pp, tbm_surface_h src,
+                                                               tbm_surface_h dst, void *user_data);
+private:
+       int epFd = -1;
+       int timerFd = -1;
+       int tdmFd = -1;
+       static const int timeLimitSec = 0;
+       static const int timeLimitNsec = 100000000;
+protected:
+       int utPpDoneHandlerSuccessCounter = 0;
+
+       void SetUp(void)
+       {
+               struct epoll_event ep;
+
+               ASSERT_NO_FATAL_FAILURE(TDMPP::SetUp());
+
+               epFd = epoll_create1(0);
+               ASSERT_TRUE(epFd != -1);
+
+               timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
+               ASSERT_TRUE(timerFd != -1);
+
+               memset(&ep, 0, sizeof ep);
+               ep.events |= EPOLLIN;
+               ep.data.fd = timerFd;
+               ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ep) == 0);
+
+               ASSERT_TRUE(tdm_display_get_fd(dpy, &tdmFd) == TDM_ERROR_NONE);
+
+               memset(&ep, 0, sizeof ep);
+               ep.events |= EPOLLIN;
+               ep.data.fd = tdmFd;
+               ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, tdmFd, &ep) == 0);
+       }
 
-       ASSERT_EQ(error, TDM_ERROR_NONE);
-       ASSERT_EQ(LIST_LENGTH(&pp.buffer_list), 2);
-}
+       void TearDown(void)
+       {
+               if (epFd)
+                       close(epFd);
+               if (timerFd)
+                       close(timerFd);
 
-//TEST(tdm_pp_commit, work_flow_success_2)
-//{
-//     tdm_error error = TDM_ERROR_NONE;
-//     tdm_error not_expected_error = TDM_ERROR_NONE;
-//     tdm_private_pp pp;
-//     tdm_private_display private_display;
-//     tdm_pp_private_buffer b_1, b_2;
-//
-//     _init_test();
-//
-//     pp.private_display = &private_display;
-//     private_display.func_pp.pp_commit = pp_commit;
-//     PP_COMMIT_ERROR = 1;
-//
-//     LIST_INITHEAD(&pp.pending_buffer_list);
-//     LIST_INITHEAD(&pp.buffer_list);
-//
-//     LIST_ADD(&b_1.link, &pp.pending_buffer_list);
-//     LIST_ADD(&b_2.link, &pp.pending_buffer_list);
-//
-//     error = tdm_pp_commit(&pp);
-//
-//     ASSERT_NE(error, not_expected_error);
-//     ASSERT_EQ(LIST_LENGTH(&pp.buffer_list), 0);
-//     ASSERT_EQ(stub_tdm_buffer_remove_release_handler_internal_count, 4);
-//     ASSERT_EQ(stub_tdm_buffer_unref_backend_count, 4);
-//}
-
-TEST(tdm_pp_commit, work_flow_success_1)
-{
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_NOT_IMPLEMENTED;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
+               TDMPP::TearDown();
+       }
 
-       _init_test();
+       void UtHandlePPEvent(int num_attached_buffers)
+       {
+               struct itimerspec its;
+               int count;
+               struct epoll_event ep_event[2];
+
+               if (utPpDoneHandlerSuccessCounter == num_attached_buffers)
+                       return;
+
+               its.it_interval.tv_sec = 0;
+               its.it_interval.tv_nsec = 0;
+               its.it_value.tv_sec = timeLimitSec;
+               its.it_value.tv_nsec = timeLimitNsec;
+
+               ASSERT_TRUE(timerfd_settime(timerFd, 0, &its, NULL) == 0);
+
+               while (1) {
+                       count = epoll_wait(epFd, ep_event, sizeof(ep_event), -1);
+                       ASSERT_TRUE(count >= 0);
+
+                       for (int i = 0; i < count; i++) {
+                               if (ep_event[i].data.fd == timerFd) {
+                                       return;
+                               } else {
+                                       ASSERT_TRUE(tdm_display_handle_events(dpy) == TDM_ERROR_NONE);
+                                       if (utPpDoneHandlerSuccessCounter == num_attached_buffers)
+                                               return;
+                               }
+                       }
+               }
+       }
 
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_commit = NULL;
+       int UtPrepareToPP(tdm_info_pp *info)
+       {
+               tdm_error error;
+               tbm_surface_h src_buf, dst_buf;
+
+               error = tdm_pp_set_done_handler(pp, UtPpDoneHandler, this);
+               EXPECT_EQ(TDM_ERROR_NONE, error);
+               if (error != TDM_ERROR_NONE)
+                       return -1;
+
+               error = tdm_pp_set_info(pp, info);
+               EXPECT_EQ(TDM_ERROR_NONE, error);
+               if (error != TDM_ERROR_NONE)
+                       return -1;
+
+               src_buf = UtCreateBuffer(info->src_config.pos.w, info->src_config.pos.h,
+                                                                info->src_config.format);
+               EXPECT_NE(NULL, src_buf);
+               if (!src_buf)
+                       return -1;
+
+               dst_buf = UtCreateBuffer(info->dst_config.pos.w, info->dst_config.pos.h,
+                                                                info->dst_config.format);
+               EXPECT_NE(NULL, dst_buf);
+               if (!dst_buf)
+                       return -1;
+
+               error = tdm_pp_attach(pp, src_buf, dst_buf);
+               EXPECT_EQ(TDM_ERROR_NONE, error);
+               if (error != TDM_ERROR_NONE)
+                       return -1;
+
+               return 0;
+       }
 
-       error = tdm_pp_commit(&pp);
+       int UtPrepareToPPWithScale()
+       {
+               tdm_info_pp info = {0};
 
-       ASSERT_EQ(error, expected_error);
-}
+               UtGetPPInfoWithScale(&info);
 
-TEST(tdm_pp_commit, null_ptr_fail_1)
-{
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
+               return UtPrepareToPP(&info);
+       }
 
-       _init_test();
+       int UtPrepareToPPWithScaleAndTransform()
+       {
+               tdm_info_pp info = {0};
 
-       error = tdm_pp_commit(NULL);
+               UtGetPPInfoWithScaleAndTransform(&info);
 
-       ASSERT_EQ(error, expected_error);
-}
+               return UtPrepareToPP(&info);
+       }
 
-/* tdm_pp_attach */
+       int UtPrepareToPPWithWrongInfo()
+       {
+               tdm_info_pp info = {0};
+               tdm_error error;
+               int ret;
 
-TEST(tdm_pp_attach, error_pp_attach)
-{
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_private_pp private_pp;
-       tdm_private_display private_display;
-       tdm_backend_module module;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
+               UtGetPPInfoWithScale(&info);
 
-       _init_test();
+               ret = UtPrepareToPP(&info);
+               if (ret < 0)
+                       return ret;
 
-       LIST_INITHEAD(&private_display.pp_list);
-       LIST_ADDTAIL(&private_pp.link, &private_display.pp_list);
-       private_display.module_data = &module;
-       private_display.func_pp.pp_attach = stub_pp_attach;
-       private_display.caps_pp.max_attach_count = 3;
-       module.abi_version  = 0x00010002;
+               UtGetPPInfoWithWrongInfo(&info);
 
-       private_pp.private_display = &private_display;
-       LIST_INITHEAD(&private_pp.pending_buffer_list);
-       LIST_INITHEAD(&private_pp.buffer_list);
+               error = tdm_pp_set_info(pp, &info);
+               EXPECT_EQ(TDM_ERROR_NONE, error);
+               if (error != TDM_ERROR_NONE)
+                       return -1;
 
-       stub_pp_attach_error = 1;
+               return 0;
+       }
 
-       error = tdm_pp_attach(&private_pp, &src, &dst);
+};
 
-       ASSERT_NE(TDM_ERROR_NONE, error);
-}
+class TDMPPCommitThread : public TDMPPCommit {
+protected:
+       void SetEnvs()
+       {
+               TDMPPCommit::SetEnvs();
+               setenv("TDM_THREAD", "1", 1);
+       }
+       void UnsetEnvs()
+       {
+               TDMPPCommit::UnsetEnvs();
+               unsetenv("TDM_THREAD");
+       }
+};
 
-TEST(tdm_pp_attach, error_calloc_error)
+void UtPpDoneHandler(tdm_pp *pp, tbm_surface_h src,
+                                                       tbm_surface_h dst, void *user_data)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_private_pp private_pp;
-       tdm_private_display private_display;
-       tdm_backend_module module;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
-
-       _init_test();
-
-       LIST_INITHEAD(&private_display.pp_list);
-       LIST_ADDTAIL(&private_pp.link, &private_display.pp_list);
-       private_display.module_data = &module;
-       private_display.func_pp.pp_attach = stub_pp_attach;
-       private_display.caps_pp.max_attach_count = 3;
-       module.abi_version  = 0x00010002;
-
-       private_pp.private_display = &private_display;
-       LIST_INITHEAD(&private_pp.pending_buffer_list);
-       LIST_INITHEAD(&private_pp.buffer_list);
+       TDMPPCommit *pp_commit = (TDMPPCommit *)user_data;
+       bool src_valid = false, dst_valid = false;
 
-       CALLOC_ERROR = 1;
+       if (!pp_commit)
+               return;
 
-       error = tdm_pp_attach(&private_pp, &src, &dst);
+       for (auto it = pp_commit->buffers_list.begin(); it != pp_commit->buffers_list.end(); ++it) {
+               if (*it == src)
+                       src_valid = true;
+               if (*it == dst)
+                       dst_valid = true;
+       }
 
-       ASSERT_EQ(TDM_ERROR_OUT_OF_MEMORY, error);
+       if (src_valid && dst_valid)
+               pp_commit->utPpDoneHandlerSuccessCounter++;
 }
 
-TEST(tdm_pp_attach, error_bad_request)
+TEST_F(TDMPPWithoutCreation, DisplayGetPPAvailableFormatsSuccessful)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_private_pp private_pp;
-       tdm_private_display private_display;
-       tdm_backend_module module;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
-       tdm_pp_private_buffer pp_buffer_1;
-       tdm_pp_private_buffer pp_buffer_2;
-
-       _init_test();
-
-       LIST_INITHEAD(&private_display.pp_list);
-       LIST_ADDTAIL(&private_pp.link, &private_display.pp_list);
-       private_display.module_data = &module;
-       private_display.func_pp.pp_attach = stub_pp_attach;
-       private_display.caps_pp.max_attach_count = 1;
-       module.abi_version  = 0x00010002;
-
-       private_pp.private_display = &private_display;
-       LIST_INITHEAD(&private_pp.pending_buffer_list);
-       LIST_INITHEAD(&private_pp.buffer_list);
-
-       LIST_ADD(&pp_buffer_1.link, &private_pp.pending_buffer_list);
-       LIST_ADD(&pp_buffer_2.link, &private_pp.pending_buffer_list);
-
-       error = tdm_pp_attach(&private_pp, &src, &dst);
-
-       ASSERT_EQ(TDM_ERROR_BAD_REQUEST, error);
+       SKIP_FLAG(has_pp);
+       const tbm_format *formats = NULL;
+       int count = -42;
+       ASSERT_TRUE(TDM_ERROR_NONE == tdm_display_get_pp_available_formats(dpy, &formats, &count));
+       ASSERT_FALSE(-42 == count);
+       ASSERT_FALSE(NULL == formats);
 }
 
-TEST(tdm_pp_attach, error_pp_attach_is_not_implemented)
-{
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_private_pp private_pp;
-       tdm_private_display private_display;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
-
-       _init_test();
-
-       private_display.func_pp.pp_attach = NULL;
-
-       private_pp.private_display = &private_display;
+/* tdm_display_create_pp() */
 
-       error = tdm_pp_attach(&private_pp, &src, &dst);
-
-       ASSERT_EQ(TDM_ERROR_NOT_IMPLEMENTED, error);
-}
-
-TEST(tdm_pp_attach, work_flow_success_1)
+TEST_F(TDMPPWithoutCreation, DisplayCreatePPNullAll)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_private_pp private_pp;
-       tdm_private_display private_display;
-       tdm_backend_module module;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
-
-       _init_test();
-
-       LIST_INITHEAD(&private_display.pp_list);
-       LIST_ADDTAIL(&private_pp.link, &private_display.pp_list);
-       private_display.module_data = &module;
-       private_display.func_pp.pp_attach = stub_pp_attach;
-       private_display.caps_pp.max_attach_count = 3;
-       module.abi_version  = 0x00010002;
-
-       private_pp.private_display = &private_display;
-       LIST_INITHEAD(&private_pp.pending_buffer_list);
-       LIST_INITHEAD(&private_pp.buffer_list);
-       tdm_debug_dump = TDM_DUMP_FLAG_PP;
-       tdm_debug_module = TDM_DEBUG_BUFFER;
-
-       error = tdm_pp_attach(&private_pp, &src, &dst);
+       SKIP_FLAG(has_pp);
+       tdm_pp *pp;
 
-       ASSERT_EQ(TDM_ERROR_NONE, error);
-       int num_of_pp_buff = LIST_LENGTH(&private_pp.pending_buffer_list);
-       ASSERT_EQ(1, num_of_pp_buff);
+       pp = tdm_display_create_pp(NULL, NULL);
+       ASSERT_EQ(NULL, pp);
 }
 
-TEST(tdm_pp_attach, null_ptr_fail_3)
+TEST_F(TDMPPWithoutCreation, DisplayCreatePPNullDpy)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-       struct _tbm_surface src;
-
-       _init_test();
-
-       pp.private_display = &private_display;
-
-       error = tdm_pp_attach(&pp, &src, NULL);
+       SKIP_FLAG(has_pp);
+       tdm_pp *pp;
+       tdm_error error;
 
-       ASSERT_EQ(error, expected_error);
+       pp = tdm_display_create_pp(NULL, &error);
+       ASSERT_EQ(NULL, pp);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_attach, null_ptr_fail_2)
+TEST_F(TDMPPWithoutCreation, DisplayCreatePPSuccessNullError)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-       struct _tbm_surface dst;
+       SKIP_FLAG(has_pp);
+       tdm_pp *pp;
 
-       _init_test();
-
-       pp.private_display = &private_display;
-
-       error = tdm_pp_attach(&pp, NULL, &dst);
-
-       ASSERT_EQ(error, expected_error);
+       pp = tdm_display_create_pp(dpy, NULL);
+       ASSERT_NE(NULL, pp);
 }
 
-TEST(tdm_pp_attach, null_ptr_fail_1)
+TEST_F(TDMPPWithoutCreation, DisplayCreatePPSuccess)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
-       struct _tbm_surface src;
-       struct _tbm_surface dst;
-
-       _init_test();
-
-       error = tdm_pp_attach(NULL, &src, &dst);
+       SKIP_FLAG(has_pp);
+       tdm_pp *pp;
+       tdm_error error;
 
-       ASSERT_EQ(error, expected_error);
+       pp = tdm_display_create_pp(dpy, &error);
+       ASSERT_NE(NULL, pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 }
 
-/* tdm_pp_set_info */
+/* tdm_pp_set_info() */
 
-TEST(tdm_pp_set_info, work_flow_success_3)
+TEST_F(TDMPP, PpSetInfoNullAll)
 {
-       tdm_error error = TDM_ERROR_OPERATION_FAILED;
-       tdm_error expected_error = TDM_ERROR_NONE;
-       tdm_info_pp info;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-
-       _init_test();
-
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_set_info = pp_set_info;
-
-       error = tdm_pp_set_info(&pp, &info);
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       ASSERT_EQ(error, expected_error);
+       error = tdm_pp_set_info(NULL, NULL);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_set_info, work_flow_success_2)
+TEST_F(TDMPP, PpSetInfoNullPP)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error not_expected_error = TDM_ERROR_NONE;
+       SKIP_FLAG(has_pp);
+       tdm_error error;
        tdm_info_pp info;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
 
-       _init_test();
-
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_set_info = pp_set_info;
-       PP_SET_INFO_ERROR = 1;
+       error = tdm_pp_set_info(NULL, &info);
+       ASSERT_NE(TDM_ERROR_NONE, error);
+}
 
-       error = tdm_pp_set_info(&pp, &info);
+TEST_F(TDMPP, PpSetInfoNullInfo)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       ASSERT_NE(error, not_expected_error);
+       error = tdm_pp_set_info(pp, NULL);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_set_info, work_flow_success_1)
+TEST_F(TDMPP, PpSetInfoSuccess)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_NOT_IMPLEMENTED;
+       SKIP_FLAG(has_pp);
+       tdm_error error;
        tdm_info_pp info;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-
-       _init_test();
-
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_set_info = NULL;
 
-       error = tdm_pp_set_info(&pp, &info);
+       UtGetPPInfoWithScale(&info);
 
-       ASSERT_EQ(error, expected_error);
+       error = tdm_pp_set_info(pp, &info);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_set_info, null_ptr_fail_2)
-{
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-
-       _init_test();
+/* tdm_pp_set_done_handler() */
 
-       pp.private_display = &private_display;
-
-       error = tdm_pp_set_info(&pp, NULL);
+TEST_F(TDMPP, PpSetDoneHandlerFailNullAll)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       ASSERT_EQ(error, expected_error);
+       error = tdm_pp_set_done_handler(NULL, NULL, NULL);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_set_info, null_ptr_fail_1)
+TEST_F(TDMPP, PpSetDoneHandlerFailNullPP)
 {
-       tdm_error error = TDM_ERROR_NONE;
-       tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
-       tdm_info_pp info;
-
-       _init_test();
-
-       error = tdm_pp_set_info(NULL, &info);
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       ASSERT_EQ(error, expected_error);
+       error = tdm_pp_set_done_handler(NULL, UtPpDoneHandler, this);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_set_done_handler, work_flow_success_1)
+TEST_F(TDMPP, PpSetDoneHandlerSuccessNullFailNullFunc)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
-       int user_data = 0;
-
-       _init_test();
+       int data;
 
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_set_info = NULL;
+       error = tdm_pp_set_done_handler(pp, NULL, &data);
+       ASSERT_NE(TDM_ERROR_NONE, error);
+}
 
-       error = tdm_pp_set_done_handler(&pp, stub_tdm_pp_done_handler, &user_data);
-       ASSERT_EQ(TDM_ERROR_NONE, error);
-       ASSERT_EQ(stub_tdm_pp_done_handler, pp.done_func);
-       ASSERT_EQ(&user_data, pp.done_user_data);
+TEST_F(TDMPP, PpSetDoneHandlerSuccessNullData)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       error = tdm_pp_set_done_handler(&pp, stub_tdm_pp_done_handler, NULL);
+       error = tdm_pp_set_done_handler(pp, UtPpDoneHandler, this);
        ASSERT_EQ(TDM_ERROR_NONE, error);
-       ASSERT_EQ(TDM_ERROR_NONE, error);
-       ASSERT_EQ(stub_tdm_pp_done_handler, pp.done_func);
-       ASSERT_EQ(0, pp.done_user_data);
 }
 
-TEST(tdm_pp_set_done_handler, work_flow_error_1___NULL)
+TEST_F(TDMPP, PpSetDoneHandlerSuccess)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_pp pp;
-       tdm_private_display private_display;
 
-       _init_test();
+       error = tdm_pp_set_done_handler(pp, UtPpDoneHandler, this);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
+}
 
-       pp.private_display = &private_display;
-       private_display.func_pp.pp_set_info = NULL;
+/* tdm_pp_attach() */
 
-       error = tdm_pp_set_done_handler(&pp, NULL, NULL);
-       ASSERT_NE(TDM_ERROR_NONE, error);
+TEST_F(TDMPP, PpAttachFailNullAll)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       error = tdm_pp_set_done_handler(NULL, stub_tdm_pp_done_handler, NULL);
+       error = tdm_pp_attach(NULL, NULL, NULL);
        ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_destroy, work_flow_success_1)
+TEST_F(TDMPP, PpAttachFailNullPp)
 {
-       tdm_private_pp *private_pp;
-       tdm_pp_private_buffer *pp_buffer1;
-       tdm_pp_private_buffer *pp_buffer2;
-       tdm_private_display private_display;
-       private_pp = (tdm_private_pp *)calloc(1, sizeof(tdm_private_pp));
-       pp_buffer1 = (tdm_pp_private_buffer *)calloc(1, sizeof *pp_buffer1);
-       pp_buffer2 = (tdm_pp_private_buffer *)calloc(1, sizeof *pp_buffer2);
-
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       _init_test();
-
-       LIST_INITHEAD(&private_display.pp_list);
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       LIST_ADDTAIL(&private_pp->link, &private_display.pp_list);
-
-
-       private_pp->private_display = &private_display;
-       LIST_INITHEAD(&private_pp->pending_buffer_list);
-       LIST_ADDTAIL(&pp_buffer1->link, &private_pp->pending_buffer_list);
+       SKIP_FLAG(has_pp);
+       tdm_error error;
+       tbm_surface_h dst_buf, src_buf;
 
-       LIST_INITHEAD(&private_pp->buffer_list);
-       LIST_ADDTAIL(&pp_buffer2->link, &private_pp->buffer_list);
+       src_buf = UtCreateBuffer(default_src_w, default_src_h, formats[0]);
+       ASSERT_NE(NULL, src_buf);
 
-       tdm_pp_destroy(private_pp);
+       dst_buf = UtCreateBuffer(default_dst_w, default_dst_h, formats[0]);
+       ASSERT_NE(NULL, dst_buf);
 
-       ASSERT_EQ(4, stub_tdm_buffer_unref_backend_count);
-       ASSERT_EQ(3, stub_free_call_count);
-       ASSERT_TRUE(stub_pp_destroy_is_called);
+       error = tdm_pp_attach(NULL, src_buf, dst_buf);
+       ASSERT_NE(TDM_ERROR_NONE, error);
 }
 
-TEST(tdm_pp_destroy, work_flow_error_1___NULL)
+TEST_F(TDMPP, PpAttachFailNullSrc)
 {
-       tdm_pp_destroy(NULL);
-}
+       SKIP_FLAG(has_pp);
+       tdm_error error;
+       tbm_surface_h dst_buf;
 
-/* tdm_pp_create_internal() */
+       dst_buf = UtCreateBuffer(default_dst_w, default_dst_h, formats[0]);
+       ASSERT_NE(NULL, dst_buf);
 
-TEST(tdm_pp_create_internal, work_flow_success_1)
+       error = tdm_pp_attach(pp, NULL, dst_buf);
+       ASSERT_NE(TDM_ERROR_NONE, error);
+}
+
+TEST_F(TDMPP, PpAttachFailNullDst)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_display private_display;
-       tdm_private_pp *private_pp_ret;
-       tdm_private_pp private_pp;
+       tbm_surface_h src_buf;
 
-       _init_test();
+       src_buf = UtCreateBuffer(default_src_w, default_src_h, formats[0]);
+       ASSERT_NE(NULL, src_buf);
 
-       stub_tdm_helper_get_time_ret_val = 1.1;
-
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       private_display.func_pp.pp_set_done_handler = stub_pp_set_done_handler;
-       private_display.func_display.display_create_pp = stub_display_create_pp;
-       private_display.capabilities = TDM_DISPLAY_CAPABILITY_PP;
-       LIST_INITHEAD(&private_display.pp_list);
+       error = tdm_pp_attach(pp, src_buf, NULL);
+       ASSERT_NE(TDM_ERROR_NONE, error);
+}
 
-       private_pp.stamp = stub_tdm_helper_get_time_ret_val;
+TEST_F(TDMPP, PpAttachSuccess)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
+       tbm_surface_h dst_buf, src_buf;
 
-       LIST_ADD(&private_pp.link, &private_display.pp_list);
+       src_buf = UtCreateBuffer(default_src_w, default_src_h, formats[0]);
+       ASSERT_NE(NULL, src_buf);
 
-       private_pp_ret = tdm_pp_create_internal(&private_display, &error);
+       dst_buf = UtCreateBuffer(default_dst_w, default_dst_h, formats[0]);
+       ASSERT_NE(NULL, dst_buf);
 
+       error = tdm_pp_attach(pp, src_buf, dst_buf);
        ASSERT_EQ(TDM_ERROR_NONE, error);
-       ASSERT_TRUE(stub_pp_set_done_handler_is_called);
-       ASSERT_TRUE(stub_display_create_pp_is_called);
-       ASSERT_TRUE(private_pp_ret != NULL);
 }
 
-TEST(tdm_pp_create_internal, work_flow_error_1___TDM_DISPLAY_CAPABILITY_PP_is_not_set)
+/* tdm_pp_commit() */
+
+TEST_F(TDMPP, PpCommitFailNullPP)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_display private_display;
-       tdm_private_pp *private_pp;
-
-       _init_test();
 
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       private_display.func_pp.pp_set_done_handler = stub_pp_set_done_handler;
-       private_display.func_display.display_create_pp = stub_display_create_pp;
-       private_display.capabilities = TDM_DISPLAY_CAPABILITY_PP;
-       LIST_INITHEAD(&private_display.pp_list);
+       error = tdm_pp_commit(NULL);
+       ASSERT_NE(TDM_ERROR_NONE, error);
+}
 
+TEST_F(TDMPPCommit, PpCommitFailWrongInfo)
+{
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       private_display.capabilities = (tdm_display_capability)0;
+       ASSERT_NE(-1, UtPrepareToPPWithWrongInfo());
 
-       private_pp = tdm_pp_create_internal(&private_display, &error);
+       error = tdm_pp_commit(pp);
        ASSERT_NE(TDM_ERROR_NONE, error);
-       ASSERT_TRUE(private_pp == NULL);
 }
 
-TEST(tdm_pp_create_internal, work_flow_error_1___calloc_error)
+TEST_F(TDMPPCommit, PpCommitSuccessScale)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_display private_display;
-       tdm_private_pp *private_pp;
 
-       _init_test();
+       ASSERT_NE(-1, UtPrepareToPPWithScale());
 
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       private_display.func_pp.pp_set_done_handler = stub_pp_set_done_handler;
-       private_display.func_display.display_create_pp = stub_display_create_pp;
-       private_display.capabilities = TDM_DISPLAY_CAPABILITY_PP;
-       LIST_INITHEAD(&private_display.pp_list);
+       error = tdm_pp_commit(pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 
-       CALLOC_ERROR = 1;
+       UtHandlePPEvent(1);
 
-       private_pp = tdm_pp_create_internal(&private_display, &error);
-       ASSERT_NE(TDM_ERROR_NONE, error);
-       ASSERT_TRUE(private_pp == NULL);
+       ASSERT_EQ(1, utPpDoneHandlerSuccessCounter);
 }
 
-TEST(tdm_pp_create_internal, work_flow_error_1___create_pp_error)
+TEST_F(TDMPPCommit, PpCommitSuccessScaleAndTransform)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_display private_display;
-       tdm_private_pp *private_pp;
 
-       _init_test();
+       ASSERT_NE(-1, UtPrepareToPPWithScale());
 
-       stub_display_create_pp_error = 1;
-       private_display.func_display.display_create_pp = stub_display_create_pp;
-       private_display.capabilities = TDM_DISPLAY_CAPABILITY_PP;
+       error = tdm_pp_commit(pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 
-       private_pp = tdm_pp_create_internal(&private_display, &error);
-       ASSERT_NE(TDM_ERROR_NONE, error);
-       ASSERT_TRUE(private_pp == NULL);
+       UtHandlePPEvent(1);
+
+       ASSERT_EQ(1, utPpDoneHandlerSuccessCounter);
 }
 
-TEST(tdm_pp_create_internal, work_flow_error_1___set_done_handler_error)
+TEST_F(TDMPPCommitThread, PpCommitSuccessScale)
 {
+       SKIP_FLAG(has_pp);
        tdm_error error;
-       tdm_private_display private_display;
-       tdm_private_pp *private_pp;
 
-       _init_test();
+       ASSERT_NE(-1, UtPrepareToPPWithScale());
 
-       stub_pp_set_done_handler_error = 1;
+       error = tdm_pp_commit(pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 
-       private_display.func_pp.pp_destroy = stub_pp_destroy;
-       private_display.func_pp.pp_set_done_handler = stub_pp_set_done_handler;
-       private_display.func_display.display_create_pp = stub_display_create_pp;
-       private_display.capabilities = TDM_DISPLAY_CAPABILITY_PP;
-       LIST_INITHEAD(&private_display.pp_list);
+       UtHandlePPEvent(1);
 
-       private_pp = tdm_pp_create_internal(&private_display, &error);
-       ASSERT_NE(TDM_ERROR_NONE, error);
-       ASSERT_TRUE(private_pp == NULL);
+       ASSERT_EQ(1, utPpDoneHandlerSuccessCounter);
 }
 
-/* tdm_pp_cb_done() */
-
-TEST(tdm_pp_cb_done, success_not_in_display_thread)
+TEST_F(TDMPPCommitThread, PpCommitSuccessScaleAndTransform)
 {
-       tdm_private_pp private_pp;
-       struct _tbm_surface src, dst;
-       tdm_thread_cb_pp_done *pp_done;
-
-       _init_test();
+       SKIP_FLAG(has_pp);
+       tdm_error error;
 
-       stub_syscall_return_value = 100;
-       private_pp.owner_tid = stub_syscall_return_value + 1;
-       private_pp.stamp = 200.05;
+       ASSERT_NE(-1, UtPrepareToPPWithScale());
 
-       tdm_pp_cb_done(&private_pp, &src, &dst, &private_pp);
+       error = tdm_pp_commit(pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 
-       pp_done = (tdm_thread_cb_pp_done *)stub_tdm_thread_send_cb_buff;
+       UtHandlePPEvent(1);
 
-       ASSERT_EQ(pp_done->base.type, TDM_THREAD_CB_PP_DONE);
-       ASSERT_EQ(pp_done->base.length, sizeof * pp_done);
-       ASSERT_DOUBLE_EQ(pp_done->pp_stamp, private_pp.stamp);
-       ASSERT_TRUE(pp_done->src == &src);
-       ASSERT_TRUE(pp_done->dst == &dst);
-       ASSERT_TRUE(pp_done->user_data == &private_pp);
+       ASSERT_EQ(1, utPpDoneHandlerSuccessCounter);
 }
 
-//TEST(tdm_pp_cb_done, success_in_display_thread)
-//{
-//     tdm_private_pp private_pp;
-//     struct _tbm_surface src, dst;
-//     tdm_pp_private_buffer *pp_buffer_1;
-//     tdm_pp_private_buffer *pp_buffer_2;
-//
-//     _init_test();
-//
-//     stub_syscall_return_value = 100;
-//     stub_syscall_reset = 1;
-//     private_pp.owner_tid = stub_syscall_return_value;
-//
-//     pp_buffer_1 = (tdm_pp_private_buffer *)calloc(1, sizeof (tdm_pp_private_buffer));
-//     pp_buffer_2 = (tdm_pp_private_buffer *)calloc(1, sizeof (tdm_pp_private_buffer));
-//     pp_buffer_1->src = &src;
-//     pp_buffer_1->dst = &dst;
-//     private_pp.done_func = stub_tdm_pp_done_handler;
-//
-//     LIST_INITHEAD(&private_pp.buffer_list);
-//     LIST_ADD(&pp_buffer_1->link, &private_pp.buffer_list);
-//     LIST_ADD(&pp_buffer_2->link, &private_pp.buffer_list);
-//
-//     tdm_pp_cb_done(&private_pp, &src, &dst, &private_pp);
-//
-//     ASSERT_EQ(stub_tdm_buffer_unref_backend_count, 2);
-//     ASSERT_EQ(FREE_CALLED, 1);
-//     ASSERT_EQ(stub_tdm_pp_done_handler_is_called, 1);
-//     free(pp_buffer_2);
-//}
-
-/* tdm_pp_find_stamp() */
-
-TEST(tdm_pp_find_stamp, success_pp_list_is_empty)
-{
-       tdm_private_pp *private_pp_ret;
-       tdm_private_display private_display;
-
-       _init_test();
-
-       LIST_INITHEAD(&private_display.pp_list);
+/* tdm_pp_destroy() */
 
-       private_pp_ret = tdm_pp_find_stamp(&private_display, 0.5);
+void UtBufferReleaseHandler(tbm_surface_h buffer,
+                                                          void *user_data)
+{
+       int *data = (int *)user_data;
+       if (!data)
+               return;
 
-       ASSERT_TRUE(private_pp_ret == NULL);
+       (*data)++;
 }
 
-TEST(tdm_pp_find_stamp, success_pp_find_stamp)
+TEST_F(TDMPPCommit, PPDestroySuccessAfterCommit)
 {
-       tdm_private_pp *private_pp_ret;
-       tdm_private_display private_display;
-       tdm_private_pp private_pp;
-       double stamp = 12.25;
+       SKIP_FLAG(has_pp);
+       tdm_error error;
+       int release_data = 0;
 
-       _init_test();
+       ASSERT_NE(-1, UtPrepareToPPWithScale());
 
-       LIST_INITHEAD(&private_display.pp_list);
-       LIST_ADD(&private_pp.link, &private_display.pp_list);
+       for (auto it = buffers_list.begin(); it != buffers_list.end(); ++it) {
+               tdm_buffer_add_release_handler((tbm_surface_h)*it, UtBufferReleaseHandler, &release_data);
+       }
 
-       private_pp.stamp = stamp;
+       error = tdm_pp_commit(pp);
+       ASSERT_EQ(TDM_ERROR_NONE, error);
 
-       private_pp_ret = tdm_pp_find_stamp(&private_display, stamp);
+       tdm_pp_destroy(pp);
+       pp = NULL;
 
-       ASSERT_TRUE(private_pp_ret == &private_pp);
+       ASSERT_EQ(2, release_data);
 }