libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
syscall_wrapper.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2020 by J.M.McGuiness, coder@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include "core/syscall_wrapper.hpp"
25 
26 #include <cstdlib>
27 
28 #include <sys/mman.h>
29 
30 using namespace libjmmcg;
31 
32 extern "C" int
33 test_fn_int_return(int i, long j) {
34  return i+j;
35 }
36 
37 extern "C" void *
39  return p;
40 }
41 
42 extern "C" sighandler_t
43 test_fn_sighandler_t(sighandler_t p) {
44  return p;
45 }
46 
47 template<class>
49  static inline constexpr std::int64_t value=-1;
50 };
51 
52 BOOST_AUTO_TEST_SUITE(syscall_wrapper_tests)
53 
54 BOOST_AUTO_TEST_CASE(malloc_free_default_failure_traits) {
55  void *is=nullptr;
56  BOOST_CHECK_NO_THROW((is=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), ::malloc, std::size_t(sizeof(int)))));
57  BOOST_CHECK_NE(is, nullptr);
58  BOOST_CHECK_NO_THROW((JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), ::free, is)));
59 }
60 
61 BOOST_AUTO_TEST_CASE(int_return_function_succeeds_default_failure_traits) {
62  int ret=0;
63  BOOST_CHECK_NO_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_int_return, 1, 2L)));
64  BOOST_CHECK_EQUAL(ret, 3);
65 }
66 
67 BOOST_AUTO_TEST_CASE(int_return_function_fails_default_failure_traits) {
68  int ret=0;
69  BOOST_CHECK_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_int_return, 1, -2L)), syscall::exception_t);
70  BOOST_CHECK_EQUAL(ret, 0);
71 }
72 
73 BOOST_AUTO_TEST_CASE(void_ptr_return_function_succeeds_default_failure_traits) {
74  void *ret=nullptr;
75  BOOST_CHECK_NO_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_void_ptr_return, reinterpret_cast<void*>(0x1))));
76  BOOST_CHECK_EQUAL(ret, reinterpret_cast<void*>(0x1));
77 }
78 
79 BOOST_AUTO_TEST_CASE(void_ptr_return_function_fails_default_failure_traits) {
80  void *ret=nullptr;
81  BOOST_CHECK_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_void_ptr_return, nullptr)), syscall::exception_t);
82  BOOST_CHECK_EQUAL(ret, nullptr);
83 }
84 
85 BOOST_AUTO_TEST_CASE(void_ptr_return_function_succeeds_custom_failure_traits) {
86  void *ret=nullptr;
87  BOOST_CHECK_NO_THROW((ret=JMMCG_SYSCALL_WRAPPER_FC(failure_code_mmap, "Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_void_ptr_return, reinterpret_cast<void*>(0x1))));
88  BOOST_CHECK_EQUAL(ret, reinterpret_cast<void*>(0x1));
89 }
90 
91 BOOST_AUTO_TEST_CASE(void_ptr_return_function_fails_custom_failure_traits) {
92  void *ret=nullptr;
93  BOOST_CHECK_THROW((ret=JMMCG_SYSCALL_WRAPPER_FC(failure_code_mmap, "Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_void_ptr_return, reinterpret_cast<void*>(-1))), syscall::exception_t);
94  BOOST_CHECK_EQUAL(ret, nullptr);
95 }
96 
97 BOOST_AUTO_TEST_CASE(signal_succeeds) {
98  sighandler_t ret=nullptr;
99  BOOST_CHECK_NO_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_sighandler_t, nullptr)));
100  BOOST_CHECK_EQUAL(ret, nullptr);
101 }
102 
103 BOOST_AUTO_TEST_CASE(signal_fails) {
104  sighandler_t ret=nullptr;
105  BOOST_CHECK_THROW((ret=JMMCG_SYSCALL_WRAPPER("Error message.", _T(LIBJMMCG_VERSION_NUMBER), test_fn_sighandler_t, reinterpret_cast<sighandler_t>(-1))), syscall::exception_t);
106  BOOST_CHECK_EQUAL(ret, nullptr);
107 }
108 
109 /* TODO Does not work, as requires C++20, with g++ v9.2.
110 BOOST_AUTO_TEST_CASE(using_a_switch) {
111  using all_case_statements=syscall::case_statements_t<
112  syscall::a_case_statement<1, [](){return 1;}>,
113  syscall::a_case_statement<2, [](){return 2;}>
114  >;
115 
116  int i=1;
117  long j=1;
118  int ret=0;
119  BOOST_CHECK_NO_THROW((
120  ret=JMMCG_SYSCALL_WRAPPER_SWITCH(
121  all_case_statements,
122  "Error message.",
123  _T(LIBJMMCG_VERSION_NUMBER),
124  test_fn_int_return,
125  i,
126  j
127  )
128  ));
129  BOOST_CHECK_EQUAL(ret, 2);
130 }
131 */
132 BOOST_AUTO_TEST_SUITE_END()