Preliminary main mbed library for nexpaq development

Committer:
nexpaq
Date:
Fri Nov 04 20:54:50 2016 +0000
Revision:
1:d96dbedaebdb
Parent:
0:6c56fb4bc5f0
Removed extra directories for other platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nexpaq 0:6c56fb4bc5f0 1 /*
nexpaq 0:6c56fb4bc5f0 2 * Copyright (c) 2013-2016, ARM Limited, All Rights Reserved
nexpaq 0:6c56fb4bc5f0 3 * SPDX-License-Identifier: Apache-2.0
nexpaq 0:6c56fb4bc5f0 4 *
nexpaq 0:6c56fb4bc5f0 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
nexpaq 0:6c56fb4bc5f0 6 * not use this file except in compliance with the License.
nexpaq 0:6c56fb4bc5f0 7 * You may obtain a copy of the License at
nexpaq 0:6c56fb4bc5f0 8 *
nexpaq 0:6c56fb4bc5f0 9 * http://www.apache.org/licenses/LICENSE-2.0
nexpaq 0:6c56fb4bc5f0 10 *
nexpaq 0:6c56fb4bc5f0 11 * Unless required by applicable law or agreed to in writing, software
nexpaq 0:6c56fb4bc5f0 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
nexpaq 0:6c56fb4bc5f0 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
nexpaq 0:6c56fb4bc5f0 14 * See the License for the specific language governing permissions and
nexpaq 0:6c56fb4bc5f0 15 * limitations under the License.
nexpaq 0:6c56fb4bc5f0 16 */
nexpaq 0:6c56fb4bc5f0 17
nexpaq 0:6c56fb4bc5f0 18 #include "mbed.h"
nexpaq 0:6c56fb4bc5f0 19 #include "greentea-client/test_env.h"
nexpaq 0:6c56fb4bc5f0 20 #include "unity/unity.h"
nexpaq 0:6c56fb4bc5f0 21 #include "utest/utest.h"
nexpaq 0:6c56fb4bc5f0 22 #include "mbed_mem_trace.h"
nexpaq 0:6c56fb4bc5f0 23 #include <stdlib.h>
nexpaq 0:6c56fb4bc5f0 24 #include <stdio.h>
nexpaq 0:6c56fb4bc5f0 25 #include <stdarg.h>
nexpaq 0:6c56fb4bc5f0 26
nexpaq 0:6c56fb4bc5f0 27 #ifndef MBED_MEM_TRACING_ENABLED
nexpaq 0:6c56fb4bc5f0 28 #error [NOT_SUPPORTED] test not supported
nexpaq 0:6c56fb4bc5f0 29 #endif
nexpaq 0:6c56fb4bc5f0 30
nexpaq 0:6c56fb4bc5f0 31 using namespace utest::v1;
nexpaq 0:6c56fb4bc5f0 32
nexpaq 0:6c56fb4bc5f0 33 /******************************************************************************/
nexpaq 0:6c56fb4bc5f0 34 /* Helper functions and data structures */
nexpaq 0:6c56fb4bc5f0 35 /******************************************************************************/
nexpaq 0:6c56fb4bc5f0 36
nexpaq 0:6c56fb4bc5f0 37 // This structure keeps data about the various memory allocation operations,
nexpaq 0:6c56fb4bc5f0 38 // as traced by 'test_trace_cb' below.
nexpaq 0:6c56fb4bc5f0 39 #define TEST_MAX_MEMORY_OPS 10
nexpaq 0:6c56fb4bc5f0 40 // Trace results for all possible operations
nexpaq 0:6c56fb4bc5f0 41 typedef struct {
nexpaq 0:6c56fb4bc5f0 42 uint8_t op;
nexpaq 0:6c56fb4bc5f0 43 void *res;
nexpaq 0:6c56fb4bc5f0 44 union {
nexpaq 0:6c56fb4bc5f0 45 struct {
nexpaq 0:6c56fb4bc5f0 46 size_t arg_size;
nexpaq 0:6c56fb4bc5f0 47 } malloc_info;
nexpaq 0:6c56fb4bc5f0 48 struct {
nexpaq 0:6c56fb4bc5f0 49 void *arg_ptr;
nexpaq 0:6c56fb4bc5f0 50 size_t arg_size;
nexpaq 0:6c56fb4bc5f0 51 } realloc_info;
nexpaq 0:6c56fb4bc5f0 52 struct {
nexpaq 0:6c56fb4bc5f0 53 size_t arg_nmemb;
nexpaq 0:6c56fb4bc5f0 54 size_t arg_size;
nexpaq 0:6c56fb4bc5f0 55 } calloc_info;
nexpaq 0:6c56fb4bc5f0 56 struct {
nexpaq 0:6c56fb4bc5f0 57 void *arg_ptr;
nexpaq 0:6c56fb4bc5f0 58 } free_info;
nexpaq 0:6c56fb4bc5f0 59 };
nexpaq 0:6c56fb4bc5f0 60 } mem_trace_data_t;
nexpaq 0:6c56fb4bc5f0 61 // Memory operation statistics
nexpaq 0:6c56fb4bc5f0 62 typedef struct {
nexpaq 0:6c56fb4bc5f0 63 mem_trace_data_t op_data[TEST_MAX_MEMORY_OPS];
nexpaq 0:6c56fb4bc5f0 64 uint32_t total_ops;
nexpaq 0:6c56fb4bc5f0 65 bool invalid_op, overflow;
nexpaq 0:6c56fb4bc5f0 66 } stats_t;
nexpaq 0:6c56fb4bc5f0 67 static stats_t stats;
nexpaq 0:6c56fb4bc5f0 68
nexpaq 0:6c56fb4bc5f0 69 // Clear all the memory statistics
nexpaq 0:6c56fb4bc5f0 70 static void test_clear_stats() {
nexpaq 0:6c56fb4bc5f0 71 memset(&stats, 0, sizeof(stats));
nexpaq 0:6c56fb4bc5f0 72 }
nexpaq 0:6c56fb4bc5f0 73
nexpaq 0:6c56fb4bc5f0 74 // Memory tracer callback that records each operation in "stats" (above)
nexpaq 0:6c56fb4bc5f0 75 extern "C" void test_trace_cb(uint8_t op, void *res, void *caller, ...) {
nexpaq 0:6c56fb4bc5f0 76 va_list va;
nexpaq 0:6c56fb4bc5f0 77 mem_trace_data_t *pmem = stats.op_data + stats.total_ops;
nexpaq 0:6c56fb4bc5f0 78
nexpaq 0:6c56fb4bc5f0 79 if (stats.total_ops >= TEST_MAX_MEMORY_OPS) {
nexpaq 0:6c56fb4bc5f0 80 stats.overflow = true;
nexpaq 0:6c56fb4bc5f0 81 return;
nexpaq 0:6c56fb4bc5f0 82 }
nexpaq 0:6c56fb4bc5f0 83 va_start(va, caller);
nexpaq 0:6c56fb4bc5f0 84 pmem->op = op;
nexpaq 0:6c56fb4bc5f0 85 pmem->res = res;
nexpaq 0:6c56fb4bc5f0 86 switch(op) {
nexpaq 0:6c56fb4bc5f0 87 case MBED_MEM_TRACE_MALLOC:
nexpaq 0:6c56fb4bc5f0 88 pmem->malloc_info.arg_size = va_arg(va, size_t);
nexpaq 0:6c56fb4bc5f0 89 break;
nexpaq 0:6c56fb4bc5f0 90
nexpaq 0:6c56fb4bc5f0 91 case MBED_MEM_TRACE_REALLOC:
nexpaq 0:6c56fb4bc5f0 92 pmem->realloc_info.arg_ptr = va_arg(va, void *);
nexpaq 0:6c56fb4bc5f0 93 pmem->realloc_info.arg_size = va_arg(va, size_t);
nexpaq 0:6c56fb4bc5f0 94 break;
nexpaq 0:6c56fb4bc5f0 95
nexpaq 0:6c56fb4bc5f0 96 case MBED_MEM_TRACE_CALLOC:
nexpaq 0:6c56fb4bc5f0 97 pmem->calloc_info.arg_nmemb = va_arg(va, size_t);
nexpaq 0:6c56fb4bc5f0 98 pmem->calloc_info.arg_size = va_arg(va, size_t);
nexpaq 0:6c56fb4bc5f0 99 break;
nexpaq 0:6c56fb4bc5f0 100
nexpaq 0:6c56fb4bc5f0 101 case MBED_MEM_TRACE_FREE:
nexpaq 0:6c56fb4bc5f0 102 pmem->free_info.arg_ptr = va_arg(va, void *);
nexpaq 0:6c56fb4bc5f0 103 break;
nexpaq 0:6c56fb4bc5f0 104
nexpaq 0:6c56fb4bc5f0 105 default:
nexpaq 0:6c56fb4bc5f0 106 stats.invalid_op = true;
nexpaq 0:6c56fb4bc5f0 107 }
nexpaq 0:6c56fb4bc5f0 108 stats.total_ops ++;
nexpaq 0:6c56fb4bc5f0 109 va_end(va);
nexpaq 0:6c56fb4bc5f0 110 }
nexpaq 0:6c56fb4bc5f0 111
nexpaq 0:6c56fb4bc5f0 112 // Generic sanity checks for the tracer
nexpaq 0:6c56fb4bc5f0 113 static void check_sanity(uint32_t expected_ops) {
nexpaq 0:6c56fb4bc5f0 114 TEST_ASSERT_FALSE(stats.overflow);
nexpaq 0:6c56fb4bc5f0 115 TEST_ASSERT_FALSE(stats.invalid_op);
nexpaq 0:6c56fb4bc5f0 116 TEST_ASSERT_EQUAL_UINT32(stats.total_ops, expected_ops);
nexpaq 0:6c56fb4bc5f0 117 }
nexpaq 0:6c56fb4bc5f0 118
nexpaq 0:6c56fb4bc5f0 119 // Check a "malloc" operation
nexpaq 0:6c56fb4bc5f0 120 static void check_malloc_op(const mem_trace_data_t *p, void *expected_res, size_t expected_arg_size) {
nexpaq 0:6c56fb4bc5f0 121 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_MALLOC);
nexpaq 0:6c56fb4bc5f0 122 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
nexpaq 0:6c56fb4bc5f0 123 TEST_ASSERT_EQUAL_UINT32(p->malloc_info.arg_size, expected_arg_size);
nexpaq 0:6c56fb4bc5f0 124 }
nexpaq 0:6c56fb4bc5f0 125
nexpaq 0:6c56fb4bc5f0 126 // Check a "free" operation
nexpaq 0:6c56fb4bc5f0 127 static void check_free_op(const mem_trace_data_t *p, void *expected_arg_ptr) {
nexpaq 0:6c56fb4bc5f0 128 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_FREE);
nexpaq 0:6c56fb4bc5f0 129 TEST_ASSERT_EQUAL_PTR(p->free_info.arg_ptr, expected_arg_ptr);
nexpaq 0:6c56fb4bc5f0 130 }
nexpaq 0:6c56fb4bc5f0 131
nexpaq 0:6c56fb4bc5f0 132 // Check a "realloc" operation
nexpaq 0:6c56fb4bc5f0 133 static void check_realloc_op(const mem_trace_data_t *p, void *expected_res, void *expected_arg_ptr, size_t expected_arg_size) {
nexpaq 0:6c56fb4bc5f0 134 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_REALLOC);
nexpaq 0:6c56fb4bc5f0 135 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
nexpaq 0:6c56fb4bc5f0 136 TEST_ASSERT_EQUAL_UINT32(p->realloc_info.arg_ptr, expected_arg_ptr);
nexpaq 0:6c56fb4bc5f0 137 TEST_ASSERT_EQUAL_UINT32(p->realloc_info.arg_size, expected_arg_size);
nexpaq 0:6c56fb4bc5f0 138 }
nexpaq 0:6c56fb4bc5f0 139
nexpaq 0:6c56fb4bc5f0 140 // Check a "calloc" operation
nexpaq 0:6c56fb4bc5f0 141 static void check_calloc_op(const mem_trace_data_t *p, void *expected_res, size_t expected_arg_nmemb, size_t expected_arg_size) {
nexpaq 0:6c56fb4bc5f0 142 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_CALLOC);
nexpaq 0:6c56fb4bc5f0 143 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
nexpaq 0:6c56fb4bc5f0 144 TEST_ASSERT_EQUAL_UINT32(p->calloc_info.arg_nmemb, expected_arg_nmemb);
nexpaq 0:6c56fb4bc5f0 145 TEST_ASSERT_EQUAL_UINT32(p->calloc_info.arg_size, expected_arg_size);
nexpaq 0:6c56fb4bc5f0 146 }
nexpaq 0:6c56fb4bc5f0 147
nexpaq 0:6c56fb4bc5f0 148 /******************************************************************************/
nexpaq 0:6c56fb4bc5f0 149 /* Tests */
nexpaq 0:6c56fb4bc5f0 150 /******************************************************************************/
nexpaq 0:6c56fb4bc5f0 151
nexpaq 0:6c56fb4bc5f0 152 // Allocate a single buffer, then free it. Check that tracing matches the operations.
nexpaq 0:6c56fb4bc5f0 153 static void test_case_single_malloc_free() {
nexpaq 0:6c56fb4bc5f0 154 const size_t block_size = 126;
nexpaq 0:6c56fb4bc5f0 155 const mem_trace_data_t *pmem = stats.op_data;
nexpaq 0:6c56fb4bc5f0 156
nexpaq 0:6c56fb4bc5f0 157 test_clear_stats();
nexpaq 0:6c56fb4bc5f0 158 mbed_mem_trace_set_callback(test_trace_cb);
nexpaq 0:6c56fb4bc5f0 159 // Allocate a single memory block
nexpaq 0:6c56fb4bc5f0 160 void *p = malloc(block_size);
nexpaq 0:6c56fb4bc5f0 161 TEST_ASSERT_NOT_EQUAL(p, NULL);
nexpaq 0:6c56fb4bc5f0 162 // Free the memory block
nexpaq 0:6c56fb4bc5f0 163 free(p);
nexpaq 0:6c56fb4bc5f0 164 // Stop tracing
nexpaq 0:6c56fb4bc5f0 165 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 166 // Check tracer result
nexpaq 0:6c56fb4bc5f0 167 check_sanity(2);
nexpaq 0:6c56fb4bc5f0 168 check_malloc_op(pmem ++, p, block_size);
nexpaq 0:6c56fb4bc5f0 169 check_free_op(pmem, p);
nexpaq 0:6c56fb4bc5f0 170 }
nexpaq 0:6c56fb4bc5f0 171
nexpaq 0:6c56fb4bc5f0 172 // Test all memory operations (malloc, realloc, free, calloc)
nexpaq 0:6c56fb4bc5f0 173 static void test_case_all_memory_ops() {
nexpaq 0:6c56fb4bc5f0 174 const size_t malloc_size = 40, realloc_size = 80, nmemb = 25, size = 10;
nexpaq 0:6c56fb4bc5f0 175 const mem_trace_data_t *pmem = stats.op_data;
nexpaq 0:6c56fb4bc5f0 176
nexpaq 0:6c56fb4bc5f0 177 test_clear_stats();
nexpaq 0:6c56fb4bc5f0 178 mbed_mem_trace_set_callback(test_trace_cb);
nexpaq 0:6c56fb4bc5f0 179 // Allocate a single memory block, the realloc it
nexpaq 0:6c56fb4bc5f0 180 void *p_malloc = malloc(malloc_size);
nexpaq 0:6c56fb4bc5f0 181 TEST_ASSERT_NOT_EQUAL(p_malloc, NULL);
nexpaq 0:6c56fb4bc5f0 182 void *p_realloc = realloc(p_malloc, realloc_size);
nexpaq 0:6c56fb4bc5f0 183 TEST_ASSERT_NOT_EQUAL(p_realloc, NULL);
nexpaq 0:6c56fb4bc5f0 184 // Use calloc() now
nexpaq 0:6c56fb4bc5f0 185 void *p_calloc = calloc(nmemb, size);
nexpaq 0:6c56fb4bc5f0 186 //TEST_ASSERT_NOT_EQUAL(p_calloc, NULL);
nexpaq 0:6c56fb4bc5f0 187 // Free the realloc() pointer first, then the calloc() one
nexpaq 0:6c56fb4bc5f0 188 free(p_realloc);
nexpaq 0:6c56fb4bc5f0 189 free(p_calloc);
nexpaq 0:6c56fb4bc5f0 190 // Stop tracing
nexpaq 0:6c56fb4bc5f0 191 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 192 // Check tracer result
nexpaq 0:6c56fb4bc5f0 193 check_sanity(6);
nexpaq 0:6c56fb4bc5f0 194 check_malloc_op(pmem ++, p_malloc, malloc_size);
nexpaq 0:6c56fb4bc5f0 195 check_realloc_op(pmem ++, p_realloc, p_malloc, realloc_size);
nexpaq 0:6c56fb4bc5f0 196 // calloc() calls malloc() internally
nexpaq 0:6c56fb4bc5f0 197 check_malloc_op(pmem ++, p_calloc, nmemb * size);
nexpaq 0:6c56fb4bc5f0 198 check_calloc_op(pmem ++, p_calloc, nmemb, size);
nexpaq 0:6c56fb4bc5f0 199 check_free_op(pmem ++, p_realloc);
nexpaq 0:6c56fb4bc5f0 200 check_free_op(pmem, p_calloc);
nexpaq 0:6c56fb4bc5f0 201 }
nexpaq 0:6c56fb4bc5f0 202
nexpaq 0:6c56fb4bc5f0 203 // Test that tracing is off when using a NULL callback
nexpaq 0:6c56fb4bc5f0 204 static void test_case_trace_off() {
nexpaq 0:6c56fb4bc5f0 205 const size_t malloc_size = 10;
nexpaq 0:6c56fb4bc5f0 206
nexpaq 0:6c56fb4bc5f0 207 test_clear_stats();
nexpaq 0:6c56fb4bc5f0 208 // We don't want any tracing
nexpaq 0:6c56fb4bc5f0 209 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 210 // Allocate a buffer and free it
nexpaq 0:6c56fb4bc5f0 211 void *p_malloc = malloc(malloc_size);
nexpaq 0:6c56fb4bc5f0 212 TEST_ASSERT_NOT_EQUAL(p_malloc, NULL);
nexpaq 0:6c56fb4bc5f0 213 free(p_malloc);
nexpaq 0:6c56fb4bc5f0 214 // Check that we didn't trace anything
nexpaq 0:6c56fb4bc5f0 215 check_sanity(0);
nexpaq 0:6c56fb4bc5f0 216 }
nexpaq 0:6c56fb4bc5f0 217
nexpaq 0:6c56fb4bc5f0 218 // Test partial tracing (start tracing, stop tracing, restart later)
nexpaq 0:6c56fb4bc5f0 219 static void test_case_partial_trace() {
nexpaq 0:6c56fb4bc5f0 220 const size_t malloc_size_1 = 20, malloc_size_2 = 30;
nexpaq 0:6c56fb4bc5f0 221 const mem_trace_data_t *pmem = stats.op_data;
nexpaq 0:6c56fb4bc5f0 222
nexpaq 0:6c56fb4bc5f0 223 test_clear_stats();
nexpaq 0:6c56fb4bc5f0 224 // Start tracing
nexpaq 0:6c56fb4bc5f0 225 mbed_mem_trace_set_callback(test_trace_cb);
nexpaq 0:6c56fb4bc5f0 226 // Allocate a buffer
nexpaq 0:6c56fb4bc5f0 227 void *p_malloc_1 = malloc(malloc_size_1);
nexpaq 0:6c56fb4bc5f0 228 TEST_ASSERT_NOT_EQUAL(p_malloc_1, NULL);
nexpaq 0:6c56fb4bc5f0 229 // Disable tracing before freeing the first buffer
nexpaq 0:6c56fb4bc5f0 230 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 231 free(p_malloc_1);
nexpaq 0:6c56fb4bc5f0 232 // Allocate another buffer (still not traced)
nexpaq 0:6c56fb4bc5f0 233 void *p_malloc_2 = malloc(malloc_size_2);
nexpaq 0:6c56fb4bc5f0 234 TEST_ASSERT_NOT_EQUAL(p_malloc_2, NULL);
nexpaq 0:6c56fb4bc5f0 235 // Re-enable tracing
nexpaq 0:6c56fb4bc5f0 236 mbed_mem_trace_set_callback(test_trace_cb);
nexpaq 0:6c56fb4bc5f0 237 // And free the second buffer (this operation should be tracer)
nexpaq 0:6c56fb4bc5f0 238 free(p_malloc_2);
nexpaq 0:6c56fb4bc5f0 239 // Stop tracing
nexpaq 0:6c56fb4bc5f0 240 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 241 // Check tracer result
nexpaq 0:6c56fb4bc5f0 242 check_sanity(2);
nexpaq 0:6c56fb4bc5f0 243 check_malloc_op(pmem ++, p_malloc_1, malloc_size_1);
nexpaq 0:6c56fb4bc5f0 244 check_free_op(pmem, p_malloc_2);
nexpaq 0:6c56fb4bc5f0 245 }
nexpaq 0:6c56fb4bc5f0 246
nexpaq 0:6c56fb4bc5f0 247 // Test new/delete tracing
nexpaq 0:6c56fb4bc5f0 248 static void test_case_new_delete() {
nexpaq 0:6c56fb4bc5f0 249 const mem_trace_data_t *pmem = stats.op_data;
nexpaq 0:6c56fb4bc5f0 250
nexpaq 0:6c56fb4bc5f0 251 test_clear_stats();
nexpaq 0:6c56fb4bc5f0 252 // Start tracing
nexpaq 0:6c56fb4bc5f0 253 mbed_mem_trace_set_callback(test_trace_cb);
nexpaq 0:6c56fb4bc5f0 254 // Test new, new[], delete and delete[]
nexpaq 0:6c56fb4bc5f0 255 int *p_int = new int;
nexpaq 0:6c56fb4bc5f0 256 int *p_int_array = new int[10];
nexpaq 0:6c56fb4bc5f0 257 delete p_int;
nexpaq 0:6c56fb4bc5f0 258 delete[] p_int_array;
nexpaq 0:6c56fb4bc5f0 259 // Stop tracing
nexpaq 0:6c56fb4bc5f0 260 mbed_mem_trace_set_callback(NULL);
nexpaq 0:6c56fb4bc5f0 261 // Check tracer result
nexpaq 0:6c56fb4bc5f0 262 check_sanity(4);
nexpaq 0:6c56fb4bc5f0 263 check_malloc_op(pmem ++, p_int, sizeof(int));
nexpaq 0:6c56fb4bc5f0 264 check_malloc_op(pmem ++, p_int_array, 10 * sizeof(int));
nexpaq 0:6c56fb4bc5f0 265 check_free_op(pmem ++, p_int);
nexpaq 0:6c56fb4bc5f0 266 check_free_op(pmem ++, p_int_array);
nexpaq 0:6c56fb4bc5f0 267 }
nexpaq 0:6c56fb4bc5f0 268
nexpaq 0:6c56fb4bc5f0 269 static Case cases[] = {
nexpaq 0:6c56fb4bc5f0 270 Case("single malloc/free", test_case_single_malloc_free),
nexpaq 0:6c56fb4bc5f0 271 Case("all memory operations", test_case_all_memory_ops),
nexpaq 0:6c56fb4bc5f0 272 Case("trace off", test_case_trace_off),
nexpaq 0:6c56fb4bc5f0 273 Case("partial trace", test_case_partial_trace),
nexpaq 0:6c56fb4bc5f0 274 Case("test new/delete", test_case_new_delete)
nexpaq 0:6c56fb4bc5f0 275 };
nexpaq 0:6c56fb4bc5f0 276
nexpaq 0:6c56fb4bc5f0 277 static status_t greentea_test_setup(const size_t number_of_cases) {
nexpaq 0:6c56fb4bc5f0 278 GREENTEA_SETUP(20, "default_auto");
nexpaq 0:6c56fb4bc5f0 279 return greentea_test_setup_handler(number_of_cases);
nexpaq 0:6c56fb4bc5f0 280 }
nexpaq 0:6c56fb4bc5f0 281
nexpaq 0:6c56fb4bc5f0 282 static Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
nexpaq 0:6c56fb4bc5f0 283
nexpaq 0:6c56fb4bc5f0 284 int main() {
nexpaq 0:6c56fb4bc5f0 285 // Disable stdout buffering to prevent any unwanted allocations
nexpaq 0:6c56fb4bc5f0 286 setvbuf(stdout, NULL, _IONBF, 0);
nexpaq 0:6c56fb4bc5f0 287 Harness::run(specification);
nexpaq 0:6c56fb4bc5f0 288 }
nexpaq 0:6c56fb4bc5f0 289