1290001Sglebius#include "config.h"
2290001Sglebius
3290001Sglebius#include <ntp.h>
4290001Sglebius#include <ntp_fp.h>
5290001Sglebius#include <refidsmear.h>
6290001Sglebius
7290001Sglebius//#include "ntp_stdlib.h"
8290001Sglebius//#include "ntp_calendar.h"
9290001Sglebius
10290001Sglebius#include "unity.h"
11290001Sglebius
12290001Sglebius#include <stdio.h>
13290001Sglebius
14290001Sglebius/*
15290001Sglebius * we want to test a refid format of:
16290001Sglebius * 254.x.y.x
17290001Sglebius *
18290001Sglebius * where x.y.z are 24 bits containing 2 (signed) integer bits
19290001Sglebius * and 22 fractional bits.
20290001Sglebius *
21290001Sglebius * we want functions to convert to/from this format, with unit tests.
22290001Sglebius *
23290001Sglebius * Interesting test cases include:
24290001Sglebius * 254.0.0.0
25290001Sglebius * 254.0.0.1
26290001Sglebius * 254.127.255.255
27290001Sglebius * 254.128.0.0
28290001Sglebius * 254.255.255.255
29290001Sglebius */
30290001Sglebius
31290001Sglebius
32293896Sglebiusvoid setUp(void);
33290001Sglebiusvoid rtol(uint32_t r, char *es);
34290001Sglebiusvoid rtoltor(uint32_t er, char *es);
35290001Sglebiusvoid ltor(l_fp l, char *er);
36290001Sglebiusvoid test_refidsmear(void);
37290001Sglebius
38293896Sglebius
39290001Sglebiusvoid
40293896SglebiussetUp(void)
41293896Sglebius{
42293896Sglebius	init_lib();
43293896Sglebius
44293896Sglebius	return;
45293896Sglebius}
46293896Sglebius
47293896Sglebiusvoid
48290001Sglebiusrtol(uint32_t r, char *es)
49290001Sglebius{
50290001Sglebius	l_fp l;
51290001Sglebius	char *as;
52290001Sglebius	char msg[100];
53290001Sglebius
54290001Sglebius	TEST_ASSERT_NOT_NULL(es);
55290001Sglebius
56290001Sglebius	snprintf(msg, 100, "rtol was called with r=%#.8x, es=%s", r, es);
57290001Sglebius
58290001Sglebius	l = convertRefIDToLFP(htonl(r));
59290001Sglebius	as = lfptoa(&l, 8);
60293896Sglebius
61290001Sglebius	//printf("refid %#x, smear %s\n", r, as);
62290001Sglebius
63290001Sglebius	TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
64290001Sglebius	TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);
65290001Sglebius
66290001Sglebius	return;
67290001Sglebius}
68290001Sglebius
69290001Sglebius
70290001Sglebiusvoid
71290001Sglebiusrtoltor(uint32_t er, char *es)
72290001Sglebius{
73290001Sglebius	l_fp l;
74290001Sglebius	char *as;
75290001Sglebius	uint32_t ar;
76290001Sglebius	char msg[100];
77290001Sglebius
78290001Sglebius	TEST_ASSERT_NOT_NULL(es);
79290001Sglebius
80290001Sglebius	snprintf(msg, 100, "rtoltor was called with er=%#.8x, es=%s", er, es);
81290001Sglebius
82290001Sglebius	l = convertRefIDToLFP(htonl(er));
83290001Sglebius	as = lfptoa(&l, 8);
84290001Sglebius
85290001Sglebius	ar = convertLFPToRefID(l);
86290001Sglebius
87290001Sglebius	//printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(ar));
88290001Sglebius
89290001Sglebius	TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
90290001Sglebius	TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);
91290001Sglebius	TEST_ASSERT_EQUAL_UINT_MESSAGE(er, ntohl(ar), msg);
92290001Sglebius
93290001Sglebius	return;
94290001Sglebius}
95290001Sglebius
96290001Sglebius
97290001Sglebiusvoid
98290001Sglebiusltor(l_fp l, char *er)
99290001Sglebius{
100290001Sglebius	uint32_t r;
101290001Sglebius
102290001Sglebius	printf("ltor: ");
103290001Sglebius
104290001Sglebius	r = convertLFPToRefID(l);
105290001Sglebius	printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(r));
106290001Sglebius
107290001Sglebius	return;
108290001Sglebius}
109290001Sglebius
110290001Sglebius
111290001Sglebiusvoid test_refidsmear(void)
112290001Sglebius{
113290001Sglebius
114290001Sglebius	rtol(0xfe800000, "-2.00000000");
115290001Sglebius	rtol(0xfe800001, "-1.99999976");
116290001Sglebius	rtol(0xfe8ffffe, "-1.75000048");
117290001Sglebius	rtol(0xfe8fffff, "-1.75000024");
118290001Sglebius	rtol(0xfef00000, "-0.25000000");
119290001Sglebius	rtol(0xfef00001, "-0.24999976");
120290001Sglebius	rtol(0xfefffffe, "-0.00000048");
121290001Sglebius	rtol(0xfeffffff, "-0.00000024");
122290001Sglebius
123290001Sglebius	rtol(0xfe000000, "0.00000000");
124290001Sglebius	rtol(0xfe000001, "0.00000024");
125290001Sglebius	rtol(0xfe6ffffe, "1.74999952");
126290001Sglebius	rtol(0xfe6fffff, "1.74999976");
127290001Sglebius	rtol(0xfe700000, "1.75000000");
128290001Sglebius	rtol(0xfe700001, "1.75000024");
129290001Sglebius	rtol(0xfe7ffffe, "1.99999952");
130290001Sglebius	rtol(0xfe7fffff, "1.99999976");
131290001Sglebius
132290001Sglebius	rtoltor(0xfe800000, "-2.00000000");
133290001Sglebius	rtoltor(0xfe800001, "-1.99999976");
134290001Sglebius	rtoltor(0xfe8ffffe, "-1.75000048");
135290001Sglebius	rtoltor(0xfe8fffff, "-1.75000024");
136290001Sglebius	rtoltor(0xfef00000, "-0.25000000");
137290001Sglebius	rtoltor(0xfef00001, "-0.24999976");
138290001Sglebius	rtoltor(0xfefffffe, "-0.00000048");
139290001Sglebius	rtoltor(0xfeffffff, "-0.00000024");
140290001Sglebius
141290001Sglebius	rtoltor(0xfe000000, "0.00000000");
142290001Sglebius	rtoltor(0xfe000001, "0.00000024");
143290001Sglebius	rtoltor(0xfe6ffffe, "1.74999952");
144290001Sglebius	rtoltor(0xfe6fffff, "1.74999976");
145290001Sglebius	rtoltor(0xfe700000, "1.75000000");
146290001Sglebius	rtoltor(0xfe700001, "1.75000024");
147290001Sglebius	rtoltor(0xfe7ffffe, "1.99999952");
148290001Sglebius	rtoltor(0xfe7fffff, "1.99999976");
149290001Sglebius
150290001Sglebius	return;
151290001Sglebius}
152