ST / ST_Events-old

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Russ Butler
Date:
Sat Aug 13 17:12:03 2016 -0500
Revision:
7514:a0c71f3f3d2f
Heap statistics

Keep track of the current size allocated, maximum size allocated,
number of allocations, failed allocations and total size allocated for
both GCC and ARM. Report the maximum size allocated at the end of
testing.

Also, add a test to verify heap metrics are working as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Russ Butler 7514:a0c71f3f3d2f 1 /*
Russ Butler 7514:a0c71f3f3d2f 2 * Copyright (c) 2013-2016, ARM Limited, All Rights Reserved
Russ Butler 7514:a0c71f3f3d2f 3 * SPDX-License-Identifier: Apache-2.0
Russ Butler 7514:a0c71f3f3d2f 4 *
Russ Butler 7514:a0c71f3f3d2f 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Russ Butler 7514:a0c71f3f3d2f 6 * not use this file except in compliance with the License.
Russ Butler 7514:a0c71f3f3d2f 7 * You may obtain a copy of the License at
Russ Butler 7514:a0c71f3f3d2f 8 *
Russ Butler 7514:a0c71f3f3d2f 9 * http://www.apache.org/licenses/LICENSE-2.0
Russ Butler 7514:a0c71f3f3d2f 10 *
Russ Butler 7514:a0c71f3f3d2f 11 * Unless required by applicable law or agreed to in writing, software
Russ Butler 7514:a0c71f3f3d2f 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Russ Butler 7514:a0c71f3f3d2f 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Russ Butler 7514:a0c71f3f3d2f 14 * See the License for the specific language governing permissions and
Russ Butler 7514:a0c71f3f3d2f 15 * limitations under the License.
Russ Butler 7514:a0c71f3f3d2f 16 */
Russ Butler 7514:a0c71f3f3d2f 17 #include "mbed.h"
Russ Butler 7514:a0c71f3f3d2f 18 #include "greentea-client/test_env.h"
Russ Butler 7514:a0c71f3f3d2f 19 #include "unity/unity.h"
Russ Butler 7514:a0c71f3f3d2f 20 #include "utest/utest.h"
Russ Butler 7514:a0c71f3f3d2f 21 #include "mbed_stats.h"
Russ Butler 7514:a0c71f3f3d2f 22 #include <stdlib.h>
Russ Butler 7514:a0c71f3f3d2f 23 #include <stdio.h>
Russ Butler 7514:a0c71f3f3d2f 24
Russ Butler 7514:a0c71f3f3d2f 25 #if !defined(MBED_HEAP_STATS_ENABLED) || !MBED_HEAP_STATS_ENABLED || defined(__ICCARM__)
Russ Butler 7514:a0c71f3f3d2f 26 #error [NOT_SUPPORTED] test not supported
Russ Butler 7514:a0c71f3f3d2f 27 #endif
Russ Butler 7514:a0c71f3f3d2f 28
Russ Butler 7514:a0c71f3f3d2f 29 using namespace utest::v1;
Russ Butler 7514:a0c71f3f3d2f 30
Russ Butler 7514:a0c71f3f3d2f 31 #define ALLOCATION_SIZE_DEFAULT 564
Russ Butler 7514:a0c71f3f3d2f 32 #define ALLOCATION_SIZE_SMALL 124
Russ Butler 7514:a0c71f3f3d2f 33 #define ALLOCATION_SIZE_LARGE 790
Russ Butler 7514:a0c71f3f3d2f 34 #define ALLOCATION_SIZE_FAIL (1024 * 1024 *1024)
Russ Butler 7514:a0c71f3f3d2f 35
Russ Butler 7514:a0c71f3f3d2f 36 typedef void* (*malloc_cb_t) (uint32_t size);
Russ Butler 7514:a0c71f3f3d2f 37
Russ Butler 7514:a0c71f3f3d2f 38 static void* thunk_malloc(uint32_t size);
Russ Butler 7514:a0c71f3f3d2f 39 static void* thunk_calloc_1(uint32_t size);
Russ Butler 7514:a0c71f3f3d2f 40 static void* thunk_calloc_4(uint32_t size);
Russ Butler 7514:a0c71f3f3d2f 41 static void* thunk_realloc(uint32_t size);
Russ Butler 7514:a0c71f3f3d2f 42
Russ Butler 7514:a0c71f3f3d2f 43 malloc_cb_t malloc_thunk_array[] = {
Russ Butler 7514:a0c71f3f3d2f 44 thunk_malloc,
Russ Butler 7514:a0c71f3f3d2f 45 thunk_calloc_1,
Russ Butler 7514:a0c71f3f3d2f 46 thunk_calloc_4,
Russ Butler 7514:a0c71f3f3d2f 47 thunk_realloc,
Russ Butler 7514:a0c71f3f3d2f 48 };
Russ Butler 7514:a0c71f3f3d2f 49
Russ Butler 7514:a0c71f3f3d2f 50 void test_case_malloc_free_size()
Russ Butler 7514:a0c71f3f3d2f 51 {
Russ Butler 7514:a0c71f3f3d2f 52 printf("Initial print to setup stdio buffers\n");
Russ Butler 7514:a0c71f3f3d2f 53 mbed_stats_heap_t stats_start;
Russ Butler 7514:a0c71f3f3d2f 54 mbed_stats_heap_t stats_current;
Russ Butler 7514:a0c71f3f3d2f 55 void *data;
Russ Butler 7514:a0c71f3f3d2f 56
Russ Butler 7514:a0c71f3f3d2f 57 mbed_stats_heap_get(&stats_start);
Russ Butler 7514:a0c71f3f3d2f 58
Russ Butler 7514:a0c71f3f3d2f 59 for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) {
Russ Butler 7514:a0c71f3f3d2f 60
Russ Butler 7514:a0c71f3f3d2f 61 // Allocate memory and assert size change
Russ Butler 7514:a0c71f3f3d2f 62 data = malloc_thunk_array[i](ALLOCATION_SIZE_DEFAULT);
Russ Butler 7514:a0c71f3f3d2f 63 TEST_ASSERT(data != NULL);
Russ Butler 7514:a0c71f3f3d2f 64 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 65 uint32_t increase = stats_current.current_size - stats_start.current_size;
Russ Butler 7514:a0c71f3f3d2f 66 TEST_ASSERT_EQUAL_UINT32(ALLOCATION_SIZE_DEFAULT, increase);
Russ Butler 7514:a0c71f3f3d2f 67 TEST_ASSERT_EQUAL_UINT32(stats_start.total_size + ALLOCATION_SIZE_DEFAULT * (i + 1), stats_current.total_size);
Russ Butler 7514:a0c71f3f3d2f 68 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt + 1, stats_current.alloc_cnt);
Russ Butler 7514:a0c71f3f3d2f 69 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt);
Russ Butler 7514:a0c71f3f3d2f 70
Russ Butler 7514:a0c71f3f3d2f 71 // Free memory and assert back to starting size
Russ Butler 7514:a0c71f3f3d2f 72 free(data);
Russ Butler 7514:a0c71f3f3d2f 73 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 74 TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size);
Russ Butler 7514:a0c71f3f3d2f 75 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt);
Russ Butler 7514:a0c71f3f3d2f 76 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt);
Russ Butler 7514:a0c71f3f3d2f 77 }
Russ Butler 7514:a0c71f3f3d2f 78 }
Russ Butler 7514:a0c71f3f3d2f 79
Russ Butler 7514:a0c71f3f3d2f 80 void test_case_allocate_zero()
Russ Butler 7514:a0c71f3f3d2f 81 {
Russ Butler 7514:a0c71f3f3d2f 82 mbed_stats_heap_t stats_start;
Russ Butler 7514:a0c71f3f3d2f 83 mbed_stats_heap_t stats_current;
Russ Butler 7514:a0c71f3f3d2f 84 void *data;
Russ Butler 7514:a0c71f3f3d2f 85
Russ Butler 7514:a0c71f3f3d2f 86 mbed_stats_heap_get(&stats_start);
Russ Butler 7514:a0c71f3f3d2f 87
Russ Butler 7514:a0c71f3f3d2f 88 for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) {
Russ Butler 7514:a0c71f3f3d2f 89
Russ Butler 7514:a0c71f3f3d2f 90 // Allocate memory and assert size change
Russ Butler 7514:a0c71f3f3d2f 91 data = malloc_thunk_array[i](0);
Russ Butler 7514:a0c71f3f3d2f 92 // Return can be NULL
Russ Butler 7514:a0c71f3f3d2f 93 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 94 TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size);
Russ Butler 7514:a0c71f3f3d2f 95 TEST_ASSERT_EQUAL_UINT32(stats_start.total_size, stats_current.total_size);
Russ Butler 7514:a0c71f3f3d2f 96 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt);
Russ Butler 7514:a0c71f3f3d2f 97
Russ Butler 7514:a0c71f3f3d2f 98 // Free memory and assert back to starting size
Russ Butler 7514:a0c71f3f3d2f 99 free(data);
Russ Butler 7514:a0c71f3f3d2f 100 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 101 TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size);
Russ Butler 7514:a0c71f3f3d2f 102 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt);
Russ Butler 7514:a0c71f3f3d2f 103 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt);
Russ Butler 7514:a0c71f3f3d2f 104 }
Russ Butler 7514:a0c71f3f3d2f 105 }
Russ Butler 7514:a0c71f3f3d2f 106
Russ Butler 7514:a0c71f3f3d2f 107 void test_case_allocate_fail()
Russ Butler 7514:a0c71f3f3d2f 108 {
Russ Butler 7514:a0c71f3f3d2f 109 mbed_stats_heap_t stats_start;
Russ Butler 7514:a0c71f3f3d2f 110 mbed_stats_heap_t stats_current;
Russ Butler 7514:a0c71f3f3d2f 111 void *data;
Russ Butler 7514:a0c71f3f3d2f 112
Russ Butler 7514:a0c71f3f3d2f 113 mbed_stats_heap_get(&stats_start);
Russ Butler 7514:a0c71f3f3d2f 114
Russ Butler 7514:a0c71f3f3d2f 115 for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) {
Russ Butler 7514:a0c71f3f3d2f 116
Russ Butler 7514:a0c71f3f3d2f 117 // Trigger a failure by trying to allocate a buffer that won't fit
Russ Butler 7514:a0c71f3f3d2f 118 data = malloc_thunk_array[i](ALLOCATION_SIZE_FAIL);
Russ Butler 7514:a0c71f3f3d2f 119 TEST_ASSERT(data == NULL);
Russ Butler 7514:a0c71f3f3d2f 120 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 121 TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size);
Russ Butler 7514:a0c71f3f3d2f 122 TEST_ASSERT_EQUAL_UINT32(stats_start.total_size, stats_current.total_size);
Russ Butler 7514:a0c71f3f3d2f 123 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt);
Russ Butler 7514:a0c71f3f3d2f 124 TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt + i + 1, stats_current.alloc_fail_cnt);
Russ Butler 7514:a0c71f3f3d2f 125 }
Russ Butler 7514:a0c71f3f3d2f 126 }
Russ Butler 7514:a0c71f3f3d2f 127
Russ Butler 7514:a0c71f3f3d2f 128 static void* thunk_malloc(uint32_t size)
Russ Butler 7514:a0c71f3f3d2f 129 {
Russ Butler 7514:a0c71f3f3d2f 130 printf("Malloc thunk\n");
Russ Butler 7514:a0c71f3f3d2f 131 return malloc(size);
Russ Butler 7514:a0c71f3f3d2f 132 }
Russ Butler 7514:a0c71f3f3d2f 133
Russ Butler 7514:a0c71f3f3d2f 134 static void* thunk_calloc_1(uint32_t size)
Russ Butler 7514:a0c71f3f3d2f 135 {
Russ Butler 7514:a0c71f3f3d2f 136 printf("Calloc thunk 1 byte\n");
Russ Butler 7514:a0c71f3f3d2f 137 return calloc(size / 1, 1);
Russ Butler 7514:a0c71f3f3d2f 138 }
Russ Butler 7514:a0c71f3f3d2f 139
Russ Butler 7514:a0c71f3f3d2f 140 static void* thunk_calloc_4(uint32_t size)
Russ Butler 7514:a0c71f3f3d2f 141 {
Russ Butler 7514:a0c71f3f3d2f 142 printf("Calloc thunk 4 bytes\n");
Russ Butler 7514:a0c71f3f3d2f 143 return calloc(size / 4, 4);
Russ Butler 7514:a0c71f3f3d2f 144 }
Russ Butler 7514:a0c71f3f3d2f 145
Russ Butler 7514:a0c71f3f3d2f 146
Russ Butler 7514:a0c71f3f3d2f 147 static void* thunk_realloc(uint32_t size)
Russ Butler 7514:a0c71f3f3d2f 148 {
Russ Butler 7514:a0c71f3f3d2f 149 printf("Realloc thunk\n");
Russ Butler 7514:a0c71f3f3d2f 150 return realloc(NULL, size);
Russ Butler 7514:a0c71f3f3d2f 151 }
Russ Butler 7514:a0c71f3f3d2f 152
Russ Butler 7514:a0c71f3f3d2f 153 void test_case_realloc_size()
Russ Butler 7514:a0c71f3f3d2f 154 {
Russ Butler 7514:a0c71f3f3d2f 155 mbed_stats_heap_t stats_start;
Russ Butler 7514:a0c71f3f3d2f 156 mbed_stats_heap_t stats_current;
Russ Butler 7514:a0c71f3f3d2f 157 uint32_t increase;
Russ Butler 7514:a0c71f3f3d2f 158 void *data;
Russ Butler 7514:a0c71f3f3d2f 159
Russ Butler 7514:a0c71f3f3d2f 160 mbed_stats_heap_get(&stats_start);
Russ Butler 7514:a0c71f3f3d2f 161
Russ Butler 7514:a0c71f3f3d2f 162 // Allocate memory and assert size change
Russ Butler 7514:a0c71f3f3d2f 163 data = realloc(NULL, ALLOCATION_SIZE_DEFAULT);
Russ Butler 7514:a0c71f3f3d2f 164 TEST_ASSERT(data != NULL);
Russ Butler 7514:a0c71f3f3d2f 165 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 166 increase = stats_current.current_size - stats_start.current_size;
Russ Butler 7514:a0c71f3f3d2f 167 TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_DEFAULT);
Russ Butler 7514:a0c71f3f3d2f 168
Russ Butler 7514:a0c71f3f3d2f 169 // Decrease size and assert size change
Russ Butler 7514:a0c71f3f3d2f 170 data = realloc(data, ALLOCATION_SIZE_SMALL);
Russ Butler 7514:a0c71f3f3d2f 171 TEST_ASSERT(data != NULL);
Russ Butler 7514:a0c71f3f3d2f 172 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 173 increase = stats_current.current_size - stats_start.current_size;
Russ Butler 7514:a0c71f3f3d2f 174 TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_SMALL);
Russ Butler 7514:a0c71f3f3d2f 175
Russ Butler 7514:a0c71f3f3d2f 176 // Increase size and assert size change
Russ Butler 7514:a0c71f3f3d2f 177 data = realloc(data, ALLOCATION_SIZE_LARGE);
Russ Butler 7514:a0c71f3f3d2f 178 TEST_ASSERT(data != NULL);
Russ Butler 7514:a0c71f3f3d2f 179 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 180 increase = stats_current.current_size - stats_start.current_size;
Russ Butler 7514:a0c71f3f3d2f 181 TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_LARGE);
Russ Butler 7514:a0c71f3f3d2f 182
Russ Butler 7514:a0c71f3f3d2f 183 // Free memory and assert back to starting size
Russ Butler 7514:a0c71f3f3d2f 184 free(data);
Russ Butler 7514:a0c71f3f3d2f 185 mbed_stats_heap_get(&stats_current);
Russ Butler 7514:a0c71f3f3d2f 186 TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size);
Russ Butler 7514:a0c71f3f3d2f 187 }
Russ Butler 7514:a0c71f3f3d2f 188
Russ Butler 7514:a0c71f3f3d2f 189 Case cases[] = {
Russ Butler 7514:a0c71f3f3d2f 190 Case("malloc and free size", test_case_malloc_free_size),
Russ Butler 7514:a0c71f3f3d2f 191 Case("allocate size zero", test_case_allocate_zero),
Russ Butler 7514:a0c71f3f3d2f 192 Case("allocation failure", test_case_allocate_fail),
Russ Butler 7514:a0c71f3f3d2f 193 Case("realloc size", test_case_realloc_size),
Russ Butler 7514:a0c71f3f3d2f 194 };
Russ Butler 7514:a0c71f3f3d2f 195
Russ Butler 7514:a0c71f3f3d2f 196 utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
Russ Butler 7514:a0c71f3f3d2f 197 {
Russ Butler 7514:a0c71f3f3d2f 198 GREENTEA_SETUP(20, "default_auto");
Russ Butler 7514:a0c71f3f3d2f 199 return greentea_test_setup_handler(number_of_cases);
Russ Butler 7514:a0c71f3f3d2f 200 }
Russ Butler 7514:a0c71f3f3d2f 201
Russ Butler 7514:a0c71f3f3d2f 202 Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
Russ Butler 7514:a0c71f3f3d2f 203
Russ Butler 7514:a0c71f3f3d2f 204 int main()
Russ Butler 7514:a0c71f3f3d2f 205 {
Russ Butler 7514:a0c71f3f3d2f 206 Harness::run(specification);
Russ Butler 7514:a0c71f3f3d2f 207 }