00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include <ts/IpMap.h>
00025 #include <ts/TestBox.h>
00026 
00027 void
00028 IpMapTestPrint(IpMap& map) {
00029   printf("IpMap Dump\n");
00030   for ( IpMap::iterator spot(map.begin()), limit(map.end())
00031       ; spot != limit
00032       ; ++spot
00033   ) {
00034     ip_text_buffer ipb1, ipb2;
00035 
00036     printf("%s - %s : %p\n", ats_ip_ntop(spot->min(), ipb1, sizeof ipb1), ats_ip_ntop(spot->max(), ipb2, sizeof(ipb2)), spot->data());
00037   }
00038   printf("\n");
00039 }
00040 
00041 REGRESSION_TEST(IpMap_Basic)(RegressionTest* t, int , int*  pstatus) {
00042   TestBox tb(t, pstatus);
00043 
00044   IpMap map;
00045   void* const markA = reinterpret_cast<void*>(1);
00046   void* const markB = reinterpret_cast<void*>(2);
00047   void* const markC = reinterpret_cast<void*>(3);
00048   void* mark; 
00049 
00050   in_addr_t ip5 = htonl(5), ip9 = htonl(9);
00051   in_addr_t ip10 = htonl(10), ip15 = htonl(15), ip20 = htonl(20);
00052   in_addr_t ip50 = htonl(50), ip60 = htonl(60);
00053   in_addr_t ip100 = htonl(100), ip120 = htonl(120), ip140 = htonl(140);
00054   in_addr_t ip150 = htonl(150), ip160 = htonl(160);
00055   in_addr_t ip200 = htonl(200);
00056   in_addr_t ip0 = 0;
00057   in_addr_t ipmax = ~static_cast<in_addr_t>(0);
00058 
00059   *pstatus = REGRESSION_TEST_PASSED;
00060 
00061   map.mark(ip10,ip20,markA);
00062   map.mark(ip5, ip9, markA);
00063   tb.check(map.getCount() == 1, "Coalesce failed");
00064   tb.check(map.contains(ip9), "Range max not found.");
00065   tb.check(map.contains(ip10, &mark), "Span min not found.");
00066   tb.check(mark == markA, "Mark not preserved.");
00067 
00068   map.fill(ip15, ip100, markB);
00069   tb.check(map.getCount() == 2, "Fill failed.");
00070   tb.check(map.contains(ip50, &mark), "Fill interior missing.");
00071   tb.check(mark == markB, "Fill mark not preserved.");
00072   tb.check(!map.contains(ip200), "Span min not found.");
00073   tb.check(map.contains(ip15, &mark), "Old span interior not found.");
00074   tb.check(mark == markA, "Fill overwrote mark.");
00075 
00076   map.clear();
00077   tb.check(map.getCount() == 0, "Clear failed.");
00078 
00079   map.mark(ip20, ip50, markA);
00080   map.mark(ip100, ip150, markB);
00081   map.fill(ip10, ip200, markC);
00082   tb.check(map.getCount() == 5, "Test 3 failed [expected 5, got %d].", map.getCount());
00083   tb.check(map.contains(ip15, &mark), "Test 3 - left span missing.");
00084   tb.check(map.contains(ip60, &mark), "Test 3 - middle span missing.");
00085   tb.check(mark == markC, "Test 3 - fill mark wrong.");
00086   tb.check(map.contains(ip160), "Test 3 - right span missing.");
00087   tb.check(map.contains(ip120, &mark), "Test 3 - right mark span missing.");
00088   tb.check(mark == markB, "Test 3 - wrong data on right mark span.");
00089   map.unmark(ip140, ip160);
00090   tb.check(map.getCount() == 5, "Test 3 unmark failed [expected 5, got %d].", map.getCount());
00091   tb.check(!map.contains(ip140), "Test 3 - unmark left edge still there.");
00092   tb.check(!map.contains(ip150), "Test 3 - unmark middle still there.");
00093   tb.check(!map.contains(ip160), "Test 3 - unmark right edge still there.");
00094 
00095   map.clear();
00096   map.mark(ip20,ip20, markA);
00097   tb.check(map.contains(ip20), "Map failed on singleton insert");
00098   map.mark(ip10, ip200, markB);
00099   mark=0;
00100   map.contains(ip20, &mark);
00101   tb.check(mark == markB, "Map held singleton against range.");
00102   map.mark(ip100, ip120, markA);
00103   map.mark(ip150, ip160, markB);
00104   map.mark(ip0, ipmax, markC);
00105   tb.check(map.getCount() == 1, "IpMap: Full range fill left extra ranges.");
00106 }
00107 
00108 REGRESSION_TEST(IpMap_Unmark)(RegressionTest* t, int , int* pstatus) {
00109   TestBox tb(t, pstatus);
00110   IpMap map;
00111 
00112   void* const markA = reinterpret_cast<void*>(1);
00113 
00114   IpEndpoint a_0, a_0_0_0_16, a_0_0_0_17, a_max;
00115   IpEndpoint a_10_28_56_0,a_10_28_56_4, a_10_28_56_255;
00116   IpEndpoint a_10_28_55_255, a_10_28_57_0;
00117   IpEndpoint a_63_128_1_12;
00118   IpEndpoint a_loopback, a_loopback2;
00119   IpEndpoint a6_0, a6_max, a6_fe80_9d90, a6_fe80_9d9d, a6_fe80_9d95;
00120 
00121   ats_ip_pton("0.0.0.0", &a_0);
00122   ats_ip_pton("0.0.0.16", &a_0_0_0_16);
00123   ats_ip_pton("0.0.0.17", &a_0_0_0_17);
00124   ats_ip_pton("255.255.255.255", &a_max);
00125   ats_ip_pton("10.28.55.255", &a_10_28_55_255);
00126   ats_ip_pton("10.28.56.0", &a_10_28_56_0);
00127   ats_ip_pton("10.28.56.4", &a_10_28_56_4);
00128   ats_ip_pton("10.28.56.255", &a_10_28_56_255);
00129   ats_ip_pton("10.28.57.0", &a_10_28_57_0);
00130   ats_ip_pton("63.128.1.12", &a_63_128_1_12);
00131   ats_ip_pton("::", &a6_0);
00132   ats_ip_pton("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", &a6_max);
00133   ats_ip_pton("fe80::221:9bff:fe10:9d90", &a6_fe80_9d90);
00134   ats_ip_pton("fe80::221:9bff:fe10:9d9d", &a6_fe80_9d9d);
00135   ats_ip_pton("fe80::221:9bff:fe10:9d95", &a6_fe80_9d95);
00136   ats_ip_pton("127.0.0.1", &a_loopback);
00137   ats_ip_pton("127.0.0.255", &a_loopback2);
00138   *pstatus = REGRESSION_TEST_PASSED;
00139 
00140   map.mark(&a_0, &a_max, markA);
00141   tb.check(map.getCount() == 1, "IpMap Unmark: Full range not single.");
00142   map.unmark(&a_10_28_56_0, &a_10_28_56_255);
00143   tb.check(map.getCount() == 2, "IpMap Unmark: Range unmark failed.");
00144   
00145   tb.check(!map.contains(&a_10_28_56_0), "IpMap Unmark: Range unmark min address not removed.");
00146   tb.check(!map.contains(&a_10_28_56_255), "IpMap Unmark: Range unmark max address not removed.");
00147   tb.check(map.contains(&a_10_28_55_255), "IpMap Unmark: Range unmark min-1 address removed.");
00148   tb.check(map.contains(&a_10_28_57_0), "IpMap Unmark: Range unmark max+1 address removed.");
00149   
00150   map.unmark(&a_0, &a_0_0_0_16);
00151   tb.check(!map.contains(&a_0), "IpMap Unmark: Range unmark zero address not removed.");
00152   tb.check(!map.contains(&a_0_0_0_16), "IpMap Unmark: Range unmark zero bounded range max not removed.");
00153   tb.check(map.contains(&a_0_0_0_17), "IpMap Unmark: Range unmark zero bounded range max+1 removed.");
00154 }
00155 
00156 REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int , int* pstatus) {
00157   TestBox tb(t, pstatus);
00158   IpMap map;
00159   ip_text_buffer ipb1, ipb2;
00160   void* const allow = reinterpret_cast<void*>(0);
00161   void* const deny = reinterpret_cast<void*>(~0); 
00162   void* const markA = reinterpret_cast<void*>(1);
00163   void* const markB = reinterpret_cast<void*>(2);
00164   void* const markC = reinterpret_cast<void*>(3);
00165   void* mark; 
00166 
00167   IpEndpoint a0,a_10_28_56_0,a_10_28_56_255,a3,a4;
00168   IpEndpoint a_9_255_255_255, a_10_0_0_0, a_10_0_0_19, a_10_0_0_255, a_10_0_1_0;
00169   IpEndpoint a_10_28_56_4, a_max, a_loopback, a_loopback2;
00170   IpEndpoint a_10_28_55_255, a_10_28_57_0;
00171   IpEndpoint a_63_128_1_12;
00172   IpEndpoint a_0000_0000, a_0000_0001, a_ffff_ffff;
00173   IpEndpoint a_fe80_9d8f, a_fe80_9d90, a_fe80_9d95, a_fe80_9d9d, a_fe80_9d9e;
00174 
00175   *pstatus = REGRESSION_TEST_PASSED;
00176 
00177   ats_ip_pton("0.0.0.0", &a0);
00178   ats_ip_pton("255.255.255.255", &a_max);
00179 
00180   ats_ip_pton("9.255.255.255", &a_9_255_255_255);
00181   ats_ip_pton("10.0.0.0", &a_10_0_0_0);
00182   ats_ip_pton("10.0.0.19", &a_10_0_0_19);
00183   ats_ip_pton("10.0.0.255", &a_10_0_0_255);
00184   ats_ip_pton("10.0.1.0", &a_10_0_1_0);
00185 
00186   ats_ip_pton("10.28.55.255", &a_10_28_55_255);
00187   ats_ip_pton("10.28.56.0", &a_10_28_56_0);
00188   ats_ip_pton("10.28.56.4", &a_10_28_56_4);
00189   ats_ip_pton("10.28.56.255", &a_10_28_56_255);
00190   ats_ip_pton("10.28.57.0", &a_10_28_57_0);
00191 
00192   ats_ip_pton("192.168.1.0", &a3);
00193   ats_ip_pton("192.168.1.255", &a4);
00194 
00195   ats_ip_pton("::", &a_0000_0000);
00196   ats_ip_pton("::1", &a_0000_0001);
00197   ats_ip_pton("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", &a_ffff_ffff);
00198   ats_ip_pton("fe80::221:9bff:fe10:9d8f", &a_fe80_9d8f);
00199   ats_ip_pton("fe80::221:9bff:fe10:9d90", &a_fe80_9d90);
00200   ats_ip_pton("fe80::221:9bff:fe10:9d95", &a_fe80_9d95);
00201   ats_ip_pton("fe80::221:9bff:fe10:9d9d", &a_fe80_9d9d);
00202   ats_ip_pton("fe80::221:9bff:fe10:9d9e", &a_fe80_9d9e);
00203 
00204   ats_ip_pton("127.0.0.0", &a_loopback);
00205   ats_ip_pton("127.0.0.255", &a_loopback2);
00206   ats_ip_pton("63.128.1.12", &a_63_128_1_12);
00207 
00208   map.fill(&a_10_28_56_0,&a_10_28_56_255,deny);
00209   map.fill(&a0,&a_max,allow);
00210 
00211   tb.check(map.contains(&a_10_28_56_4,&mark), "IpMap Fill: Target not found.");
00212   tb.check(mark == deny, "IpMap Fill: Expected deny, got allow at %s.", ats_ip_ntop(&a_10_28_56_4, ipb1, sizeof(ipb1)));
00213 
00214   map.clear();
00215   map.fill(&a_loopback, &a_loopback, allow);
00216   tb.check(map.contains(&a_loopback), "IpMap fill: singleton not marked.");
00217   map.fill(&a0, &a_max, deny);
00218 
00219   mark=0;
00220   tb.check(map.contains(&a_loopback, &mark), "IpMap fill: singleton marking lost.");
00221   tb.check(mark == allow, "IpMap fill: overwrote existing singleton mark.");
00222   if (tb.check(map.begin() != map.end(), "IpMap fill: map is empty.")) {
00223     if (tb.check(++(map.begin()) != map.end(), "IpMap fill: only one range.")) {
00224       tb.check(-1 == ats_ip_addr_cmp(map.begin()->max(), (++map.begin())->min()), "IpMap fill: ranges not disjoint [%s < %s].", ats_ip_ntop(map.begin()->max(), ipb1, sizeof(ipb1)), ats_ip_ntop((++map.begin())->min(), ipb2, sizeof(ipb2)));
00225     }
00226   }
00227 
00228   map.clear();
00229   map.fill(&a_loopback, &a_loopback2, markA);
00230   map.fill(&a_10_28_56_0, &a_10_28_56_255, markB);
00231   tb.check(!map.contains(&a_63_128_1_12, &mark), "IpMap fill[2]: over extended range.");
00232   map.fill(&a0, &a_max, markC);
00233   tb.check(map.getCount() == 5, "IpMap[2]: Fill failed.");
00234   if (tb.check(map.contains(&a_63_128_1_12, &mark), "IpMap fill[2]: Collapsed range.")) {
00235     tb.check(mark == markC, "IpMap fill[2]: invalid mark for range gap.");
00236   }
00237 
00238   map.clear();
00239   map.fill(&a_10_0_0_0, &a_10_0_0_255, allow);
00240   map.fill(&a_loopback, &a_loopback2, allow);
00241   tb.check(!map.contains(&a_63_128_1_12, &mark), "IpMap fill[3]: invalid mark between ranges.");
00242   tb.check(map.contains(&a_10_0_0_19, &mark) && mark == allow, "IpMap fill[3]: invalid mark in lower range.");
00243   map.fill(&a0, &a_max, deny);
00244   if (!tb.check(map.getCount() == 5, "IpMap[3]: Wrong number of ranges."))
00245     IpMapTestPrint(map);
00246   if (tb.check(map.contains(&a_63_128_1_12, &mark), "IpMap fill[3]: Missing mark between ranges")) {
00247     tb.check(mark == deny, "IpMap fill[3]: gap range invalidly marked");
00248   }
00249 
00250   map.fill(&a_fe80_9d90, &a_fe80_9d9d, markA);
00251   map.fill(&a_0000_0001, &a_0000_0001, markA);
00252   map.fill(&a_0000_0000, &a_ffff_ffff, markB);
00253 
00254   tb.check(map.contains(&a_0000_0000, &mark) && mark == markB,
00255            "IpMap Fill[v6]: Zero address has bad mark.");
00256   tb.check(map.contains(&a_ffff_ffff, &mark) && mark == markB,
00257            "IpMap Fill[v6]: Max address has bad mark.");
00258   tb.check(map.contains(&a_fe80_9d90, &mark) && mark == markA,
00259            "IpMap Fill[v6]: 9d90 address has bad mark.");
00260   tb.check(map.contains(&a_fe80_9d8f, &mark) && mark == markB,
00261            "IpMap Fill[v6]: 9d8f address has bad mark.");
00262   tb.check(map.contains(&a_fe80_9d9d, &mark) && mark == markA,
00263            "IpMap Fill[v6]: 9d9d address has bad mark.");
00264   tb.check(map.contains(&a_fe80_9d9e, &mark) && mark == markB,
00265            "IpMap Fill[v6]: 9d9b address has bad mark.");
00266   tb.check(map.contains(&a_0000_0001, &mark) && mark == markA,
00267            "IpMap Fill[v6]: ::1 has bad mark.");
00268   
00269   tb.check(map.getCount() == 10, "IpMap Fill[pre-refill]: Bad range count.");
00270   
00271   map.fill(&a_fe80_9d90, &a_fe80_9d9d, markA);
00272   map.fill(&a_0000_0001, &a_0000_0001, markC);
00273   map.fill(&a_0000_0000, &a_ffff_ffff, markB);
00274   tb.check(map.getCount() == 10, "IpMap Fill[post-refill]: Bad range count.");
00275 
00276   map.clear();
00277   map.fill(&a_fe80_9d90, &a_fe80_9d9d, markA);
00278   map.fill(&a_0000_0001, &a_0000_0001, markC);
00279   map.fill(&a_0000_0000, &a_ffff_ffff, markB);
00280   tb.check(map.contains(&a_0000_0000, &mark) && mark == markB,
00281            "IpMap Fill[v6-2]: Zero address has bad mark.");
00282   tb.check(map.contains(&a_ffff_ffff, &mark) && mark == markB,
00283            "IpMap Fill[v6-2]: Max address has bad mark.");
00284   tb.check(map.contains(&a_fe80_9d90, &mark) && mark == markA,
00285            "IpMap Fill[v6-2]: 9d90 address has bad mark.");
00286   tb.check(map.contains(&a_fe80_9d8f, &mark) && mark == markB,
00287            "IpMap Fill[v6-2]: 9d8f address has bad mark.");
00288   tb.check(map.contains(&a_fe80_9d9d, &mark) && mark == markA,
00289            "IpMap Fill[v6-2]: 9d9d address has bad mark.");
00290   tb.check(map.contains(&a_fe80_9d9e, &mark) && mark == markB,
00291            "IpMap Fill[v6-2]: 9d9b address has bad mark.");
00292   tb.check(map.contains(&a_0000_0001, &mark) && mark == markC,
00293            "IpMap Fill[v6-2]: ::1 has bad mark.");
00294  
00295 }