Add basic fixed-size backend tests. 52/320552/3
authorMichal Bloch <m.bloch@samsung.com>
Tue, 4 Mar 2025 14:27:46 +0000 (15:27 +0100)
committerMichal Bloch <m.bloch@samsung.com>
Wed, 5 Mar 2025 18:37:22 +0000 (19:37 +0100)
So far just a copy-paste of regular dir backend tests,
doesn't yet handle some fixed-size specific scenarios.

Change-Id: I557d3ebd280547a40feae38da5cbd51c8aeb3bf8

tests/api_tests/test_api_add_remove_user.cpp
tests/api_tests/test_api_add_remove_user_err.cpp
tests/api_tests/test_api_adduserwait.cpp
tests/api_tests/test_api_get_user_list.cpp
tests/api_tests/test_hlp.hpp

index db585ef74ff29143647a0e5fdcb9e75e71f6c9ba..8fd1b87a77f0c86a8c86adea177469c4f6d25dc9 100644 (file)
@@ -9,7 +9,7 @@
 #include "test_hlp.hpp"
 
 
-const int  action_items = 4;
+const int  action_items = 8;
 
 TEST(subsession_add_remove_user_test, APIAddRemoveUserTest) {
 
@@ -41,6 +41,32 @@ TEST(subsession_add_remove_user_test, APIAddRemoveUserTest) {
                                                        .desc = "Check if remove " + std::string(TestUserStr::user_19) + " is successful (regular dir backend)",
                                                        .cb_expected = SUBSESSION_ERROR_NONE,
                                                        .cb_desc = "Check if remove " + std::string(TestUserStr::user_19) + " callback is successful (regular dir backend)", },
+
+                       // Fixed-size backend
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestUserStr::user_2, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if add  " + std::string(TestUserStr::user_2) + " is successful (fixed-size backend, 10 MB)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if add " + std::string(TestUserStr::user_2) + " callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>(TestUserStr::user_2)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if remove " + std::string(TestUserStr::user_2) + " is successful (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if remove " + std::string(TestUserStr::user_2) + " callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestUserStr::user_3, 25*1024)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if add  " + std::string(TestUserStr::user_3) + " is successful (fixed-size backend, 25 MB)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if add " + std::string(TestUserStr::user_3) + " callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>(TestUserStr::user_3)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if remove " + std::string(TestUserStr::user_3) + " is successful (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if remove " + std::string(TestUserStr::user_3) + " callback is successful (fixed-size backend)", },
                }
        };
 
index 66b0e0359f4d5bf0508e06b66447aacc27726c20..ca05c86859b0c5d8bf1f8b95c93f33a82bc714fd 100644 (file)
@@ -9,7 +9,7 @@
 #include "test_hlp.hpp"
 
 
-const int  action_items = 13;
+const int  action_items = 26;
 
 TEST(subsession_add_remove_test, FailAtAddRemoveUser) {
        using ud_t = ud_data_t<std::array<api_call_res_t, action_items>>;
@@ -96,6 +96,88 @@ TEST(subsession_add_remove_test, FailAtAddRemoveUser) {
                                                        .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_20) + " ] callback returns error (regular dir backend)", },
 
 
+
+
+
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_1, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add  [ " + std::string(TestBadUserStr::bad_user_1) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_1) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>(TestBadUserStr::bad_user_1)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_1) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_1) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_3, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add  [ " + std::string(TestBadUserStr::bad_user_3) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_3) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestBadUserStr::bad_user_3)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_3) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_3) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_2, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add  [ " + std::string(TestBadUserStr::bad_user_2) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_2) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestBadUserStr::bad_user_2)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_2) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_2) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_empty, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_empty) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_empty) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestBadUserStr::bad_user_empty)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_empty) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_empty) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestUserStr::user_1)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if remove non existent [ " + std::string(TestUserStr::user_1) + " ] returns no error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_NOT_AVAILABLE,
+                                                       .cb_desc = "Check if remove non exixtent [ " + std::string(TestUserStr::user_1) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_long, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_long) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_long) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestBadUserStr::bad_user_long)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_long) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_long) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestBadUserStr::bad_user_20, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_20) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if add [ " + std::string(TestBadUserStr::bad_user_20) + " ] callback returns error (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>( TestBadUserStr::bad_user_20)),
+                                                       .expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_20) + " ] returns error (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_INVALID_PARAMETER,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestBadUserStr::bad_user_20) + " ] callback returns error (fixed-size backend)", },
+
                }
        };
 
