* limitations under the License.
*/
+#include <vector>
#include "media_tool_gtest.h"
-#include "media_format.h"
#include "media_format_internal.h"
using ::testing::InitGoogleTest;
using ::testing::Test;
using ::testing::TestCase;
+using namespace std;
class MediaToolTest : public ::testing::Test {
protected:
media_format_unref(fmt);
}
+TEST(MediaToolTest, media_tool_gtest_refcount_general)
+{
+ media_format_h fmt;
+ int ref_count;
+ int ret = media_format_create(&fmt);
+ ASSERT_EQ(ret, MEDIA_FORMAT_ERROR_NONE);
+
+ media_format_ref(fmt);
+ media_format_get_refcount(fmt, &ref_count);
+ ASSERT_EQ(ref_count, 2);
+
+ media_format_ref(fmt);
+ media_format_get_refcount(fmt, &ref_count);
+ ASSERT_EQ(ref_count, 3);
+
+ media_format_unref(fmt);
+ media_format_get_refcount(fmt, &ref_count);
+ ASSERT_EQ(ref_count, 2);
+
+ media_format_unref(fmt);
+ media_format_unref(fmt); /* fmt got freed at this moment */
+ media_format_get_refcount(fmt, &ref_count);
+ ASSERT_EQ(ref_count, 0); /* but the freed memory still hold refcount value(zero) */
+
+ ret = media_format_unref(fmt); /* trying to unref fmt which already destroyed */
+ ASSERT_EQ(ret, MEDIA_FORMAT_ERROR_INVALID_OPERATION);
+}
+
+static void *refcount_monkey_thread_func(gpointer data, gpointer param)
+{
+ media_format_h fmt = (media_format_h)param;
+ unsigned int refcount_limit = GPOINTER_TO_UINT(data);
+
+ for (int i = 0; i < refcount_limit; i++)
+ media_format_ref(fmt);
+
+ for (int i = 0; i < refcount_limit; i++)
+ media_format_unref(fmt);
+
+ return NULL;
+}
+
+TEST(MediaToolTest, media_tool_gtest_refcount_thread_safty)
+{
+ const unsigned int num_threads = 5;
+ const unsigned int refcount_limit_per_thread = 10000;
+
+ media_format_h fmt;
+ int ref_count;
+ int ret = media_format_create(&fmt);
+ ASSERT_EQ(ret, MEDIA_FORMAT_ERROR_NONE);
+
+ GThreadPool* thread_pool = g_thread_pool_new(
+ (GFunc)refcount_monkey_thread_func,
+ (gpointer)fmt, num_threads, TRUE, NULL);
+
+ for (int i = 0; i < num_threads; i++)
+ g_thread_pool_push(thread_pool, GUINT_TO_POINTER(refcount_limit_per_thread), NULL);
+
+ g_thread_pool_free(thread_pool, FALSE, TRUE);
+
+ media_format_get_refcount(fmt, &ref_count);
+ ASSERT_EQ(ref_count, 1);
+
+ media_format_unref(fmt);
+}
+
int main(int argc, char **argv)
{
InitGoogleTest(&argc, argv);