]> arthur.barton.de Git - netdata.git/blob - src/unit_test.c
added nfacct charts (disabled for the moment - they must be made an external plugin...
[netdata.git] / src / unit_test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include "storage_number.h"
5 #include "rrd.h"
6 #include "log.h"
7 #include "web_buffer.h"
8
9 int unit_test_storage()
10 {
11         char buffer[100], *msg;
12         storage_number s;
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;
15
16         for(g = -1; g <= 1 ; g++) {
17                 a = 0;
18
19                 if(!g) continue;
20
21                 for(j = 0; j < 9 ;j++) {
22                         a += 0.0000001;
23                         c = a * g;
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;
27
28                                 s = pack_storage_number(c);
29                                 d = unpack_storage_number(s);
30
31                                 ddiff = d - c;
32                                 dcdiff = ddiff * 100.0 / c;
33                                 if(dcdiff < 0) dcdiff = -dcdiff;
34                                 if(dcdiff > maxddiff) maxddiff = dcdiff;
35
36                                 f = d / c;
37
38                                 l = print_calculated_number(buffer, d);
39                                 p = strtold(buffer, NULL);
40                                 pdiff = c - p;
41                                 pcdiff = pdiff * 100.0 / c;
42                                 if(pcdiff < 0) pcdiff = -pcdiff;
43                                 if(pcdiff > maxpdiff) maxpdiff = pcdiff;
44
45                                 if(f < 0.99999 || f > 1.00001) {
46                                         msg = "ERROR";
47                                         r++;
48                                 }
49                                 else msg = "OK";
50
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",
56                                         msg,
57                                         c,
58                                         d, s, ddiff, dcdiff,
59                                         buffer,
60                                         l, p, pdiff, pcdiff
61                                 );
62                         }
63                 }
64         }
65
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);
68
69         return r;
70 }
71
72 int unit_test(long delay, long shift)
73 {
74         static int repeat = 0;
75         repeat++;
76
77         char name[101];
78         snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
79
80         debug_flags = 0xffffffff;
81         memory_mode = NETDATA_MEMORY_MODE_RAM;
82         update_every = 1;
83
84         int do_abs = 1;
85         int do_inc = 1;
86         int do_abst = 1;
87         int do_absi = 1;
88
89         RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
90         st->debug = 1;
91
92         RRD_DIMENSION *rdabs = NULL;
93         RRD_DIMENSION *rdinc = NULL;
94         RRD_DIMENSION *rdabst = NULL;
95         RRD_DIMENSION *rdabsi = NULL;
96
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);
101
102         long increment = 1000;
103         collected_number i = 0;
104
105         unsigned long c, dimensions = 0;
106         RRD_DIMENSION *rd;
107         for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
108
109         for(c = 0; c < 20 ;c++) {
110                 i += increment;
111
112                 fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i);
113                 if(c) {
114                         rrd_stats_next_usec(st, delay);
115                 }
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);
120
121                 if(!c) {
122                         gettimeofday(&st->last_collected_time, NULL);
123                         st->last_collected_time.tv_usec = shift;
124                 }
125
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;
128
129                 rrd_stats_done(st);
130         }
131
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);
135
136         int ret = 0;
137         storage_number v;
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);
140
141                 for(rd = st->dimensions ; rd ; rd = rd->next) {
142                         fprintf(stderr, "\t %s " STORAGE_NUMBER_FORMAT "   ->   ", rd->id, rd->values[c]);
143
144                         if(rd == rdabs) v = 
145                                 (         oincrement 
146                                         + (increment * (1000000 - shift) / 1000000)
147                                         + c * increment
148                                 ) * 10;
149
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;
153                         else v = 0;
154
155                         if(v == rd->values[c]) fprintf(stderr, "passed.\n");
156                         else {
157                                 fprintf(stderr, "ERROR! (expected " STORAGE_NUMBER_FORMAT ")\n", v);
158                                 ret = 1;
159                         }
160                 }
161         }
162
163         if(ret)
164                 fprintf(stderr, "\n\nUNIT TEST(%ld, %ld) FAILED\n\n", delay, shift);
165
166         return ret;
167 }
168