1: %% 2: %% %CopyrightBegin% 3: %% 4: %% Copyright Ericsson AB 2004-2012. All Rights Reserved. 5: %% 6: %% The contents of this file are subject to the Erlang Public License, 7: %% Version 1.1, (the "License"); you may not use this file except in 8: %% compliance with the License. You should have received a copy of the 9: %% Erlang Public License along with this software. If not, it can be 10: %% retrieved online at http://www.erlang.org/. 11: %% 12: %% Software distributed under the License is distributed on an "AS IS" 13: %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 14: %% the License for the specific language governing rights and limitations 15: %% under the License. 16: %% 17: %% %CopyrightEnd% 18: %% 19: %% 20: %%----------------------------------------------------------------- 21: %% 22: %% Description: 23: %% Test suite for the ACL functions 24: %% 25: %%----------------------------------------------------------------- 26: -module(orber_acl_SUITE). 27: 28: -include_lib("test_server/include/test_server.hrl"). 29: 30: -define(default_timeout, ?t:minutes(5)). 31: 32: -define(match(ExpectedRes,Expr), 33: fun() -> 34: AcTuAlReS = (catch (Expr)), 35: case AcTuAlReS of 36: ExpectedRes -> 37: io:format("------ CORRECT RESULT ------~n~p~n", 38: [AcTuAlReS]), 39: AcTuAlReS; 40: _ -> 41: io:format("###### ERROR ERROR ######~nRESULT: ~p~n", 42: [AcTuAlReS]), 43: ?line exit(AcTuAlReS) 44: end 45: end()). 46: 47: %%----------------------------------------------------------------- 48: %% External exports 49: %%----------------------------------------------------------------- 50: -export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]). 51: 52: %%----------------------------------------------------------------- 53: %% Internal exports 54: %%----------------------------------------------------------------- 55: -compile(export_all). 56: 57: %%----------------------------------------------------------------- 58: %% Func: all/1 59: %% Args: 60: %% Returns: 61: %%----------------------------------------------------------------- 62: suite() -> [{ct_hooks,[ts_install_cth]}]. 63: 64: all() -> 65: [ipv4_verify, ipv4_range, ipv4_interfaces, ipv4_bm, 66: ipv6_verify, ipv6_range, ipv6_interfaces, ipv6_bm]. 67: 68: groups() -> 69: []. 70: 71: init_per_group(_GroupName, Config) -> 72: Config. 73: 74: end_per_group(_GroupName, Config) -> 75: Config. 76: 77: 78: %%----------------------------------------------------------------- 79: %% Init and cleanup functions. 80: %%----------------------------------------------------------------- 81: init_per_suite(Config) -> 82: if 83: is_list(Config) -> 84: Config; 85: true -> 86: exit("Config not a list") 87: end. 88: 89: end_per_suite(Config) -> 90: Config. 91: 92: 93: init_per_testcase(_Case, Config) -> 94: ?line Dog=test_server:timetrap(?default_timeout), 95: [{watchdog, Dog}|Config]. 96: 97: 98: end_per_testcase(_Case, Config) -> 99: Dog = ?config(watchdog, Config), 100: test_server:timetrap_cancel(Dog), 101: ok. 102: 103: %%----------------------------------------------------------------- 104: %% Test Case : 105: %% Description: 106: %%----------------------------------------------------------------- 107: ipv4_verify(doc) -> ["Testing IPv4 Verify Operation."]; 108: ipv4_verify(suite) -> []; 109: ipv4_verify(_) -> 110: ?match(true, orber_acl:verify("192.168.64.148", "192.168.64.0/17", inet)), 111: ?match({false,"192.168.128.0","192.168.255.255"}, 112: orber_acl:verify("192.168.64.148", "192.168.255.0/17", inet)), 113: ?match(true, orber_acl:verify("192.168.255.148", "192.168.128.0/17", inet)), 114: ?match(true, orber_acl:verify("192.168.128.148", "192.168.128.0/17", inet)), 115: ?match(true, orber_acl:verify("192.168.255.255", "192.168.128.0/16", inet)), 116: ?match({false,"192.168.0.0","192.168.255.255"}, 117: orber_acl:verify("192.169.255.255", "192.168.128.0/16", inet)), 118: ?match(true, orber_acl:verify("192.168.128.255", "192.168.128.0/24", inet)), 119: ?match({false,"192.168.128.0","192.168.128.255"}, 120: orber_acl:verify("192.168.255.255", "192.168.128.0/24", inet)), 121: ?match({false,"192.168.128.0","192.168.128.127"}, 122: orber_acl:verify("192.168.128.255", "192.168.128.0/25", inet)), 123: ?match(true, orber_acl:verify("192.168.128.255", "192.168.128.128/25", inet)), 124: ?match(true, orber_acl:verify("192.168.128.128", "192.168.128.128/32", inet)), 125: ?match({false,"192.168.128.128.","192.168.128.128."}, 126: orber_acl:verify("192.168.128.255", "192.168.128.128/32", inet)), 127: ?match(true, orber_acl:verify("192.168.128.128", "192.168.128.128", inet)), 128: ?match({false,"192.168.128.128.","192.168.128.128."}, 129: orber_acl:verify("192.168.128.255", "192.168.128.128", inet)), 130: ?match(true, orber_acl:verify("192.168.128.255", "192.168.128.128/7", inet)), 131: ok. 132: 133: %%----------------------------------------------------------------- 134: %% Test Case : 135: %% Description: 136: %%----------------------------------------------------------------- 137: ipv4_range(doc) -> ["Testing IPv4 Range Operation."]; 138: ipv4_range(suite) -> []; 139: ipv4_range(_) -> 140: ?match({ok,"192.168.0.0", "192.168.127.255"}, 141: orber_acl:range("192.168.64.0/17")), 142: ?match({ok, "192.168.128.0", "192.168.255.255"}, 143: orber_acl:range("192.168.255.0/17")), 144: ?match({ok,"192.168.128.0","192.168.255.255"}, 145: orber_acl:range("192.168.128.0/17")), 146: ?match({ok,"192.168.0.0","192.168.255.255"}, 147: orber_acl:range("192.168.128.0/16")), 148: ?match({ok,"192.168.128.0","192.168.128.255"}, 149: orber_acl:range("192.168.128.0/24")), 150: ?match({ok,"192.168.128.0","192.168.128.127"}, 151: orber_acl:range("192.168.128.0/25")), 152: ?match({ok,"192.168.128.128","192.168.128.255"}, 153: orber_acl:range("192.168.128.128/25")), 154: ?match({ok,"192.168.128.128.","192.168.128.128."}, 155: orber_acl:range("192.168.128.128/32")), 156: ?match({ok,"192.168.128.128.","192.168.128.128."}, 157: orber_acl:range("192.168.128.128")), 158: ?match({ok,"192.0.0.0","193.255.255.255"}, 159: orber_acl:range("192.168.128.128/7")), 160: ok. 161: 162: %%----------------------------------------------------------------- 163: %% Test Case : 164: %% Description: 165: %%----------------------------------------------------------------- 166: ipv4_interfaces(doc) -> ["Testing IPv4 Interfaces Operation."]; 167: ipv4_interfaces(suite) -> []; 168: ipv4_interfaces(_) -> 169: ?match({ok, _}, 170: orber_acl:init_acl([{tcp_in, "192.168.128.0/18", ["10.1.1.1"]}, 171: {tcp_in, "192.167.64.0/18#4001/5001", ["10.1.1.2"]}, 172: {tcp_in, "192.166.192.0/18"}], inet)), 173: {ok, IPTuple1} = ?match({ok, _}, inet:getaddr("192.168.128.0", inet)), 174: ?match({true, ["10.1.1.1"], 0}, orber_acl:match(IPTuple1, tcp_in, true)), 175: ?match({false, [], 0}, orber_acl:match(IPTuple1, tcp_out, true)), 176: {ok, IPTuple2} = ?match({ok, _}, inet:getaddr("192.167.64.0", inet)), 177: ?match({true, ["10.1.1.2"], {4001,5001}}, orber_acl:match(IPTuple2, tcp_in, true)), 178: ?match({false, [], 0}, orber_acl:match(IPTuple2, tcp_out, true)), 179: {ok, IPTuple3} = ?match({ok, _}, inet:getaddr("192.166.192.0", inet)), 180: ?match({true, [], 0}, orber_acl:match(IPTuple3, tcp_in, true)), 181: ?match(false, orber_acl:match(IPTuple3, tcp_out)), 182: ?match(ok, orber_acl:clear_acl()), 183: ok. 184: 185: %%----------------------------------------------------------------- 186: %% Test Case : 187: %% Description: 188: %%----------------------------------------------------------------- 189: ipv4_bm(doc) -> ["Benchmarking runtime critical IPv4 Operations."]; 190: ipv4_bm(suite) -> []; 191: ipv4_bm(_) -> 192: ?match({ok, _, _, _}, bm2([{tcp_in, "192.168.64.0/17"}], inet, "192.168.64.148")), 193: ok. 194: %%----------------------------------------------------------------- 195: %% Test Case : 196: %% Description: 197: %%----------------------------------------------------------------- 198: ipv6_verify(doc) -> ["Testing IPv6 Verify Operation."]; 199: ipv6_verify(suite) -> []; 200: ipv6_verify(_) -> 201: case orber_test_lib:version_ok() of 202: true -> 203: ?match(true, orber_acl:verify("2002:C0A8:0:0:0:0:0:0", "2002:C0A8::/48", inet6)), 204: ?match(true, orber_acl:verify("2002:C0A8:0:FFFF:FFFF:FFFF:FFFF:FFFF", "2002:C0A8::/48", inet6)), 205: ?match({false,"2002:C0A8:0:0:0:0:0:0", "2002:C0A8:0:FFFF:FFFF:FFFF:FFFF:FFFF"}, 206: orber_acl:verify("2002:C0A8:1:FFFF:FFFF:FFFF:FFFF:FFFF", "2002:C0A8::/48", inet6)), 207: ?match(true, orber_acl:verify("2002:C0A8:1:FFFF:FFFF:FFFF:FFFF:FFFF", "2002:C0A8::/47", inet6)), 208: ?match({false,"2002:C0A8:0:0:0:0:0:0", "2002:C0A8:1:FFFF:FFFF:FFFF:FFFF:FFFF"}, 209: orber_acl:verify("2002:C0A8:2:FFFF:FFFF:FFFF:FFFF:FFFF", "2002:C0A8::/47", inet6)), 210: ok; 211: Reason -> 212: Reason 213: end. 214: 215: %%----------------------------------------------------------------- 216: %% Test Case : 217: %% Description: 218: %%----------------------------------------------------------------- 219: ipv6_range(doc) -> ["Testing IPv6 Range Operation."]; 220: ipv6_range(suite) -> []; 221: ipv6_range(_) -> 222: case orber_test_lib:version_ok() of 223: true -> 224: ?match({ok,"2002:C0A8:0:0:0:0:0:0", "2002:C0A8:0:FFFF:FFFF:FFFF:FFFF:FFFF"}, 225: orber_acl:range("2002:C0A8::/48", inet6)), 226: ?match({ok,"2002:C0A8:0:0:0:0:0:0", "2002:C0A8:1:FFFF:FFFF:FFFF:FFFF:FFFF"}, 227: orber_acl:range("2002:C0A8::/47", inet6)), 228: ok; 229: Reason -> 230: Reason 231: end. 232: 233: %%----------------------------------------------------------------- 234: %% Test Case : 235: %% Description: 236: %%----------------------------------------------------------------- 237: ipv6_interfaces(doc) -> ["Testing IPv6 Interfaces Operation."]; 238: ipv6_interfaces(suite) -> []; 239: ipv6_interfaces(_) -> 240: case orber_test_lib:version_ok() of 241: true -> 242: ?match({ok, _}, orber_acl:init_acl([{tcp_in, "2002:C0A8::/49", ["0:0:0:0:0:0:10.1.1.1"]}], inet6)), 243: {ok, IPTuple1} = ?match({ok, _}, inet:getaddr("2002:C0A8:0:7FFF:FFFF:FFFF:FFFF:FFFF", inet6)), 244: ?match({true, ["0:0:0:0:0:0:10.1.1.1"], 0}, orber_acl:match(IPTuple1, tcp_in, true)), 245: ?match(false, orber_acl:match(IPTuple1, tcp_out)), 246: ?match(ok, orber_acl:clear_acl()), 247: ok; 248: Reason -> 249: Reason 250: end. 251: 252: %%----------------------------------------------------------------- 253: %% Test Case : 254: %% Description: 255: %%----------------------------------------------------------------- 256: ipv6_bm(doc) -> ["Benchmarking runtime critical IPv6 Operations."]; 257: ipv6_bm(suite) -> []; 258: ipv6_bm(_) -> 259: case orber_test_lib:version_ok() of 260: true -> 261: ?match({ok, _, _, _}, bm2([{tcp_in, "2002:C0A8::/48"}], inet6, "2002:C0A8:0:0:0:0:0:0")), 262: ok; 263: Reason -> 264: Reason 265: end. 266: 267: %%----------------------------------------------------------------- 268: %% Local Functions 269: %%----------------------------------------------------------------- 270: -define(NO_OF_TIMES, 1000). 271: 272: bm2(Filters, Family, Ip) -> 273: {ok, IPTuple} = inet:getaddr(Ip, Family), 274: orber_acl:init_acl(Filters, Family), 275: TimeBefore1 = erlang:now(), 276: bm_loop(IPTuple, ?NO_OF_TIMES), 277: TimeAfter1 = erlang:now(), 278: orber_acl:clear_acl(), 279: Time1 = computeTime(TimeBefore1, TimeAfter1), 280: orber_acl:init_acl(Filters, Family), 281: TimeBefore2 = erlang:now(), 282: bm_loop2(Ip, ?NO_OF_TIMES, Family), 283: TimeAfter2 = erlang:now(), 284: orber_acl:clear_acl(), 285: Time2 = computeTime(TimeBefore2, TimeAfter2), 286: orber_acl:init_acl(Filters, Family), 287: TimeBefore3 = erlang:now(), 288: bm_loop2(IPTuple, ?NO_OF_TIMES, Family), 289: TimeAfter3 = erlang:now(), 290: orber_acl:clear_acl(), 291: Time3 = computeTime(TimeBefore3, TimeAfter3), 292: {ok, round(?NO_OF_TIMES/Time1), round(?NO_OF_TIMES/Time2), round(?NO_OF_TIMES/Time3)}. 293: 294: 295: bm_loop(_Ip, 0) -> 296: ok; 297: bm_loop(Ip, N) -> 298: true = orber_acl:match(Ip, tcp_in), 299: bm_loop(Ip, N-1). 300: 301: bm_loop2(_Ip, 0, _Family) -> 302: ok; 303: bm_loop2(Ip, N, Family) -> 304: {ok, IPTuple} = inet:getaddr(Ip, Family), 305: true = orber_acl:match(IPTuple, tcp_in), 306: bm_loop2(Ip, N-1, Family). 307: 308: computeTime({_MegaSecb, Secb, MicroSecb}, {_MegaSeca, Seca, MicroSeca}) -> 309: (Seca - Secb) + ((MicroSeca - MicroSecb) / 1000000). 310: 311: 312: %%----------------------------------------------------------------- 313: %% END OF MODULE 314: %%-----------------------------------------------------------------