1*cdfa2a7eSchristos /* $NetBSD: refidsmear.c,v 1.2 2020/05/25 20:47:36 christos Exp $ */
2067f5680Schristos
3f17b710fSchristos #include "config.h"
4f17b710fSchristos
5f17b710fSchristos #include <ntp.h>
6f17b710fSchristos #include <ntp_fp.h>
7f17b710fSchristos #include <refidsmear.h>
8f17b710fSchristos
9f17b710fSchristos //#include "ntp_stdlib.h"
10f17b710fSchristos //#include "ntp_calendar.h"
11f17b710fSchristos
12f17b710fSchristos #include "unity.h"
13f17b710fSchristos
14f17b710fSchristos #include <stdio.h>
15f17b710fSchristos
16f17b710fSchristos /*
17f17b710fSchristos * we want to test a refid format of:
18f17b710fSchristos * 254.x.y.x
19f17b710fSchristos *
20f17b710fSchristos * where x.y.z are 24 bits containing 2 (signed) integer bits
21f17b710fSchristos * and 22 fractional bits.
22f17b710fSchristos *
23f17b710fSchristos * we want functions to convert to/from this format, with unit tests.
24f17b710fSchristos *
25f17b710fSchristos * Interesting test cases include:
26f17b710fSchristos * 254.0.0.0
27f17b710fSchristos * 254.0.0.1
28f17b710fSchristos * 254.127.255.255
29f17b710fSchristos * 254.128.0.0
30f17b710fSchristos * 254.255.255.255
31f17b710fSchristos */
32f17b710fSchristos
33a6f3f22fSchristos
344c290c01Schristos void setUp(void);
35f17b710fSchristos void rtol(uint32_t r, char *es);
36a6f3f22fSchristos void rtoltor(uint32_t er, char *es);
37a6f3f22fSchristos void ltor(l_fp l, char *er);
38a6f3f22fSchristos void test_refidsmear(void);
39f17b710fSchristos
404c290c01Schristos
414c290c01Schristos void
setUp(void)424c290c01Schristos setUp(void)
434c290c01Schristos {
444c290c01Schristos init_lib();
454c290c01Schristos
464c290c01Schristos return;
474c290c01Schristos }
484c290c01Schristos
49f17b710fSchristos void
rtol(uint32_t r,char * es)50f17b710fSchristos rtol(uint32_t r, char *es)
51f17b710fSchristos {
52f17b710fSchristos l_fp l;
53f17b710fSchristos char *as;
54f17b710fSchristos char msg[100];
55f17b710fSchristos
56f17b710fSchristos TEST_ASSERT_NOT_NULL(es);
57f17b710fSchristos
58f17b710fSchristos snprintf(msg, 100, "rtol was called with r=%#.8x, es=%s", r, es);
59f17b710fSchristos
60f17b710fSchristos l = convertRefIDToLFP(htonl(r));
61f17b710fSchristos as = lfptoa(&l, 8);
62f17b710fSchristos
63f17b710fSchristos //printf("refid %#x, smear %s\n", r, as);
64f17b710fSchristos
65f17b710fSchristos TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
66f17b710fSchristos TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);
67f17b710fSchristos
68f17b710fSchristos return;
69f17b710fSchristos }
70f17b710fSchristos
71f17b710fSchristos
72f17b710fSchristos void
rtoltor(uint32_t er,char * es)73f17b710fSchristos rtoltor(uint32_t er, char *es)
74f17b710fSchristos {
75f17b710fSchristos l_fp l;
76f17b710fSchristos char *as;
77f17b710fSchristos uint32_t ar;
78f17b710fSchristos char msg[100];
79f17b710fSchristos
80f17b710fSchristos TEST_ASSERT_NOT_NULL(es);
81f17b710fSchristos
82f17b710fSchristos snprintf(msg, 100, "rtoltor was called with er=%#.8x, es=%s", er, es);
83f17b710fSchristos
84f17b710fSchristos l = convertRefIDToLFP(htonl(er));
85f17b710fSchristos as = lfptoa(&l, 8);
86f17b710fSchristos
87f17b710fSchristos ar = convertLFPToRefID(l);
88f17b710fSchristos
89f17b710fSchristos //printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(ar));
90f17b710fSchristos
91f17b710fSchristos TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
92f17b710fSchristos TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);
93f17b710fSchristos TEST_ASSERT_EQUAL_UINT_MESSAGE(er, ntohl(ar), msg);
94f17b710fSchristos
95f17b710fSchristos return;
96f17b710fSchristos }
97f17b710fSchristos
98f17b710fSchristos
99f17b710fSchristos void
ltor(l_fp l,char * er)100f17b710fSchristos ltor(l_fp l, char *er)
101f17b710fSchristos {
102f17b710fSchristos uint32_t r;
103f17b710fSchristos
104f17b710fSchristos printf("ltor: ");
105f17b710fSchristos
106f17b710fSchristos r = convertLFPToRefID(l);
107f17b710fSchristos printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(r));
108f17b710fSchristos
109f17b710fSchristos return;
110f17b710fSchristos }
111f17b710fSchristos
112f17b710fSchristos
test_refidsmear(void)113f17b710fSchristos void test_refidsmear(void)
114f17b710fSchristos {
115f17b710fSchristos
116f17b710fSchristos rtol(0xfe800000, "-2.00000000");
117f17b710fSchristos rtol(0xfe800001, "-1.99999976");
118f17b710fSchristos rtol(0xfe8ffffe, "-1.75000048");
119f17b710fSchristos rtol(0xfe8fffff, "-1.75000024");
120f17b710fSchristos rtol(0xfef00000, "-0.25000000");
121f17b710fSchristos rtol(0xfef00001, "-0.24999976");
122f17b710fSchristos rtol(0xfefffffe, "-0.00000048");
123f17b710fSchristos rtol(0xfeffffff, "-0.00000024");
124f17b710fSchristos
125067f5680Schristos rtol(0xfe000000, "+0.00000000");
126067f5680Schristos rtol(0xfe000001, "+0.00000024");
127067f5680Schristos rtol(0xfe6ffffe, "+1.74999952");
128067f5680Schristos rtol(0xfe6fffff, "+1.74999976");
129067f5680Schristos rtol(0xfe700000, "+1.75000000");
130067f5680Schristos rtol(0xfe700001, "+1.75000024");
131067f5680Schristos rtol(0xfe7ffffe, "+1.99999952");
132067f5680Schristos rtol(0xfe7fffff, "+1.99999976");
133f17b710fSchristos
134f17b710fSchristos rtoltor(0xfe800000, "-2.00000000");
135f17b710fSchristos rtoltor(0xfe800001, "-1.99999976");
136f17b710fSchristos rtoltor(0xfe8ffffe, "-1.75000048");
137f17b710fSchristos rtoltor(0xfe8fffff, "-1.75000024");
138f17b710fSchristos rtoltor(0xfef00000, "-0.25000000");
139f17b710fSchristos rtoltor(0xfef00001, "-0.24999976");
140f17b710fSchristos rtoltor(0xfefffffe, "-0.00000048");
141f17b710fSchristos rtoltor(0xfeffffff, "-0.00000024");
142f17b710fSchristos
143067f5680Schristos rtoltor(0xfe000000, "+0.00000000");
144067f5680Schristos rtoltor(0xfe000001, "+0.00000024");
145067f5680Schristos rtoltor(0xfe6ffffe, "+1.74999952");
146067f5680Schristos rtoltor(0xfe6fffff, "+1.74999976");
147067f5680Schristos rtoltor(0xfe700000, "+1.75000000");
148067f5680Schristos rtoltor(0xfe700001, "+1.75000024");
149067f5680Schristos rtoltor(0xfe7ffffe, "+1.99999952");
150067f5680Schristos rtoltor(0xfe7fffff, "+1.99999976");
151f17b710fSchristos
152f17b710fSchristos return;
153f17b710fSchristos }
154