index ff3dcfa93603ce91e68bdf9613632c4f7efde5ec..fca66e7218ace8bbca7fc0f2bc29a092d8a83933 100644 (file)
@@ -10,7 +10,7 @@
 
 #include "test_hlp.hpp"
 
-const int action_items = 3;
+const int action_items = 7;
 
 TEST(subsession_add_user_wait_test, APIAddUserWaitTest) {
 
@@ -35,6 +35,31 @@ TEST(subsession_add_user_wait_test, APIAddUserWaitTest) {
                                                        .desc = "Check if remove [ " + std::string(TestUserStr::user_1) + " ] is successful (regular dir backend)",
                                                        .cb_expected = SUBSESSION_ERROR_NONE,
                                                        .cb_desc = "Check if remove [ " + std::string(TestUserStr::user_1) + " ] callback is successful (regular dir backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestUserStr::user_1, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if add [ " + std::string(TestUserStr::user_1) + " ] is successful (fixed-size backend, 10 MB)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if add [ " + std::string(TestUserStr::user_1) + " ] callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>(TestUserStr::user_1)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if remove [ " + std::string(TestUserStr::user_1) + " ] is successful (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestUserStr::user_1) + " ] callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_add_user_fixed_size_l<subsession_5001>( TestUserStr::user_2, 10*1024)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if add [ " + std::string(TestUserStr::user_2) + " ] is successful (fixed-size backend, 10 MB)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if add [ " + std::string(TestUserStr::user_2) + " ] callback is successful (fixed-size backend)", },
+
+                       api_call_res_t{ .call_result = std::move(subsession_remove_user_l<subsession_5001>(TestUserStr::user_2)),
+                                                       .expected = SUBSESSION_ERROR_NONE,
+                                                       .desc = "Check if remove [ " + std::string(TestUserStr::user_2) + " ] is successful (fixed-size backend)",
+                                                       .cb_expected = SUBSESSION_ERROR_NONE,
+                                                       .cb_desc = "Check if remove [ " + std::string(TestUserStr::user_2) + " ] callback is successful (fixed-size backend)", },
+
                }
 
        };
index c6018a0d474a356832340ad5374dd5e3dfca5597..522b58572a298215e7486f2270255ff2a6c1a661 100644 (file)
@@ -11,7 +11,7 @@
 
 using tud_ = test_user_data_cb_t;
 using tgl_ = test_get_user_list_res_t;
-using ud_get_user_t = struct ud_ctrl_t<tgl_, tud_, tud_, tgl_, tgl_, tud_, tud_>;
+using ud_get_user_t = struct ud_ctrl_t<tgl_, tud_, tud_, tgl_, tgl_, tud_, tud_, tgl_, tgl_, tud_, tud_, tgl_, tgl_, tud_, tud_>;
 
 struct get_user {
     enum action {
@@ -21,7 +21,15 @@ struct get_user {
                get_user_list_1_2,
                get_user_list_1_2_count_only,
                remove_user_1,
+               add_user_fixed_size_1,
+               get_user_list_mixed_1_2,
+               get_user_list_mixed_1_2_count_only,
                remove_user_2,
+               add_user_fixed_size_2,
+               get_user_list_fixed_size_1_2,
+               get_user_list_fixed_size_1_2_count_only,
+               remove_user_fixed_size_1,
+               remove_user_fixed_size_2,
                action_items
        };
 };
@@ -81,12 +89,20 @@ TEST(subsession_get_user_list, GetUserListOk) {
        init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_0>(ud.t));
        init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_1_2>(ud.t));
        init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_1_2_count_only>(ud.t));
+       init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_mixed_1_2>(ud.t));
+       init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_mixed_1_2_count_only>(ud.t));
+       init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_fixed_size_1_2>(ud.t));
+       init_user_s<tgl_ &, subsession_5001>(std::get<get_user::get_user_list_fixed_size_1_2_count_only>(ud.t));
 
        init_user_s<tud_ &, subsession_5001>(std::get<get_user::add_user_1>(ud.t));
        init_user_s<tud_ &, subsession_5001>(std::get<get_user::add_user_2>(ud.t));
