]> arthur.barton.de Git - netdata.git/blobdiff - src/unit_test.c
Merge pull request #643 from paulfantom/master
[netdata.git] / src / unit_test.c
old mode 100755 (executable)
new mode 100644 (file)
index 17edeec..dbf9190
@@ -1,8 +1,13 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/resource.h>
+#include <math.h>
 
+#include "common.h"
 #include "storage_number.h"
 #include "rrd.h"
 #include "log.h"
@@ -72,7 +77,7 @@ void benchmark_storage_number(int loop, int multiplier) {
 
        mine = (calculated_number)sizeof(storage_number) * (calculated_number)loop;
        their = (calculated_number)sizeof(calculated_number) * (calculated_number)loop;
-       
+
        if(mine > their) {
                fprintf(stderr, "\nNETDATA NEEDS %0.2Lf TIMES MORE MEMORY. Sorry!\n", (long double)(mine / their));
        }
@@ -111,7 +116,7 @@ void benchmark_storage_number(int loop, int multiplier) {
        mine = total;
 
        fprintf(stderr, "user %0.5Lf, system %0.5Lf, total %0.5Lf\n", (long double)(user / 1000000.0), (long double)(system / 1000000.0), (long double)(total / 1000000.0));
-       
+
        // ------------------------------------------------------------------------
 
        fprintf(stderr, "SYSTEM   LONG DOUBLE PRINTING: ");
@@ -124,7 +129,7 @@ void benchmark_storage_number(int loop, int multiplier) {
                for(i = 0; i < loop ;i++) {
                        n *= multiplier;
                        if(n > STORAGE_NUMBER_POSITIVE_MAX) n = STORAGE_NUMBER_POSITIVE_MIN;
-                       snprintf(buffer, 100, CALCULATED_NUMBER_FORMAT, n);
+                       snprintfz(buffer, 100, CALCULATED_NUMBER_FORMAT, n);
                }
        }
 
@@ -237,41 +242,672 @@ int unit_test_storage()
        return r;
 }
 
+
+// --------------------------------------------------------------------------------------------------------------------
+
+struct feed_values {
+               unsigned long long microseconds;
+               collected_number value;
+};
+
+struct test {
+       char name[100];
+       char description[1024];
+
+       int update_every;
+       unsigned long long multiplier;
+       unsigned long long divisor;
+       int algorithm;
+
+       unsigned long feed_entries;
+       unsigned long result_entries;
+       struct feed_values *feed;
+       calculated_number *results;
+
+       collected_number *feed2;
+       calculated_number *results2;
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test1
+// test absolute values stored
+
+struct feed_values test1_feed[] = {
+               { 0, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+calculated_number test1_results[] = {
+               20, 30, 40, 50, 60, 70, 80, 90, 100
+};
+
+struct test test1 = {
+               "test1",                        // name
+               "test absolute values stored at exactly second boundaries",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_ABSOLUTE,        // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test1_feed,                     // feed
+               test1_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test2
+// test absolute values stored in the middle of second boundaries
+
+struct feed_values test2_feed[] = {
+               { 500000, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+calculated_number test2_results[] = {
+               20, 30, 40, 50, 60, 70, 80, 90, 100
+};
+
+struct test test2 = {
+               "test2",                        // name
+               "test absolute values stored in the middle of second boundaries",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_ABSOLUTE,        // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test2_feed,                     // feed
+               test2_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test3
+
+struct feed_values test3_feed[] = {
+               { 0, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+calculated_number test3_results[] = {
+               10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+struct test test3 = {
+               "test3",                        // name
+               "test incremental values stored at exactly second boundaries",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test3_feed,                     // feed
+               test3_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test4
+
+struct feed_values test4_feed[] = {
+               { 500000, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+calculated_number test4_results[] = {
+               5, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+struct test test4 = {
+               "test4",                        // name
+               "test incremental values stored in the middle of second boundaries",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test4_feed,                     // feed
+               test4_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test5
+
+struct feed_values test5_feed[] = {
+               { 500000, 1000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+               { 1000000, 3000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+               { 1000000, 2000 },
+};
+
+calculated_number test5_results[] = {
+               500, 500, 0, 500, 500, 0, 0, 0, 0
+};
+
+struct test test5 = {
+               "test5",                        // name
+               "test incremental values ups and downs",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test5_feed,                     // feed
+               test5_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test6
+
+struct feed_values test6_feed[] = {
+               { 250000, 1000 },
+               { 250000, 2000 },
+               { 250000, 3000 },
+               { 250000, 4000 },
+               { 250000, 5000 },
+               { 250000, 6000 },
+               { 250000, 7000 },
+               { 250000, 8000 },
+               { 250000, 9000 },
+               { 250000, 10000 },
+               { 250000, 11000 },
+               { 250000, 12000 },
+               { 250000, 13000 },
+               { 250000, 14000 },
+               { 250000, 15000 },
+               { 250000, 16000 },
+};
+
+calculated_number test6_results[] = {
+               3000, 4000, 4000, 4000
+};
+
+struct test test6 = {
+               "test6",                        // name
+               "test incremental values updated within the same second",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               16,                                     // feed entries
+               4,                                      // result entries
+               test6_feed,                     // feed
+               test6_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test7
+
+struct feed_values test7_feed[] = {
+               { 500000, 1000 },
+               { 2000000, 2000 },
+               { 2000000, 3000 },
+               { 2000000, 4000 },
+               { 2000000, 5000 },
+               { 2000000, 6000 },
+               { 2000000, 7000 },
+               { 2000000, 8000 },
+               { 2000000, 9000 },
+               { 2000000, 10000 },
+};
+
+calculated_number test7_results[] = {
+               250, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500
+};
+
+struct test test7 = {
+               "test7",                        // name
+               "test incremental values updated in long durations",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               10,                                     // feed entries
+               18,                                     // result entries
+               test7_feed,                     // feed
+               test7_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test8
+
+struct feed_values test8_feed[] = {
+               { 500000, 1000 },
+               { 2000000, 2000 },
+               { 2000000, 3000 },
+               { 2000000, 4000 },
+               { 2000000, 5000 },
+               { 2000000, 6000 },
+};
+
+calculated_number test8_results[] = {
+               1250, 2000, 2250, 3000, 3250, 4000, 4250, 5000, 5250, 6000
+};
+
+struct test test8 = {
+               "test8",                        // name
+               "test absolute values updated in long durations",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_ABSOLUTE,        // algorithm
+               6,                                      // feed entries
+               10,                                     // result entries
+               test8_feed,                     // feed
+               test8_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test9
+
+struct feed_values test9_feed[] = {
+               { 250000, 1000 },
+               { 250000, 2000 },
+               { 250000, 3000 },
+               { 250000, 4000 },
+               { 250000, 5000 },
+               { 250000, 6000 },
+               { 250000, 7000 },
+               { 250000, 8000 },
+               { 250000, 9000 },
+               { 250000, 10000 },
+               { 250000, 11000 },
+               { 250000, 12000 },
+               { 250000, 13000 },
+               { 250000, 14000 },
+               { 250000, 15000 },
+               { 250000, 16000 },
+};
+
+calculated_number test9_results[] = {
+               4000, 8000, 12000, 16000
+};
+
+struct test test9 = {
+               "test9",                        // name
+               "test absolute values updated within the same second",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_ABSOLUTE,        // algorithm
+               16,                                     // feed entries
+               4,                                      // result entries
+               test9_feed,                     // feed
+               test9_results,          // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test10
+
+struct feed_values test10_feed[] = {
+               { 500000,  1000 },
+               { 600000,  1000 +  600 },
+               { 200000,  1600 +  200 },
+               { 1000000, 1800 + 1000 },
+               { 200000,  2800 +  200 },
+               { 2000000, 3000 + 2000 },
+               { 600000,  5000 +  600 },
+               { 400000,  5600 +  400 },
+               { 900000,  6000 +  900 },
+               { 1000000, 6900 + 1000 },
+};
+
+calculated_number test10_results[] = {
+               500, 1000, 1000, 1000, 1000, 1000, 1000
+};
+
+struct test test10 = {
+               "test10",                       // name
+               "test incremental values updated in short and long durations",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_INCREMENTAL,     // algorithm
+               10,                                     // feed entries
+               7,                                      // result entries
+               test10_feed,            // feed
+               test10_results,         // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test11
+
+struct feed_values test11_feed[] = {
+               { 0, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+collected_number test11_feed2[] = {
+       10, 20, 30, 40, 50, 60, 70, 80, 90, 100
+};
+
+calculated_number test11_results[] = {
+               50, 50, 50, 50, 50, 50, 50, 50, 50
+};
+
+calculated_number test11_results2[] = {
+               50, 50, 50, 50, 50, 50, 50, 50, 50
+};
+
+struct test test11 = {
+               "test11",                       // name
+               "test percentage-of-incremental-row with equal values",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_PCENT_OVER_DIFF_TOTAL,   // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test11_feed,            // feed
+               test11_results,         // results
+               test11_feed2,           // feed2
+               test11_results2         // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test12
+
+struct feed_values test12_feed[] = {
+               { 0, 10 },
+               { 1000000, 20 },
+               { 1000000, 30 },
+               { 1000000, 40 },
+               { 1000000, 50 },
+               { 1000000, 60 },
+               { 1000000, 70 },
+               { 1000000, 80 },
+               { 1000000, 90 },
+               { 1000000, 100 },
+};
+
+collected_number test12_feed2[] = {
+       10*3, 20*3, 30*3, 40*3, 50*3, 60*3, 70*3, 80*3, 90*3, 100*3
+};
+
+calculated_number test12_results[] = {
+               25, 25, 25, 25, 25, 25, 25, 25, 25
+};
+
+calculated_number test12_results2[] = {
+               75, 75, 75, 75, 75, 75, 75, 75, 75
+};
+
+struct test test12 = {
+               "test12",                       // name
+               "test percentage-of-incremental-row with equal values",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_PCENT_OVER_DIFF_TOTAL,   // algorithm
+               10,                                     // feed entries
+               9,                                      // result entries
+               test12_feed,            // feed
+               test12_results,         // results
+               test12_feed2,           // feed2
+               test12_results2         // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+// test13
+
+struct feed_values test13_feed[] = {
+               { 500000,  1000 },
+               { 600000,  1000 +  600 },
+               { 200000,  1600 +  200 },
+               { 1000000, 1800 + 1000 },
+               { 200000,  2800 +  200 },
+               { 2000000, 3000 + 2000 },
+               { 600000,  5000 +  600 },
+               { 400000,  5600 +  400 },
+               { 900000,  6000 +  900 },
+               { 1000000, 6900 + 1000 },
+};
+
+calculated_number test13_results[] = {
+               83.3333300, 100, 100, 100, 100, 100, 100
+};
+
+struct test test13 = {
+               "test13",                       // name
+               "test incremental values updated in short and long durations",
+               1,                                      // update_every
+               1,                                      // multiplier
+               1,                                      // divisor
+               RRDDIM_PCENT_OVER_DIFF_TOTAL,   // algorithm
+               10,                                     // feed entries
+               7,                                      // result entries
+               test13_feed,            // feed
+               test13_results,         // results
+               NULL,                           // feed2
+               NULL                            // results2
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+
+int run_test(struct test *test)
+{
+       fprintf(stderr, "\nRunning test '%s':\n%s\n", test->name, test->description);
+
+       rrd_memory_mode = RRD_MEMORY_MODE_RAM;
+       rrd_update_every = test->update_every;
+
+       char name[101];
+       snprintfz(name, 100, "unittest-%s", test->name);
+
+       // create the chart
+       RRDSET *st = rrdset_create("netdata", name, name, "netdata", NULL, "Unit Testing", "a value", 1, 1, RRDSET_TYPE_LINE);
+       RRDDIM *rd = rrddim_add(st, "dim1", NULL, test->multiplier, test->divisor, test->algorithm);
+       
+       RRDDIM *rd2 = NULL;
+       if(test->feed2)
+               rd2 = rrddim_add(st, "dim2", NULL, test->multiplier, test->divisor, test->algorithm);
+
+       st->debug = 1;
+
+       // feed it with the test data
+       unsigned long c;
+       for(c = 0; c < test->feed_entries; c++) {
+               if(debug_flags) fprintf(stderr, "\n\n");
+
+               if(c) {
+                       fprintf(stderr, "    > %s: feeding position %lu, after %llu microseconds\n", test->name, c+1, test->feed[c].microseconds);
+                       rrdset_next_usec(st, test->feed[c].microseconds);
+               }
+               else {
+                       fprintf(stderr, "    > %s: feeding position %lu\n", test->name, c+1);
+               }
+
+               fprintf(stderr, "       >> %s with value " COLLECTED_NUMBER_FORMAT "\n", rd->name, test->feed[c].value);
+               rrddim_set(st, "dim1", test->feed[c].value);
+
+               if(rd2) {
+                       fprintf(stderr, "       >> %s with value " COLLECTED_NUMBER_FORMAT "\n", rd2->name, test->feed2[c]);
+                       rrddim_set(st, "dim2", test->feed2[c]);
+               }
+
+               rrdset_done(st);
+
+               // align the first entry to second boundary
+               if(!c) {
+                       fprintf(stderr, "    > %s: fixing first collection time to be %llu microseconds to second boundary\n", test->name, test->feed[c].microseconds);
+                       rd->last_collected_time.tv_usec = st->last_collected_time.tv_usec = st->last_updated.tv_usec = test->feed[c].microseconds;
+               }
+       }
+
+       // check the result
+       int errors = 0;
+
+       if(st->counter != test->result_entries) {
+               fprintf(stderr, "    %s stored %lu entries, but we were expecting %lu, ### E R R O R ###\n", test->name, st->counter, test->result_entries);
+               errors++;
+       }
+
+       unsigned long max = (st->counter < test->result_entries)?st->counter:test->result_entries;
+       for(c = 0 ; c < max ; c++) {
+               calculated_number v = unpack_storage_number(rd->values[c]);
+               calculated_number n = test->results[c];
+               int same = (roundl(v * 10000000.0) == roundl(n * 10000000.0))?1:0;
+               fprintf(stderr, "    %s/%s: checking position %lu, expecting value " CALCULATED_NUMBER_FORMAT ", found " CALCULATED_NUMBER_FORMAT ", %s\n", test->name, rd->name, c+1, n, v, (same)?"OK":"### E R R O R ###");
+               if(!same) errors++;
+
+               if(rd2) {
+                       v = unpack_storage_number(rd2->values[c]);
+                       n = test->results2[c];
+                       same = (roundl(v * 10000000.0) == roundl(n * 10000000.0))?1:0;
+                       fprintf(stderr, "    %s/%s: checking position %lu, expecting value " CALCULATED_NUMBER_FORMAT ", found " CALCULATED_NUMBER_FORMAT ", %s\n", test->name, rd2->name, c+1, n, v, (same)?"OK":"### E R R O R ###");
+                       if(!same) errors++;
+               }
+       }
+
+       return errors;
+}
+
+int run_all_mockup_tests(void)
+{
+       if(run_test(&test1))
+               return 1;
+
+       if(run_test(&test2))
+               return 1;
+
+       if(run_test(&test3))
+               return 1;
+
+       if(run_test(&test4))
+               return 1;
+
+       if(run_test(&test5))
+               return 1;
+
+       if(run_test(&test6))
+               return 1;
+
+       if(run_test(&test7))
+               return 1;
+
+       if(run_test(&test8))
+               return 1;
+
+       if(run_test(&test9))
+               return 1;
+
+       if(run_test(&test10))
+               return 1;
+
+       if(run_test(&test11))
+               return 1;
+
+       if(run_test(&test12))
+               return 1;
+
+       if(run_test(&test13))
+               return 1;
+
+       return 0;
+}
+
 int unit_test(long delay, long shift)
 {
        static int repeat = 0;
        repeat++;
 
        char name[101];
-       snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
+       snprintfz(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
 
-       debug_flags = 0xffffffff;
-       memory_mode = NETDATA_MEMORY_MODE_RAM;
-       update_every = 1;
+       //debug_flags = 0xffffffff;
+       rrd_memory_mode = RRD_MEMORY_MODE_RAM;
+       rrd_update_every = 1;
 
        int do_abs = 1;
        int do_inc = 1;
-       int do_abst = 1;
-       int do_absi = 1;
+       int do_abst = 0;
+       int do_absi = 0;
 
-       RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
+       RRDSET *st = rrdset_create("netdata", name, name, "netdata", NULL, "Unit Testing", "a value", 1, 1, RRDSET_TYPE_LINE);
        st->debug = 1;
 
-       RRD_DIMENSION *rdabs = NULL;
-       RRD_DIMENSION *rdinc = NULL;
-       RRD_DIMENSION *rdabst = NULL;
-       RRD_DIMENSION *rdabsi = NULL;
+       RRDDIM *rdabs = NULL;
+       RRDDIM *rdinc = NULL;
+       RRDDIM *rdabst = NULL;
+       RRDDIM *rdabsi = NULL;
 
-       if(do_abs) rdabs = rrd_stats_dimension_add(st, "absolute", "absolute", 1, 1, RRD_DIMENSION_ABSOLUTE);
-       if(do_inc) rdinc = rrd_stats_dimension_add(st, "incremental", "incremental", 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-       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);
-       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);
+       if(do_abs) rdabs = rrddim_add(st, "absolute", "absolute", 1, 1, RRDDIM_ABSOLUTE);
+       if(do_inc) rdinc = rrddim_add(st, "incremental", "incremental", 1, 1, RRDDIM_INCREMENTAL);
+       if(do_abst) rdabst = rrddim_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRDDIM_PCENT_OVER_ROW_TOTAL);
+       if(do_absi) rdabsi = rrddim_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
 
        long increment = 1000;
        collected_number i = 0;
 
        unsigned long c, dimensions = 0;
-       RRD_DIMENSION *rd;
+       RRDDIM *rd;
        for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
 
        for(c = 0; c < 20 ;c++) {
@@ -279,12 +915,12 @@ int unit_test(long delay, long shift)
 
                fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i);
                if(c) {
-                       rrd_stats_next_usec(st, delay);
+                       rrdset_next_usec(st, delay);
                }
-               if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
-               if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
-               if(do_abst) rrd_stats_dimension_set(st, "percentage-of-absolute-row", i);
-               if(do_absi) rrd_stats_dimension_set(st, "percentage-of-incremental-row", i);
+               if(do_abs) rrddim_set(st, "absolute", i);
+               if(do_inc) rrddim_set(st, "incremental", i);
+               if(do_abst) rrddim_set(st, "percentage-of-absolute-row", i);
+               if(do_absi) rrddim_set(st, "percentage-of-incremental-row", i);
 
                if(!c) {
                        gettimeofday(&st->last_collected_time, NULL);
@@ -292,37 +928,41 @@ int unit_test(long delay, long shift)
                }
 
                // prevent it from deleting the dimensions
-               for(rd = st->dimensions ; rd ; rd = rd->next) rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec;
+               for(rd = st->dimensions ; rd ; rd = rd->next)
+                       rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec;
 
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        unsigned long oincrement = increment;
        increment = increment * st->update_every * 1000000 / delay;
-       fprintf(stderr, "\n\nORIGINAL INCREMENT: %lu, INCREMENT %lu, DELAY %lu, SHIFT %lu\n", oincrement * 10, increment * 10, delay, shift);
+       fprintf(stderr, "\n\nORIGINAL INCREMENT: %lu, INCREMENT %ld, DELAY %ld, SHIFT %ld\n", oincrement * 10, increment * 10, delay, shift);
 
        int ret = 0;
-       storage_number v;
+       storage_number sn;
+       calculated_number cn, v;
        for(c = 0 ; c < st->counter ; c++) {
-               fprintf(stderr, "\nPOSITION: c = %lu, VALUE %lu\n", c, (oincrement + c * increment + increment * (1000000 - shift) / 1000000 )* 10);
+               fprintf(stderr, "\nPOSITION: c = %lu, EXPECTED VALUE %lu\n", c, (oincrement + c * increment + increment * (1000000 - shift) / 1000000 )* 10);
 
                for(rd = st->dimensions ; rd ; rd = rd->next) {
-                       fprintf(stderr, "\t %s " STORAGE_NUMBER_FORMAT "   ->   ", rd->id, rd->values[c]);
-
-                       if(rd == rdabs) v = 
-                               (         oincrement 
-                                       + (increment * (1000000 - shift) / 1000000)
-                                       + c * increment
-                               ) * 10;
-
-                       else if(rd == rdinc) v = (c?(increment):(increment * (1000000 - shift) / 1000000)) * 10;
-                       else if(rd == rdabst) v = oincrement / dimensions;
-                       else if(rd == rdabsi) v = oincrement / dimensions;
+                       sn = rd->values[c];
+                       cn = unpack_storage_number(sn);
+                       fprintf(stderr, "\t %s " CALCULATED_NUMBER_FORMAT " (PACKED AS " STORAGE_NUMBER_FORMAT ")   ->   ", rd->id, cn, sn);
+
+                       if(rd == rdabs) v =
+                               (         oincrement
+                                       // + (increment * (1000000 - shift) / 1000000)
+                                       + (c + 1) * increment
+                               );
+
+                       else if(rd == rdinc) v = (c?(increment):(increment * (1000000 - shift) / 1000000));
+                       else if(rd == rdabst) v = oincrement / dimensions / 10;
+                       else if(rd == rdabsi) v = oincrement / dimensions / 10;
                        else v = 0;
 
-                       if(v == rd->values[c]) fprintf(stderr, "passed.\n");
+                       if(v == cn) fprintf(stderr, "passed.\n");
                        else {
-                               fprintf(stderr, "ERROR! (expected " STORAGE_NUMBER_FORMAT ")\n", v);
+                               fprintf(stderr, "ERROR! (expected " CALCULATED_NUMBER_FORMAT ")\n", v);
                                ret = 1;
                        }
                }
@@ -333,4 +973,3 @@ int unit_test(long delay, long shift)
 
        return ret;
 }
-