ChibiOS/RT Architecture - Reference Manual - Guides |
00001 /* 00002 ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. 00003 00004 This file is part of ChibiOS/RT. 00005 00006 ChibiOS/RT is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 ChibiOS/RT is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 00019 --- 00020 00021 A special exception to the GPL can be applied should you wish to distribute 00022 a combined work that includes ChibiOS/RT, without being obliged to provide 00023 the source code for any proprietary components. See the file exception.txt 00024 for full details of how and when the exception can be applied. 00025 */ 00026 00027 #include "ch.h" 00028 #include "test.h" 00029 00030 /** 00031 * @page test_pools Memory Pools test 00032 * 00033 * File: @ref testpools.c 00034 * 00035 * <h2>Description</h2> 00036 * This module implements the test sequence for the @ref pools subsystem. 00037 * 00038 * <h2>Objective</h2> 00039 * Objective of the test module is to cover 100% of the @ref pools code. 00040 * 00041 * <h2>Preconditions</h2> 00042 * The module requires the following kernel options: 00043 * - @p CH_USE_MEMPOOLS 00044 * . 00045 * In case some of the required options are not enabled then some or all tests 00046 * may be skipped. 00047 * 00048 * <h2>Test Cases</h2> 00049 * - @subpage test_pools_001 00050 * . 00051 * @file testpools.c 00052 * @brief Memory Pools test source file 00053 * @file testpools.h 00054 * @brief Memory Pools test header file 00055 */ 00056 00057 #if CH_USE_MEMPOOLS 00058 00059 static MEMORYPOOL_DECL(mp1, THD_WA_SIZE(THREADS_STACK_SIZE), NULL); 00060 00061 /** 00062 * @page test_pools_001 Allocation and enqueuing test 00063 * 00064 * <h2>Description</h2> 00065 * Five memory blocks are added to a memory pool then removed.<br> 00066 * The test expects to find the pool queue in the proper status after each 00067 * operation. 00068 */ 00069 00070 static void *null_provider(size_t size) { 00071 00072 (void)size; 00073 return NULL; 00074 } 00075 00076 static char *pools1_gettest(void) { 00077 00078 return "Memory Pools, queue/dequeue"; 00079 } 00080 00081 static void pools1_setup(void) { 00082 00083 chPoolInit(&mp1, THD_WA_SIZE(THREADS_STACK_SIZE), NULL); 00084 } 00085 00086 static void pools1_execute(void) { 00087 int i; 00088 00089 /* Adding the WAs to the pool. */ 00090 for (i = 0; i < MAX_THREADS; i++) 00091 chPoolFree(&mp1, wa[i]); 00092 00093 /* Empting the pool again. */ 00094 for (i = 0; i < MAX_THREADS; i++) 00095 test_assert(1, chPoolAlloc(&mp1) != NULL, "list empty"); 00096 00097 /* Now must be empty. */ 00098 test_assert(2, chPoolAlloc(&mp1) == NULL, "list not empty"); 00099 00100 /* Covering the case where a provider is unable to return more memory.*/ 00101 chPoolInit(&mp1, 16, null_provider); 00102 test_assert(3, chPoolAlloc(&mp1) == NULL, "provider returned memory"); 00103 } 00104 00105 const struct testcase testpools1 = { 00106 pools1_gettest, 00107 pools1_setup, 00108 NULL, 00109 pools1_execute 00110 }; 00111 00112 #endif /* CH_USE_MEMPOOLS */ 00113 00114 /* 00115 * @brief Test sequence for pools. 00116 */ 00117 const struct testcase * const patternpools[] = { 00118 #if CH_USE_MEMPOOLS 00119 &testpools1, 00120 #endif 00121 NULL 00122 };