+       init_user_s<tud_ &, subsession_5001>(std::get<get_user::add_user_fixed_size_1>(ud.t));
+       init_user_s<tud_ &, subsession_5001>(std::get<get_user::add_user_fixed_size_2>(ud.t));
 
        init_user_s<tud_ &, subsession_5001>(std::get<get_user::remove_user_1>(ud.t));
        init_user_s<tud_ &, subsession_5001>(std::get<get_user::remove_user_2>(ud.t));
+       init_user_s<tud_ &, subsession_5001>(std::get<get_user::remove_user_fixed_size_1>(ud.t));
+       init_user_s<tud_ &, subsession_5001>(std::get<get_user::remove_user_fixed_size_2>(ud.t));
 
        std::array<res_t, get_user::action_items> results {
 
@@ -100,16 +116,40 @@ TEST(subsession_get_user_list, GetUserListOk) {
                                SUBSESSION_ERROR_NONE, "Check if adding user 2 (regular dir backend) returns no error" },
 
                res_t{ get_user_list_wrap<ud_get_user_t, get_user::get_user_list_1_2>(ud),
-                               SUBSESSION_ERROR_NONE, "Check if get list with user 1 and 2 returns no error" },
+                               SUBSESSION_ERROR_NONE, "Check if get list with user 1 and 2 (both regular dirs) returns no error" },
 
                res_t{ get_user_list_count_only_wrap<ud_get_user_t, get_user::get_user_list_1_2_count_only>(ud),
-                               SUBSESSION_ERROR_NONE, "Check if get counter only for user 1 and 2 returns no error" },
+                               SUBSESSION_ERROR_NONE, "Check if get counter only for user 1 and 2 (both regular dirs) returns no error" },
 
                res_t{ remove_user_wrap<ud_get_user_t, get_user::remove_user_1>(TestUserStr::user_1, test_reply_callback_default, ud),
                                SUBSESSION_ERROR_NONE, "Check if removing user 1 (regular dir backend) returns no error" },
 
+               res_t{ add_user_fixed_size_wrap<ud_get_user_t, get_user::add_user_fixed_size_1>(TestUserStr::user_1,  10*1024, test_reply_callback_default, ud),
+                               SUBSESSION_ERROR_NONE, "Check if adding user 1 (fixed-size backend) returns no error" },
+
+               res_t{ get_user_list_wrap<ud_get_user_t, get_user::get_user_list_mixed_1_2>(ud),
+                               SUBSESSION_ERROR_NONE, "Check if get list with user 1 and 2 (mixed backends) returns no error" },
+
+               res_t{ get_user_list_count_only_wrap<ud_get_user_t, get_user::get_user_list_mixed_1_2_count_only>(ud),
+                               SUBSESSION_ERROR_NONE, "Check if get counter only for user 1 and 2 (mixed backends) returns no error" },
+
                res_t{ remove_user_wrap<ud_get_user_t, get_user::remove_user_2>(TestUserStr::user_2, test_reply_callback_default, ud),
                                SUBSESSION_ERROR_NONE, "Check if removing user 2 (regular dir backend) returns no error" },
+
+               res_t{ add_user_fixed_size_wrap<ud_get_user_t, get_user::add_user_fixed_size_2>(TestUserStr::user_2,  10*1024, test_reply_callback_default, ud),
+                               SUBSESSION_ERROR_NONE, "Check if adding user 2 (fixed-size backend) returns no error" },
+
+               res_t{ get_user_list_wrap<ud_get_user_t, get_user::get_user_list_fixed_size_1_2>(ud),
+                               SUBSESSION_ERROR_NONE, "Check if get list with user 1 and 2 (both fixed-size) returns no error" },
+
+               res_t{ get_user_list_count_only_wrap<ud_get_user_t, get_user::get_user_list_fixed_size_1_2_count_only>(ud),
+                               SUBSESSION_ERROR_NONE, "Check if get counter only for user 1 and 2 (both fixed-size) returns no error" },
+
+               res_t{ remove_user_wrap<ud_get_user_t, get_user::remove_user_fixed_size_1>(TestUserStr::user_1, test_reply_callback_default, ud),
+                               SUBSESSION_ERROR_NONE, "Check if removing user 1 (fixed-size backend) returns no error" },
+
+               res_t{ remove_user_wrap<ud_get_user_t, get_user::remove_user_fixed_size_2>(TestUserStr::user_2, test_reply_callback_default, ud),
+                               SUBSESSION_ERROR_NONE, "Check if removing user 2 (fixed-size backend) returns no error" },
        };
 
        loop_run_for_test(callback_pending_ud<ud_get_user_t>,(gpointer*)&ud, ud.loop);
