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: %%-----------------------------------------------------------------