4 #include "storage_number.h"
7 #include "web_buffer.h"
9 int unit_test_storage()
11 char buffer[100], *msg;
13 calculated_number c, a = 0, d, ddiff, dcdiff, f, p, pdiff, pcdiff, maxddiff = 0, maxpdiff = 0;
14 int i, j, g, r = 0, l;
16 for(g = -1; g <= 1 ; g++) {
21 for(j = 0; j < 9 ;j++) {
24 for(i = 0; i < 21 ;i++, c *= 10) {
25 if(c > 0 && c < 0.00001) continue;
26 if(c < 0 && c > -0.00001) continue;
28 s = pack_storage_number(c);
29 d = unpack_storage_number(s);
32 dcdiff = ddiff * 100.0 / c;
33 if(dcdiff < 0) dcdiff = -dcdiff;
34 if(dcdiff > maxddiff) maxddiff = dcdiff;
38 l = print_calculated_number(buffer, d);
39 p = strtold(buffer, NULL);
41 pcdiff = pdiff * 100.0 / c;
42 if(pcdiff < 0) pcdiff = -pcdiff;
43 if(pcdiff > maxpdiff) maxpdiff = pcdiff;
45 if(f < 0.99999 || f > 1.00001) {
51 fprintf(stderr, "%s\n"
52 CALCULATED_NUMBER_FORMAT " original\n"
53 CALCULATED_NUMBER_FORMAT " unpacked, (stored as 0x%08X, diff " CALCULATED_NUMBER_FORMAT ", " CALCULATED_NUMBER_FORMAT "%%)\n"
54 "%s printed (%d bytes)\n"
55 CALCULATED_NUMBER_FORMAT " re-parsed with diff " CALCULATED_NUMBER_FORMAT ", " CALCULATED_NUMBER_FORMAT "%%\n\n",
66 fprintf(stderr, "Worst accuracy loss on unpacked numbers: " CALCULATED_NUMBER_FORMAT "%%\n", maxddiff);
67 fprintf(stderr, "Worst accuracy loss on printed numbers: " CALCULATED_NUMBER_FORMAT "%%\n", maxpdiff);
72 int unit_test(long delay, long shift)
74 static int repeat = 0;
78 snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
80 debug_flags = 0xffffffff;
81 memory_mode = NETDATA_MEMORY_MODE_RAM;
89 RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
92 RRD_DIMENSION *rdabs = NULL;
93 RRD_DIMENSION *rdinc = NULL;
94 RRD_DIMENSION *rdabst = NULL;
95 RRD_DIMENSION *rdabsi = NULL;
97 if(do_abs) rdabs = rrd_stats_dimension_add(st, "absolute", "absolute", 1, 1, RRD_DIMENSION_ABSOLUTE);
98 if(do_inc) rdinc = rrd_stats_dimension_add(st, "incremental", "incremental", 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
99 if(do_abst) rdabst = rrd_stats_dimension_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL);
100 if(do_absi) rdabsi = rrd_stats_dimension_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
102 long increment = 1000;
103 collected_number i = 0;
105 unsigned long c, dimensions = 0;
107 for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
109 for(c = 0; c < 20 ;c++) {
112 fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i);
114 rrd_stats_next_usec(st, delay);
116 if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
117 if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
118 if(do_abst) rrd_stats_dimension_set(st, "percentage-of-absolute-row", i);
119 if(do_absi) rrd_stats_dimension_set(st, "percentage-of-incremental-row", i);
122 gettimeofday(&st->last_collected_time, NULL);
123 st->last_collected_time.tv_usec = shift;
126 // prevent it from deleting the dimensions
127 for(rd = st->dimensions ; rd ; rd = rd->next) rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec;
132 unsigned long oincrement = increment;
133 increment = increment * st->update_every * 1000000 / delay;
134 fprintf(stderr, "\n\nORIGINAL INCREMENT: %lu, INCREMENT %lu, DELAY %lu, SHIFT %lu\n", oincrement * 10, increment * 10, delay, shift);
138 for(c = 0 ; c < st->counter ; c++) {
139 fprintf(stderr, "\nPOSITION: c = %lu, VALUE %lu\n", c, (oincrement + c * increment + increment * (1000000 - shift) / 1000000 )* 10);
141 for(rd = st->dimensions ; rd ; rd = rd->next) {
142 fprintf(stderr, "\t %s " STORAGE_NUMBER_FORMAT " -> ", rd->id, rd->values[c]);
146 + (increment * (1000000 - shift) / 1000000)
150 else if(rd == rdinc) v = (c?(increment):(increment * (1000000 - shift) / 1000000)) * 10;
151 else if(rd == rdabst) v = oincrement / dimensions;
152 else if(rd == rdabsi) v = oincrement / dimensions;
155 if(v == rd->values[c]) fprintf(stderr, "passed.\n");
157 fprintf(stderr, "ERROR! (expected " STORAGE_NUMBER_FORMAT ")\n", v);
164 fprintf(stderr, "\n\nUNIT TEST(%ld, %ld) FAILED\n\n", delay, shift);