@@ -118,7 +158,11 @@ TEST(subsession_get_user_list, GetUserListOk) {
        std::array<std::string, 3> arr{std::string(TestUserStr::user_0), std::string(TestUserStr::user_1), std::string(TestUserStr::user_2)};
 
        summarize_results_for_get_user_list<std::array<std::string, 3>>(std::get<get_user::get_user_list_1_2>(ud.t), arr);
+       summarize_results_for_get_user_list<std::array<std::string, 3>>(std::get<get_user::get_user_list_mixed_1_2>(ud.t), arr);
+       summarize_results_for_get_user_list<std::array<std::string, 3>>(std::get<get_user::get_user_list_fixed_size_1_2>(ud.t), arr);
        summarize_results_for_counted_only_get_user_list(std::get<get_user::get_user_list_1_2_count_only>(ud.t), 3);
+       summarize_results_for_counted_only_get_user_list(std::get<get_user::get_user_list_mixed_1_2_count_only>(ud.t), 3);
+       summarize_results_for_counted_only_get_user_list(std::get<get_user::get_user_list_fixed_size_1_2_count_only>(ud.t), 3);
        summarize_results<get_user::action_items>(results);
 }
 
index a26bf77ae511c3b3c615c5376560b856217de637..7ba36dac71267158d2d8fe1b08b5f6fe2a53d4d6 100644 (file)
@@ -49,6 +49,7 @@ static constexpr int MAGIC_SWITCH  = 333;
 static constexpr int MAGIC_DEFAULT = 444;
 static constexpr int MAGIC_GET_CURRENT_USER = 444;
 static constexpr int MAGIC_EVENT_ADD = 555;
+static constexpr int MAGIC_ADD_FIXED_SIZE = 666;
 static constexpr int MAGIC_EVENT_REMOVE = 777;
 static constexpr int MAGIC_EVENT_SWITCH = 888;
 static constexpr int MAGIC_EVENT_SWITCH_COMPLETION = 999;
@@ -360,6 +361,16 @@ auto subsession_add_user_l = [](char * user_id) {
        return p;
 };
 
+template<typename S>
+auto subsession_add_user_fixed_size_l = [](char * user_id, uint32_t size_limit) {
+
+       std::shared_ptr<std::pair<tud_, int>> p = std::make_shared<std::pair<tud_, int>>(init_user_tud<S>(), 0);
+       p->first.magic = MAGIC_ADD_FIXED_SIZE;
+       int res = subsession_add_user_fixed_size(p->first.session_uid, user_id, size_limit, test_reply_callback_default, (void *)&p->first);
+       p->second = pass_cb_if_err(res, &p->first.callback_reference);
+       return p;
+};
+
 template<typename S>
 auto subsession_remove_user_l = [](char * user_id){
        std::shared_ptr<std::pair<tud_, int>> p = std::make_shared<std::pair<tud_, int>>(init_user_tud<S>(), 0);
@@ -477,6 +488,16 @@ int add_user_wrap(char * user_id, subsession_reply_callback cb, T &ud) {
        return res;
 }
 
+template<typename T, int N>
+int add_user_fixed_size_wrap(char * user_id, uint32_t size_limit, subsession_reply_callback cb, T &ud) {
+
+       std::get<N>(ud.t).user_id = user_id;
+       int res = subsession_add_user_fixed_size(test_subsession_uid, std::get<N>(ud.t).user_id, size_limit,
+               cb, (void *)&std::get<N>(ud.t));
+       if ( res != SUBSESSION_ERROR_NONE ) { g_atomic_int_inc(&std::get<N>(ud.t).callback_reference); }
+       return res;
+}
+
 template<typename T, int N>
 int remove_user_wrap(char* user_id, subsession_reply_callback cb, T &ud) {