RKH
test_rkhfwk_evtpool.c
Go to the documentation of this file.
1 /*
2  * --------------------------------------------------------------------------
3  *
4  * Framework RKH
5  * -------------
6  *
7  * State-machine framework for reactive embedded systems
8  *
9  * Copyright (C) 2010 Leandro Francucci.
10  * All rights reserved. Protected by international copyright laws.
11  *
12  *
13  * RKH is free software: you can redistribute it and/or modify it under the
14  * terms of the GNU General Public License as published by the Recycle Software
15  * Foundation, either version 3 of the License, or (at your option) any
16  * later version.
17  *
18  * RKH is distributed in the hope that it will be useful, but WITHOUT ANY
19  * WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
21  * more details.
22  *
23  * You should have received a copy of the GNU General Public License along
24  * with RKH, see copying.txt file.
25  *
26  * Contact information:
27  * RKH web site: http://sourceforge.net/projects/rkh-reactivesys/
28  * e-mail: francuccilea@gmail.com
29  * ---------------------------------------------------------------------------
30  */
31 
44 /* -------------------------- Development history -------------------------- */
45 /*
46  * 2017.05.09 LeFr v2.4.05 Initial version
47  */
48 
49 /* -------------------------------- Authors -------------------------------- */
50 /*
51  * LeFr Leandro Francucci francuccilea@gmail.com
52  */
53 
54 /* --------------------------------- Notes --------------------------------- */
55 /* ----------------------------- Include files ----------------------------- */
56 #include "unity_fixture.h"
57 #include "rkhfwk_evtpool.h"
58 #include "Mock_rkhtrc_record.h"
59 #include "Mock_rkhtrc_filter.h"
60 #include "Mock_rkhmempool.h"
61 #include "Mock_rkhassert.h"
62 
63 /* ----------------------------- Local macros ------------------------------ */
64 /* ------------------------------- Constants ------------------------------- */
65 /* ---------------------------- Local data types --------------------------- */
66 /* ---------------------------- Global variables --------------------------- */
67 TEST_GROUP(evtpool);
68 
69 /* ---------------------------- Local variables ---------------------------- */
70 static rui8_t *stoStart;
71 static rui16_t stoSize;
72 static RKH_ES_T evtSize;
73 
74 /* ----------------------- Local function prototypes ----------------------- */
75 /* ---------------------------- Local functions ---------------------------- */
76 static void
77 MockAssertCallback(const char* const file, int line, int cmock_num_calls)
78 {
79  TEST_PASS();
80 }
81 
82 static void
83 MockMemPoolInitCallback(RKH_MEMPOOL_T *mp, void* sstart, rui16_t ssize,
84  RKH_MPBS_T bsize, int cmock_num_calls)
85 {
86  mp->nblocks = 1; /* this value is only used just for testing */
87 }
88 
89 /* ---------------------------- Global functions --------------------------- */
90 TEST_SETUP(evtpool)
91 {
92  Mock_rkhmempool_Init();
93  Mock_rkhassert_Init();
94  rkh_trc_isoff__IgnoreAndReturn(RKH_FALSE);
96  rkh_assert_StubWithCallback(MockAssertCallback);
97  rkh_memPool_init_StubWithCallback(MockMemPoolInitCallback);
98 
99  stoStart = (void *)0xdeadbeaf;
100  stoSize = 128;
101  evtSize = 32;
102 }
103 
104 TEST_TEAR_DOWN(evtpool)
105 {
106  Mock_rkhmempool_Verify();
107  Mock_rkhmempool_Destroy();
108  Mock_rkhassert_Verify();
109  Mock_rkhassert_Destroy();
110 }
111 
118 TEST(evtpool, AfterInitAllEvtPoolAvailable)
119 {
120  RKHEvtPool *ep;
121  int i;
122 
123  for (i = 0; i < RKH_CFG_FWK_MAX_EVT_POOL; ++i)
124  {
125  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
126  rkh_memPool_init_IgnoreArg_mp();
127 
128  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
129  TEST_ASSERT_NOT_NULL(ep);
130  }
131  TEST_ASSERT_EQUAL(RKH_CFG_FWK_MAX_EVT_POOL, i);
132 }
133 
134 TEST(evtpool, GetOneEvtPool)
135 {
136  RKHEvtPool *ep;
137 
138  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
139  rkh_memPool_init_IgnoreArg_mp();
140 
141  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
142  TEST_ASSERT_NOT_NULL(ep);
143 }
144 
145 TEST(evtpool, GetMultipleEvtPool)
146 {
147  rint i;
148  RKHEvtPool *ep[RKH_CFG_FWK_MAX_EVT_POOL];
149 
150  for (i = 0; i < RKH_CFG_FWK_MAX_EVT_POOL; ++i)
151  {
152  rkh_memPool_init_Expect(0, stoStart + (stoSize * i),
153  stoSize, (RKH_MPBS_T)evtSize * (2 * (i + 1)));
154  rkh_memPool_init_IgnoreArg_mp();
155  ep[i] = rkh_evtPool_getPool(stoStart + (stoSize * i), stoSize,
156  evtSize * (2 * (i + 1)));
157  TEST_ASSERT_NOT_NULL(ep[i]);
158  }
159 
160  TEST_ASSERT_TRUE((ep[0] != ep[1]) && (ep[0] != ep[2]));
161  TEST_ASSERT_TRUE(ep[1] != ep[2]);
162 }
163 
164 TEST(evtpool, Fails_ExceedsMaxAvailableEvtPool)
165 {
166  rint i;
167  RKHEvtPool *ep;
168 
169  for (i = 0; i < RKH_CFG_FWK_MAX_EVT_POOL; ++i)
170  {
171  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
172  rkh_memPool_init_IgnoreArg_mp();
173  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
174  TEST_ASSERT_NOT_NULL(ep);
175  }
176  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
177  TEST_ASSERT_NULL(ep);
178 }
179 
180 TEST(evtpool, GetBlockSize)
181 {
182  RKHEvtPool *ep;
183 
184  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
185  rkh_memPool_init_IgnoreArg_mp();
186 
187  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
189 }
190 
191 TEST(evtpool, Fails_GetBlockSizeInvalidInstance)
192 {
193  rkh_assert_Expect("rkhfwk_evtpool", 0);
194  rkh_assert_IgnoreArg_line();
195 
196  rkh_evtPool_getBlockSize((RKHEvtPool *)0);
197 }
198 
199 TEST(evtpool, GetBlock)
200 {
201  RKHEvtPool *ep;
202  RKH_EVT_T *evt;
203 
204  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
205  rkh_memPool_init_IgnoreArg_mp();
206  rkh_memPool_get_ExpectAndReturn(0, (void *)0xdead);
207  rkh_memPool_get_IgnoreArg_mp();
208 
209  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
210  evt = rkh_evtPool_get(ep);
211 
212  TEST_ASSERT_EQUAL_PTR((RKH_EVT_T *)0xdead, evt);
213 }
214 
215 TEST(evtpool, Fails_GetBlockInvalidInstance)
216 {
217  rkh_assert_Expect("rkhfwk_evtpool", 0);
218  rkh_assert_IgnoreArg_line();
219 
220  rkh_evtPool_get((RKHEvtPool *)0);
221 }
222 
223 TEST(evtpool, PutBlock)
224 {
225  RKHEvtPool *ep;
226  RKH_EVT_T *evt = (RKH_EVT_T *)0xdead;
227 
228  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
229  rkh_memPool_init_IgnoreArg_mp();
230  rkh_memPool_put_Expect(0, evt);
231  rkh_memPool_put_IgnoreArg_mp();
232 
233  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
234  rkh_evtPool_put(ep, evt);
235 }
236 
237 TEST(evtpool, Fails_PutBlockInvalidInstance)
238 {
239  RKH_EVT_T *evt = (RKH_EVT_T *)0xdead;
240 
241  rkh_assert_Expect("rkhfwk_evtpool", 0);
242  rkh_assert_IgnoreArg_line();
243 
244  rkh_evtPool_put((RKHEvtPool *)0, evt);
245 }
246 
247 TEST(evtpool, GetNumUsed)
248 {
249  RKHEvtPool *ep;
250 
251  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
252  rkh_memPool_init_IgnoreArg_mp();
253 
254  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
256 }
257 
258 TEST(evtpool, Fails_GetNumUsedInvalidInstance)
259 {
260  rkh_assert_Expect("rkhfwk_evtpool", 0);
261  rkh_assert_IgnoreArg_line();
262 
263  rkh_evtPool_getNumUsed((RKHEvtPool *)0);
264 }
265 
266 TEST(evtpool, GetNumMin)
267 {
268  RKHEvtPool *ep;
269 
270  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
271  rkh_memPool_init_IgnoreArg_mp();
272 
273  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
275 }
276 
277 TEST(evtpool, Fails_GetNumMinInvalidInstance)
278 {
279  rkh_assert_Expect("rkhfwk_evtpool", 0);
280  rkh_assert_IgnoreArg_line();
281 
282  rkh_evtPool_getNumMin((RKHEvtPool *)0);
283 }
284 
285 TEST(evtpool, GetNumBlock)
286 {
287  RKHEvtPool *ep;
288 
289  rkh_memPool_init_Expect(0, stoStart, stoSize, (RKH_MPBS_T)evtSize);
290  rkh_memPool_init_IgnoreArg_mp();
291 
292  ep = rkh_evtPool_getPool(stoStart, stoSize, evtSize);
294 }
295 
296 TEST(evtpool, Fails_GetNumBlockInvalidInstance)
297 {
298  rkh_assert_Expect("rkhfwk_evtpool", 0);
299  rkh_assert_IgnoreArg_line();
300 
301  rkh_evtPool_getNumBlock((RKHEvtPool *)0);
302 }
303 
309 /* ------------------------------ End of file ------------------------------ */
rui8_t rkh_evtPool_getBlockSize(RKHEvtPool *const me)
Encapsulates how RKH should obtain the block size of an event pool.
Defines the data structure used to memory block pool facility.
Definition: rkhmempool.h:189
Specifies the event pool interface.
Represents events without parameters.
Definition: rkhevt.h:167
#define RKH_FALSE
Standard define.
Definition: rkhdef.h:254
RKHEvtPool * rkh_evtPool_getPool(void *stoStart, rui16_t stoSize, RKH_ES_T evtSize)
Encapsulates the creation of an event pool.
rui8_t RKH_MPBS_T
Definition: rkhmempool.h:93
void rkh_evtPool_put(RKHEvtPool *const me, RKH_EVT_T *evt)
Encapsulates how RKH should return an event evt to the event pool me.
RKH_EVT_T * rkh_evtPool_get(RKHEvtPool *const me)
Encapsulates how RKH should obtain an event evt from the event pool me.
rui8_t rkh_evtPool_getNumMin(RKHEvtPool *const me)
Encapsulates how RKH should return the lowest number of free blocks ever present in the pool me...
rui8_t rkh_evtPool_getNumUsed(RKHEvtPool *const me)
Encapsulates how RKH should return the current number of memory blocks used in the pool me...
rui8_t RKH_ES_T
Definition: rkhevt.h:114
void rkh_evtPool_init()
Encapsulates the initialization of event pool manager.
rui8_t rkh_evtPool_getNumBlock(RKHEvtPool *const me)
Encapsulates how RKH should return the total number of blocks in the pool me.
RKH_MPNB_T nblocks
Total number of blocks in bytes.
Definition: rkhmempool.h:216
#define RKH_CFG_FWK_MAX_EVT_POOL
If the dynamic event support is enabled (see RKH_CFG_FWK_DYN_EVT_EN) then the RKH_CFG_FWK_MAX_EVT_POO...
Definition: rkhcfg.h:112