00001
00002
00003
00004
00005 #include "libtorrent/ip_filter.hpp"
00006 #include <boost/utility.hpp>
00007
00008 #include "test.hpp"
00009
00010 using namespace libtorrent;
00011
00012 template <class Addr>
00013 bool compare(ip_range<Addr> const& lhs
00014 , ip_range<Addr> const& rhs)
00015 {
00016 return lhs.first == rhs.first
00017 && lhs.last == rhs.last
00018 && lhs.flags == rhs.flags;
00019 }
00020
00021 void test_rules_invariant(std::vector<ip_range<address_v4> > const& r, ip_filter const& f)
00022 {
00023 typedef std::vector<ip_range<address_v4> >::const_iterator iterator;
00024 TEST_CHECK(!r.empty());
00025 if (r.empty()) return;
00026
00027 TEST_CHECK(r.front().first == address::from_string("0.0.0.0"));
00028 TEST_CHECK(r.back().last == address::from_string("255.255.255.255"));
00029
00030 iterator i = r.begin();
00031 iterator j = boost::next(i);
00032 for (iterator i(r.begin()), j(boost::next(r.begin()))
00033 , end(r.end()); j != end; ++j, ++i)
00034 {
00035 TEST_CHECK(f.access(i->last) == i->flags);
00036 TEST_CHECK(f.access(j->first) == j->flags);
00037 TEST_CHECK(i->last.to_ulong() + 1 == j->first.to_ulong());
00038 }
00039 }
00040
00041 int test_main()
00042 {
00043 using namespace libtorrent;
00044
00045 std::vector<ip_range<address_v4> > range;
00046
00047
00048 ip_range<address_v4> expected1[] =
00049 {
00050 {address_v4::from_string("0.0.0.0"), address_v4::from_string("0.255.255.255"), 0}
00051 , {address_v4::from_string("1.0.0.0"), address_v4::from_string("3.0.0.0"), ip_filter::blocked}
00052 , {address_v4::from_string("3.0.0.1"), address_v4::from_string("255.255.255.255"), 0}
00053 };
00054
00055 {
00056 ip_filter f;
00057 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.0.0.0"), ip_filter::blocked);
00058 f.add_rule(address::from_string("2.0.0.1"), address::from_string("3.0.0.0"), ip_filter::blocked);
00059
00060 range = boost::get<0>(f.export_filter());
00061 test_rules_invariant(range, f);
00062
00063 TEST_CHECK(range.size() == 3);
00064 TEST_CHECK(std::equal(range.begin(), range.end(), expected1, &compare<address_v4>));
00065
00066 }
00067
00068
00069
00070 {
00071 ip_filter f;
00072 f.add_rule(address::from_string("2.0.0.1"), address::from_string("3.0.0.0"), ip_filter::blocked);
00073 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.0.0.0"), ip_filter::blocked);
00074
00075 range = boost::get<0>(f.export_filter());
00076 test_rules_invariant(range, f);
00077
00078 TEST_CHECK(range.size() == 3);
00079 TEST_CHECK(std::equal(range.begin(), range.end(), expected1, &compare<address_v4>));
00080
00081 }
00082
00083
00084
00085 {
00086 ip_filter f;
00087 f.add_rule(address::from_string("2.0.0.1"), address::from_string("3.0.0.0"), ip_filter::blocked);
00088 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.4.0.0"), ip_filter::blocked);
00089
00090 range = boost::get<0>(f.export_filter());
00091 test_rules_invariant(range, f);
00092
00093 TEST_CHECK(range.size() == 3);
00094 TEST_CHECK(std::equal(range.begin(), range.end(), expected1, &compare<address_v4>));
00095
00096 }
00097
00098
00099
00100 {
00101 ip_filter f;
00102 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.4.0.0"), ip_filter::blocked);
00103 f.add_rule(address::from_string("2.0.0.1"), address::from_string("3.0.0.0"), ip_filter::blocked);
00104
00105 range = boost::get<0>(f.export_filter());
00106 test_rules_invariant(range, f);
00107
00108 TEST_CHECK(range.size() == 3);
00109 TEST_CHECK(std::equal(range.begin(), range.end(), expected1, &compare<address_v4>));
00110
00111 }
00112
00113
00114
00115 {
00116 ip_filter f;
00117 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.0.0.0"), ip_filter::blocked);
00118 f.add_rule(address::from_string("3.0.0.0"), address::from_string("4.0.0.0"), ip_filter::blocked);
00119 f.add_rule(address::from_string("5.0.0.0"), address::from_string("6.0.0.0"), ip_filter::blocked);
00120 f.add_rule(address::from_string("7.0.0.0"), address::from_string("8.0.0.0"), ip_filter::blocked);
00121
00122 f.add_rule(address::from_string("1.0.1.0"), address::from_string("9.0.0.0"), ip_filter::blocked);
00123
00124 range = boost::get<0>(f.export_filter());
00125 test_rules_invariant(range, f);
00126
00127 TEST_CHECK(range.size() == 3);
00128 ip_range<address_v4> expected[] =
00129 {
00130 {address_v4::from_string("0.0.0.0"), address_v4::from_string("0.255.255.255"), 0}
00131 , {address_v4::from_string("1.0.0.0"), address_v4::from_string("9.0.0.0"), ip_filter::blocked}
00132 , {address_v4::from_string("9.0.0.1"), address_v4::from_string("255.255.255.255"), 0}
00133 };
00134
00135 TEST_CHECK(std::equal(range.begin(), range.end(), expected, &compare<address_v4>));
00136
00137 }
00138
00139
00140
00141 {
00142 ip_filter f;
00143 f.add_rule(address::from_string("1.0.0.0"), address::from_string("2.0.0.0"), ip_filter::blocked);
00144 f.add_rule(address::from_string("3.0.0.0"), address::from_string("4.0.0.0"), ip_filter::blocked);
00145 f.add_rule(address::from_string("5.0.0.0"), address::from_string("6.0.0.0"), ip_filter::blocked);
00146 f.add_rule(address::from_string("7.0.0.0"), address::from_string("8.0.0.0"), ip_filter::blocked);
00147
00148 f.add_rule(address::from_string("0.0.1.0"), address::from_string("7.0.4.0"), ip_filter::blocked);
00149
00150 range = boost::get<0>(f.export_filter());
00151 test_rules_invariant(range, f);
00152
00153 TEST_CHECK(range.size() == 3);
00154 ip_range<address_v4> expected[] =
00155 {
00156 {address_v4::from_string("0.0.0.0"), address_v4::from_string("0.0.0.255"), 0}
00157 , {address_v4::from_string("0.0.1.0"), address_v4::from_string("8.0.0.0"), ip_filter::blocked}
00158 , {address_v4::from_string("8.0.0.1"), address_v4::from_string("255.255.255.255"), 0}
00159 };
00160
00161 TEST_CHECK(std::equal(range.begin(), range.end(), expected, &compare<address_v4>));
00162
00163 }
00164
00165 return 0;
00166 }
00167