2 * This file is part of buxton.
4 * Copyright (C) 2013 Intel Corporation
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 #define error(...) { printf(__VA_ARGS__); }
38 static int iterations = 100000;
40 static void callback(BuxtonResponse response, void *userdata)
50 if (buxton_response_status(response) == 0) {
81 #define TEST_COUNT (TEST_TYPE_MAX * TEST_DATA_TYPE_MAX)
82 static struct testcase testcases[TEST_COUNT] = {
83 { "set_int32", TEST_SET, TEST_INT32 },
84 { "get_int32", TEST_GET, TEST_INT32 },
85 { "set_unset_int32", TEST_SET_UNSET, TEST_INT32 },
86 { "set_uint32", TEST_SET, TEST_UINT32 },
87 { "get_uint32", TEST_GET, TEST_UINT32 },
88 { "set_unset_uint32", TEST_SET_UNSET, TEST_UINT32 },
89 { "set_int64", TEST_SET, TEST_INT64 },
90 { "get_int64", TEST_GET, TEST_INT64 },
91 { "set_unset_int64", TEST_SET_UNSET, TEST_INT64 },
92 { "set_uint64", TEST_SET, TEST_UINT64 },
93 { "get_uint64", TEST_GET, TEST_UINT64 },
94 { "set_unset_uint64", TEST_SET_UNSET, TEST_UINT64 },
95 { "set_boolean", TEST_SET, TEST_BOOLEAN },
96 { "get_boolean", TEST_GET, TEST_BOOLEAN },
97 { "set_unset_boolean", TEST_SET_UNSET, TEST_BOOLEAN },
98 { "set_string", TEST_SET, TEST_STRING },
99 { "get_string", TEST_GET, TEST_STRING },
100 { "set_unset_string", TEST_SET_UNSET, TEST_STRING },
101 { "set_string4k", TEST_SET, TEST_STRING4K },
102 { "get_string4k", TEST_GET, TEST_STRING4K },
103 { "set_unset_string4k", TEST_SET_UNSET, TEST_STRING4K },
104 { "set_float", TEST_SET, TEST_FLOAT },
105 { "get_float", TEST_GET, TEST_FLOAT },
106 { "set_unset_float", TEST_SET_UNSET, TEST_FLOAT },
107 { "set_double", TEST_SET, TEST_DOUBLE },
108 { "get_double", TEST_GET, TEST_DOUBLE },
109 { "set_unset_double", TEST_SET_UNSET, TEST_DOUBLE }
112 static BuxtonClient __client;
113 static BuxtonData __data;
114 static BuxtonKey __key;
116 static bool init_group(void)
122 group = buxton_key_create("TimingTest", NULL, "user", STRING);
123 r = buxton_create_group(__client, group, callback, &d, true);
130 static bool testcase_init(struct testcase *tc)
145 sprintf(name, "TimingTest-%d-int32", getpid());
146 __key = buxton_key_create("TimingTest", name, "user", INT32);
151 sprintf(name, "TimingTest-%d-uint32", getpid());
152 __key = buxton_key_create("TimingTest", name, "user", UINT32);
157 sprintf(name, "TimingTest-%d-int64", getpid());
158 __key = buxton_key_create("TimingTest", name, "user", INT64);
163 sprintf(name, "TimingTest-%d-uint64", getpid());
164 __key = buxton_key_create("TimingTest", name, "user", UINT64);
169 sprintf(name, "TimingTest-%d-boolean", getpid());
170 __key = buxton_key_create("TimingTest", name, "user", BOOLEAN);
175 sprintf(name, "TimingTest-%d-string", getpid());
176 __key = buxton_key_create("TimingTest", name, "user", STRING);
181 sprintf(name, "TimingTest-%d-string4k", getpid());
182 __key = buxton_key_create("TimingTest", name, "user", STRING);
183 string = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
187 sprintf(name, "TimingTest-%d-float", getpid());
188 __key = buxton_key_create("TimingTest", name, "user", FLOAT);
193 sprintf(name, "TimingTest-%d-double", getpid());
194 __key = buxton_key_create("TimingTest", name, "user", DOUBLE);
202 return !buxton_set_value(__client, __key, value, callback, NULL, true);
205 static bool testcase_cleanup(struct testcase *tc)
207 bool ret = (!buxton_set_value(__client, __key, &__data, callback, NULL, true) &&
208 !buxton_unset_value(__client, __key, callback, NULL, true));
209 buxton_key_free(__key);
213 static bool testcase_run(struct testcase *tc)
219 r = buxton_get_value(__client, __key, callback, &d, true);
222 r = buxton_set_value(__client, __key, &__data, callback, &d, true);
225 r = buxton_set_value(__client, __key, &__data, callback, &d, true);
226 s = buxton_unset_value(__client, __key, callback, &d, true);
227 return (!s && !r && d);
233 static bool timed_func(unsigned long long *elapsed, struct testcase *tc)
235 struct timespec tsi, tsf;
238 clock_gettime(CLOCK_MONOTONIC, &tsi);
239 ret = testcase_run(tc);
240 clock_gettime(CLOCK_MONOTONIC, &tsf);
242 *elapsed = (unsigned long long)((tsf.tv_nsec - tsi.tv_nsec) + ((tsf.tv_sec - tsi.tv_sec) * 1000000000));
246 static void test(struct testcase *tc)
248 unsigned long long elapsed;
249 unsigned long long total;
250 unsigned long long errors = 0;
262 for (i = 0; i < iterations; i++) {
263 if (!timed_func(&elapsed, tc)) {
267 mean += (double)elapsed;
268 meansqr += (double)elapsed * (double)elapsed;
271 mean /= (double)iterations;
272 meansqr /= (double)iterations;
273 sigma = sqrt(meansqr - (mean * mean));
275 testcase_cleanup(tc);
277 printf("%-24s %10.3lfus %10.3lfus %10llu\n",
278 tc->name, mean / 1000.0, sigma / 1000.0, errors);
281 int main(int argc, char **argv)
283 int ret = EXIT_SUCCESS;
287 iterations = atoi(argv[1]);
288 if (iterations <= 0) {
291 } else if (argc != 1) {
292 error("Usage: %s [iterations]\n", argv[0]);
296 if (!buxton_open(&__client)) {
297 error("Unable to open BuxtonClient\n");
303 printf("Buxton protocol latency timing tool. Using %i iterations per test.\n", iterations);
304 printf("Test Name: Average: Sigma: Errors:\n");
306 for (i = 0; i < TEST_COUNT; i++)
309 buxton_close(__client);