16df3ef80SGreg Tucker /**********************************************************************
26df3ef80SGreg Tucker Copyright(c) 2011-2016 Intel Corporation All rights reserved.
36df3ef80SGreg Tucker
46df3ef80SGreg Tucker Redistribution and use in source and binary forms, with or without
56df3ef80SGreg Tucker modification, are permitted provided that the following conditions
66df3ef80SGreg Tucker are met:
76df3ef80SGreg Tucker * Redistributions of source code must retain the above copyright
86df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer.
96df3ef80SGreg Tucker * Redistributions in binary form must reproduce the above copyright
106df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer in
116df3ef80SGreg Tucker the documentation and/or other materials provided with the
126df3ef80SGreg Tucker distribution.
136df3ef80SGreg Tucker * Neither the name of Intel Corporation nor the names of its
146df3ef80SGreg Tucker contributors may be used to endorse or promote products derived
156df3ef80SGreg Tucker from this software without specific prior written permission.
166df3ef80SGreg Tucker
176df3ef80SGreg Tucker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186df3ef80SGreg Tucker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196df3ef80SGreg Tucker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206df3ef80SGreg Tucker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216df3ef80SGreg Tucker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226df3ef80SGreg Tucker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236df3ef80SGreg Tucker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246df3ef80SGreg Tucker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256df3ef80SGreg Tucker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266df3ef80SGreg Tucker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276df3ef80SGreg Tucker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286df3ef80SGreg Tucker **********************************************************************/
296df3ef80SGreg Tucker
306df3ef80SGreg Tucker #ifndef _TEST_H
316df3ef80SGreg Tucker #define _TEST_H
326df3ef80SGreg Tucker
336df3ef80SGreg Tucker #ifdef __cplusplus
346df3ef80SGreg Tucker extern "C" {
356df3ef80SGreg Tucker #endif
366df3ef80SGreg Tucker
3792aa5aa4SGreg Tucker #include "endian_helper.h"
3892aa5aa4SGreg Tucker
397080fff2SMarcel Cornu #define DIM(_x) (sizeof(_x) / sizeof(_x[0]))
407080fff2SMarcel Cornu
411de5344dSMarcel Cornu #define CHECK_RETURN_GOTO(state, expected, func, label) \
421de5344dSMarcel Cornu do { \
4378d8d8a4SMarcel Cornu if ((state) != (expected)) { \
4478d8d8a4SMarcel Cornu printf("test: %s() - expected return " \
451de5344dSMarcel Cornu "value %d, got %d\n", \
461de5344dSMarcel Cornu func, expected, state); \
4778d8d8a4SMarcel Cornu goto label; \
4878d8d8a4SMarcel Cornu } \
4978d8d8a4SMarcel Cornu } while (0)
5078d8d8a4SMarcel Cornu
516df3ef80SGreg Tucker // Use sys/time.h functions for time
52*96f24e8cSPablo de Lara #if defined(__unix__) || (__MINGW32__)
536df3ef80SGreg Tucker #include <sys/time.h>
54d6f5620fSHailiang Wang #endif
556df3ef80SGreg Tucker
5646a2c9ffSGreg Tucker #ifdef _MSC_VER
5746a2c9ffSGreg Tucker #define inline __inline
5846a2c9ffSGreg Tucker #include <time.h>
5946a2c9ffSGreg Tucker #include <Windows.h>
6046a2c9ffSGreg Tucker #endif
6146a2c9ffSGreg Tucker
6246a2c9ffSGreg Tucker #include <stdio.h>
6346a2c9ffSGreg Tucker #include <stdint.h>
6446a2c9ffSGreg Tucker
656df3ef80SGreg Tucker struct perf {
666df3ef80SGreg Tucker struct timeval tv;
676df3ef80SGreg Tucker };
686df3ef80SGreg Tucker
69*96f24e8cSPablo de Lara #if defined(__unix__) || (__MINGW32__)
701de5344dSMarcel Cornu static inline int
perf_start(struct perf * p)711de5344dSMarcel Cornu perf_start(struct perf *p)
726df3ef80SGreg Tucker {
736df3ef80SGreg Tucker return gettimeofday(&(p->tv), 0);
746df3ef80SGreg Tucker }
751de5344dSMarcel Cornu static inline int
perf_stop(struct perf * p)761de5344dSMarcel Cornu perf_stop(struct perf *p)
776df3ef80SGreg Tucker {
786df3ef80SGreg Tucker return gettimeofday(&(p->tv), 0);
796df3ef80SGreg Tucker }
806df3ef80SGreg Tucker
811de5344dSMarcel Cornu static inline void
perf_print(struct perf stop,struct perf start,long long dsize)821de5344dSMarcel Cornu perf_print(struct perf stop, struct perf start, long long dsize)
836df3ef80SGreg Tucker {
846df3ef80SGreg Tucker long long secs = stop.tv.tv_sec - start.tv.tv_sec;
856df3ef80SGreg Tucker long long usecs = secs * 1000000 + stop.tv.tv_usec - start.tv.tv_usec;
866df3ef80SGreg Tucker
876df3ef80SGreg Tucker printf("runtime = %10lld usecs", usecs);
886df3ef80SGreg Tucker if (dsize != 0) {
896df3ef80SGreg Tucker #if 1 // not bug in printf for 32-bit
906df3ef80SGreg Tucker printf(", bandwidth %lld MB in %.4f sec = %.2f MB/s\n", dsize / (1024 * 1024),
916df3ef80SGreg Tucker ((double) usecs) / 1000000, ((double) dsize) / (double) usecs);
926df3ef80SGreg Tucker #else
936df3ef80SGreg Tucker printf(", bandwidth %lld MB ", dsize / (1024 * 1024));
946df3ef80SGreg Tucker printf("in %.4f sec ", (double) usecs / 1000000);
956df3ef80SGreg Tucker printf("= %.2f MB/s\n", (double) dsize / usecs);
966df3ef80SGreg Tucker #endif
971de5344dSMarcel Cornu } else
986df3ef80SGreg Tucker printf("\n");
996df3ef80SGreg Tucker }
100d6f5620fSHailiang Wang #endif
1016df3ef80SGreg Tucker
1021de5344dSMarcel Cornu static inline uint64_t
get_filesize(FILE * fp)1031de5344dSMarcel Cornu get_filesize(FILE *fp)
104d6f5620fSHailiang Wang {
105d6f5620fSHailiang Wang uint64_t file_size;
106d6f5620fSHailiang Wang fpos_t pos, pos_curr;
107d6f5620fSHailiang Wang
108d6f5620fSHailiang Wang fgetpos(fp, &pos_curr); /* Save current position */
10946a2c9ffSGreg Tucker #if defined(_WIN32) || defined(_WIN64)
11046a2c9ffSGreg Tucker _fseeki64(fp, 0, SEEK_END);
11146a2c9ffSGreg Tucker #else
112d6f5620fSHailiang Wang fseeko(fp, 0, SEEK_END);
11346a2c9ffSGreg Tucker #endif
114d6f5620fSHailiang Wang fgetpos(fp, &pos);
115d6f5620fSHailiang Wang file_size = *(uint64_t *) &pos;
116d6f5620fSHailiang Wang fsetpos(fp, &pos_curr); /* Restore position */
117d6f5620fSHailiang Wang
118d6f5620fSHailiang Wang return file_size;
119d6f5620fSHailiang Wang }
1206df3ef80SGreg Tucker
1216df3ef80SGreg Tucker #ifdef __cplusplus
1226df3ef80SGreg Tucker }
1236df3ef80SGreg Tucker #endif
1246df3ef80SGreg Tucker
1256df3ef80SGreg Tucker #endif // _TEST_H
126