1: %%
    2: %% %CopyrightBegin%
    3: %% 
    4: %% Copyright Ericsson AB 1997-2011. 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 Name service
   24: %%
   25: %%-----------------------------------------------------------------
   26: -module(naming_context_SUITE).
   27: 
   28: -include_lib("test_server/include/test_server.hrl").
   29: -include_lib("orber/COSS/CosNaming/CosNaming.hrl").
   30: -include_lib("orber/src/orber_iiop.hrl").
   31: -include_lib("orber/include/corba.hrl").
   32: 
   33: -define(default_timeout, ?t:minutes(5)).
   34: 
   35: %%-----------------------------------------------------------------
   36: %% External exports
   37: %%-----------------------------------------------------------------
   38: -export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
   39: 
   40: %%-----------------------------------------------------------------
   41: %% Internal exports
   42: %%-----------------------------------------------------------------
   43: 
   44: -export([name_context/1, check_list/1, name_context_ext/1]).
   45: 
   46: -export([init_per_suite/1, end_per_suite/1, init_per_testcase/2, 
   47: 	 end_per_testcase/2]).
   48: 
   49: 
   50: %%-----------------------------------------------------------------
   51: %% Macros
   52: %%-----------------------------------------------------------------
   53: -define(REMAP_EXCEPT(F), case catch F of
   54: 			     {'EXCEPTION', E} -> exit(E);
   55: 			     {'EXIT', E} -> exit(E);
   56: 			     R -> R
   57: 			 end).
   58: 
   59: -define(match(ExpectedRes, Expr),
   60:         fun() ->
   61:                 AcTuAlReS = (catch (Expr)),
   62:                 case AcTuAlReS of
   63:                     ExpectedRes ->
   64:                         io:format("------ CORRECT RESULT ------~n~p~n",
   65:                                   [AcTuAlReS]),
   66:                         AcTuAlReS;
   67:                     _ ->
   68:                         io:format("###### ERROR ERROR ######~n~p~n",
   69:                                   [AcTuAlReS]),
   70:                         ?line exit(AcTuAlReS)
   71:                 end
   72:         end()).
   73:  
   74: %%-----------------------------------------------------------------
   75: %% Func: all/1
   76: %% Args: 
   77: %% Returns: 
   78: %%-----------------------------------------------------------------
   79: suite() -> [{ct_hooks,[ts_install_cth]}].
   80: 
   81: all() -> 
   82:     cases().
   83: 
   84: groups() -> 
   85:     [].
   86: 
   87: init_per_group(_GroupName, Config) ->
   88:     Config.
   89: 
   90: end_per_group(_GroupName, Config) ->
   91:     Config.
   92: 
   93: 
   94: cases() -> 
   95:     [name_context, check_list, name_context_ext].
   96: 
   97: %%-----------------------------------------------------------------
   98: %% Init and cleanup functions.
   99: %%-----------------------------------------------------------------
  100: 
  101: init_per_testcase(_Case, Config) ->
  102:     Path = code:which(?MODULE),
  103:     code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
  104:     ?line Dog=test_server:timetrap(?default_timeout),
  105:     orber:jump_start(0),
  106:     [{watchdog, Dog}|Config].
  107: 
  108: 
  109: end_per_testcase(_Case, Config) ->
  110:     Path = code:which(?MODULE),
  111:     code:del_path(filename:join(filename:dirname(Path), "idl_output")),
  112:     orber:jump_stop(),
  113:     Dog = ?config(watchdog, Config),
  114:     test_server:timetrap_cancel(Dog),
  115:     ok.
  116: 
  117: init_per_suite(Config) ->
  118:     Config.
  119: 
  120: end_per_suite(Config) ->
  121:     Config.
  122: 
  123: %%-----------------------------------------------------------------
  124: %% Test Case: name handling tests
  125: %% Description: 
  126: %%-----------------------------------------------------------------
  127: name_context(doc) -> ["Description", "more description"];
  128: name_context(suite) -> [];
  129: name_context(_) ->
  130:     ?REMAP_EXCEPT(name_context_run()).
  131: 
  132: name_context_run() ->
  133:     ?line Ns = corba:resolve_initial_references("NameService"),
  134: 
  135:     ?match({'EXCEPTION', #'NO_PERMISSION'{}},
  136: 	   'CosNaming_NamingContextExt':destroy(Ns)),
  137: 
  138:     %% Create a test context.
  139:     ?line Tc = 'CosNaming_NamingContext':bind_new_context(Ns,
  140: 				[#'CosNaming_NameComponent'{id="testcontext",
  141: 							    kind=""}]),
  142:     %% Start testing
  143:     ?line 'CosNaming_NamingContext':bind(Tc, [#'CosNaming_NameComponent'
  144: 					      {id="hej",
  145: 					       kind=""}], Ns),
  146:     ?line Ns = 'CosNaming_NamingContext':resolve(Tc,
  147: 				       [#'CosNaming_NameComponent'{id="hej",
  148: 								   kind=""}]),
  149:     ?line Nc = 'CosNaming_NamingContext':new_context(Tc),
  150:     ?line 'CosNaming_NamingContext':bind(Tc, [#'CosNaming_NameComponent'
  151: 					      {id="stop",
  152: 					       kind=""}], Nc),
  153:     ?line Nc = 'CosNaming_NamingContext':resolve(Tc,
  154: 				       [#'CosNaming_NameComponent'{id="stop",
  155: 								   kind=""}]),
  156:     ?line {'EXCEPTION', E0} =
  157: 	(catch 'CosNaming_NamingContext':bind(Tc,
  158: 			          [#'CosNaming_NameComponent'{id="stop",
  159: 							      kind=""}], Ns)),
  160:     ?line ok = 'CosNaming_NamingContext':rebind(Tc,
  161: 			          [#'CosNaming_NameComponent'{id="stop",
  162: 							      kind=""}], Ns),
  163:     ?line {'CosNaming_NamingContext_AlreadyBound', _} = E0,
  164:     ?line 'CosNaming_NamingContext':bind_context(Tc,
  165: 				   [#'CosNaming_NameComponent'{id="evaluate",
  166: 							       kind=""}], Nc),
  167:     ?line Nc =
  168: 	'CosNaming_NamingContext':resolve(Tc,
  169: 			      [#'CosNaming_NameComponent'{id="evaluate",
  170: 							  kind=""}]),
  171:     ?line 'CosNaming_NamingContext':bind(Tc,
  172: 			      [#'CosNaming_NameComponent'{id="evaluate",
  173: 							  kind=""},
  174: 			       #'CosNaming_NameComponent'{id="hej",
  175: 							  kind=""}], Ns),
  176:     ?line ok = 'CosNaming_NamingContext':rebind(Tc,
  177: 			      [#'CosNaming_NameComponent'{id="evaluate",
  178: 							  kind=""},
  179: 			       #'CosNaming_NameComponent'{id="hej",
  180: 							  kind=""}], Ns),
  181:     ?line Ns = 'CosNaming_NamingContext':resolve(Tc,
  182: 			      [#'CosNaming_NameComponent'{id="evaluate",
  183: 							  kind=""},
  184: 			       #'CosNaming_NameComponent'{id="hej",
  185: 							  kind=""}]),
  186:     ?line {'EXCEPTION', E1} =
  187: 	(catch 'CosNaming_NamingContext':resolve(Tc,
  188: 			       [#'CosNaming_NameComponent'{id="stop",
  189: 							   kind=""},
  190: 				#'CosNaming_NameComponent'{id="hej",
  191: 							   kind=""}])),
  192:     ?line ?match(ok, orber_diagnostics:nameservice()),
  193: 
  194:     ?line {'CosNaming_NamingContext_CannotProceed', _,_,_} = E1,
  195:     ?line {'EXCEPTION', E2} = (catch 'CosNaming_NamingContext':destroy(Nc)),
  196:     ?line {'CosNaming_NamingContext_NotEmpty', _} = E2,
  197:     ?line ok = 'CosNaming_NamingContext':unbind(Tc,
  198: 				[#'CosNaming_NameComponent'{id="evaluate",
  199: 							    kind=""},
  200: 				 #'CosNaming_NameComponent'{id="hej",
  201: 							    kind=""}]),
  202:     ?line ok = 'CosNaming_NamingContext':destroy(Nc),
  203:     ?line ok = 'CosNaming_NamingContext':unbind(Tc,
  204: 				 [#'CosNaming_NameComponent'{id="evaluate",
  205: 							     kind=""}]),
  206:     ?line ok = 'CosNaming_NamingContext':unbind(Tc,
  207: 				 [#'CosNaming_NameComponent'{id="stop",
  208: 							     kind=""}]),
  209:     ?line ok = 'CosNaming_NamingContext':unbind(Tc,
  210: 				 [#'CosNaming_NameComponent'{id="hej",
  211: 							     kind=""}]),
  212:     ?line case 'CosNaming_NamingContext':list(Tc, 3) of
  213: 	      {ok, [], ?ORBER_NIL_OBJREF} ->
  214: 		  ok;
  215: 	      _ ->
  216: 		  exit(not_empty)
  217: 	  end,
  218:     ?line ok = 'CosNaming_NamingContext':unbind(Ns,
  219: 			      [#'CosNaming_NameComponent'{id="testcontext",
  220: 							  kind=""}]),
  221:     ?line ok = 'CosNaming_NamingContext':destroy(Tc),
  222:     ok.
  223: 
  224: 
  225: 
  226: check_list(doc) -> 
  227:     ["Check that the CosNaming::NamingContext::list()", 
  228:      "returns ok.",
  229:      "Own Id: OTP-2023"];
  230: check_list(suite) -> [];
  231: check_list(Config) when is_list(Config) ->
  232:     ?REMAP_EXCEPT(check_list_run(Config)).
  233: 
  234: check_list_run(_Config) ->
  235:     create_default_contexts(),
  236:     ?line Ns = corba:resolve_initial_references("NameService"),
  237:     ?line {_, BL, _} = ?match({ok, _, ?ORBER_NIL_OBJREF}, 
  238: 			      'CosNaming_NamingContext':list(Ns, 256)),
  239:     
  240:     FF = fun(X) -> XX = hd(X#'CosNaming_Binding'.binding_name),
  241: 		   XX#'CosNaming_NameComponent'.id end,
  242: 		  
  243:     L = lists:sort(lists:map(FF, BL)),
  244:     ?line ["host", "workgroup"] = L,
  245:     
  246:     %% Test next_n/2
  247:     ?line {_, _, BI} = ?match({ok, [], _BI}, 'CosNaming_NamingContext':list(Ns, 0)),
  248:     ?line ?match({true, []}, 'CosNaming_BindingIterator':next_n(BI, 0)),
  249:     ?line ?match({true, [_]}, 'CosNaming_BindingIterator':next_n(BI, 1)),
  250:     ?line ?match({false, [_]}, 'CosNaming_BindingIterator':next_n(BI, 1)),
  251:     ?line ?match({false, []}, 'CosNaming_BindingIterator':next_n(BI, 1)),
  252:     ?line ?match(ok, 'CosNaming_BindingIterator':destroy(BI)),
  253: 
  254:     ?line {_, _, BI2} = ?match({ok, [], _BI2}, 'CosNaming_NamingContext':list(Ns, 0)),
  255:     ?line ?match({true, _}, 'CosNaming_BindingIterator':next_one(BI2)),
  256:     ?line ?match({true, _}, 'CosNaming_BindingIterator':next_one(BI2)),
  257:     ?line ?match({false, _}, 'CosNaming_BindingIterator':next_one(BI2)),
  258:     ?line ?match(ok, 'CosNaming_BindingIterator':destroy(BI2)),
  259:     ?line ?match(ok, orber_diagnostics:nameservice()),
  260:     ok.
  261: 
  262: create_default_contexts() ->
  263:     HostComponent = lname_component:set_id(lname_component:create(),
  264: 					   "host"),
  265:     HostsComponent = lname_component:set_id(lname_component:create(),
  266: 					    "hosts"),
  267:     ResourcesComponent = lname_component:set_id(lname_component:create(),
  268: 						"resources"),
  269:     DevelopmentComponent = lname_component:set_id(lname_component:create(),
  270: 					   "development"),
  271:     FactoriesComponent = lname_component:set_id(lname_component:create(),
  272: 					   "factories"),
  273:     WGComponent = lname_component:set_id(lname_component:create(),
  274: 					   "workgroup"),
  275:     %% Creation of Naming Context host and it's subcontexts
  276:     NS = corba:resolve_initial_references("NameService"),
  277:     H = 'CosNaming_NamingContext':bind_new_context(NS,
  278: 		lname:insert_component(lname:create(), 1, HostComponent)),
  279:     HR = 'CosNaming_NamingContext':bind_new_context(H,
  280: 		lname:insert_component(lname:create(), 1, ResourcesComponent)),
  281:     'CosNaming_NamingContext':bind_new_context(HR,
  282: 		lname:insert_component(lname:create(), 1, FactoriesComponent)),
  283:     HD = 'CosNaming_NamingContext':bind_new_context(H,
  284: 	lname:insert_component(lname:create(), 1, DevelopmentComponent)),
  285:     HDR = 'CosNaming_NamingContext':bind_new_context(HD,
  286: 		lname:insert_component(lname:create(), 1, ResourcesComponent)),
  287:     'CosNaming_NamingContext':bind_new_context(HDR,
  288: 		lname:insert_component(lname:create(), 1, FactoriesComponent)),
  289:       %% Creation of Naming Context workgroup and it's subcontexts
  290:     W = 'CosNaming_NamingContext':bind_new_context(NS,
  291: 		lname:insert_component(lname:create(), 1, WGComponent)),
  292:     'CosNaming_NamingContext':bind_new_context(W,
  293: 		lname:insert_component(lname:create(), 1, HostsComponent)),
  294:     WR = 'CosNaming_NamingContext':bind_new_context(W,
  295: 		lname:insert_component(lname:create(), 1, ResourcesComponent)),
  296:     'CosNaming_NamingContext':bind_new_context(WR,
  297: 		lname:insert_component(lname:create(), 1, FactoriesComponent)),
  298:     WD = 'CosNaming_NamingContext':bind_new_context(W,
  299: 	lname:insert_component(lname:create(), 1, DevelopmentComponent)),
  300:     WDR = 'CosNaming_NamingContext':bind_new_context(WD,
  301: 		lname:insert_component(lname:create(), 1, ResourcesComponent)),
  302:     'CosNaming_NamingContext':bind_new_context(WDR,
  303: 		lname:insert_component(lname:create(), 1, FactoriesComponent)),
  304:     ok.
  305: 
  306: %%-----------------------------------------------------------------
  307: %% Test Case: 
  308: %% Description: 
  309: %%-----------------------------------------------------------------
  310: name_context_ext(doc) -> ["Description", "more description"];
  311: name_context_ext(suite) -> [];
  312: name_context_ext(_Config) ->
  313:     ?REMAP_EXCEPT(name_context_ext_run()).
  314: 
  315: name_context_ext_run() ->
  316:     ?line NS = ?match({_,pseudo,_, _,_, _},
  317: 		      corba:resolve_initial_references("NameService")),
  318:     
  319:     Name1 = [#'CosNaming_NameComponent'{id="\\<id1\\>", kind="kind1"},
  320: 	     #'CosNaming_NameComponent'{id="id2", kind="kind2"}],
  321:     String1 = "\\<id1\\>.kind1/id2.kind2",
  322:     Name2 = [#'CosNaming_NameComponent'{id="id1", kind=""},
  323: 	     #'CosNaming_NameComponent'{id="id2", kind=""},
  324: 	     #'CosNaming_NameComponent'{id="id3", kind=""}],
  325:     String2 = "id1/id2/id3",
  326:     Name3 = [#'CosNaming_NameComponent'{id="id1", kind="kind1"},
  327: 	     #'CosNaming_NameComponent'{id="", kind=""},
  328: 	     #'CosNaming_NameComponent'{id="id3", kind="kind3"}],
  329:     String3 = "id1.kind1/./id3.kind3",
  330:     Name4 = [#'CosNaming_NameComponent'{id="id1", kind="kind1"},
  331: 	     #'CosNaming_NameComponent'{id="i.d.2", kind="kind2"},
  332: 	     #'CosNaming_NameComponent'{id="id3", kind="kind3"}],
  333:     String4 = "id1.kind1/i\\.d\\.2.kind2/id3.kind3",
  334:     Name5 = [#'CosNaming_NameComponent'{id="id1", kind=""},
  335: 	     #'CosNaming_NameComponent'{id="i/d/2", kind="kind2"},
  336: 	     #'CosNaming_NameComponent'{id="id3", kind=""}],
  337:     String5 = "id1/i\\/d\\/2.kind2/id3",
  338: 
  339:     BadString1 = "id1./id2/id3",
  340:     BadString2 = "id1//id3",
  341: 
  342:     ?match(String1, 'CosNaming_NamingContextExt':to_string(NS, Name1)),
  343:     ?match(String2, 'CosNaming_NamingContextExt':to_string(NS, Name2)),
  344:     ?match(String3, 'CosNaming_NamingContextExt':to_string(NS, Name3)),
  345:     ?match(String4, 'CosNaming_NamingContextExt':to_string(NS, Name4)),
  346:     ?match(String5, 'CosNaming_NamingContextExt':to_string(NS, Name5)),
  347:     ?match(Name1, 'CosNaming_NamingContextExt':to_name(NS, String1)),
  348:     ?match(Name2, 'CosNaming_NamingContextExt':to_name(NS, String2)),
  349:     ?match(Name3, 'CosNaming_NamingContextExt':to_name(NS, String3)),
  350:     ?match(Name4, 'CosNaming_NamingContextExt':to_name(NS, String4)),
  351:     ?match(Name5, 'CosNaming_NamingContextExt':to_name(NS, String5)),
  352: 
  353:     ?match({'EXCEPTION', {'CosNaming_NamingContext_InvalidName',_}}, 
  354: 	   'CosNaming_NamingContextExt':to_name(NS, BadString1)),
  355:     ?match({'EXCEPTION', {'CosNaming_NamingContext_InvalidName',_}}, 
  356: 	   'CosNaming_NamingContextExt':to_name(NS, BadString2)),
  357: 
  358:     %% Create a test context.
  359:     ?line Tc = ?match({_,pseudo,_, _,_, _},
  360: 		      'CosNaming_NamingContext':bind_new_context(NS,
  361: 				[#'CosNaming_NameComponent'{id="testcontext",
  362: 							    kind=""}])),
  363:     ?match(ok, 'CosNaming_NamingContext':bind(Tc, [#'CosNaming_NameComponent'
  364: 						   {id="hej",
  365: 						    kind=""}], NS)),
  366: 
  367:     ?match(NS, 'CosNaming_NamingContextExt':resolve_str(Tc, "hej")),
  368: 
  369:     ?match("corbaloc:rir:", 'CosNaming_NamingContextExt':to_url(Tc, "rir:", "")),
  370:     ?match("corbaname:rir:/NameService#org/erlang/",
  371: 	   'CosNaming_NamingContextExt':to_url(Tc, "rir:/NameService", "org/erlang/")),
  372:     ?match("corbaloc::1.1@555%3cxyz.com:9999/Dev/NameService",
  373: 	   'CosNaming_NamingContextExt':to_url(Tc, ":1.1@555\\<xyz.com:9999/Dev/NameService", "")),
  374: 
  375:     %% Bad port
  376:     ?match({'EXCEPTION', {'CosNaming_NamingContextExt_InvalidAddress',_}}, 
  377: 	   'CosNaming_NamingContextExt':to_url(Tc, ":1.1@555xyz.com:99a9/", "")),
  378:     %% BAd IIOP-version
  379:     ?match({'EXCEPTION', {'CosNaming_NamingContextExt_InvalidAddress',_}}, 
  380: 	   'CosNaming_NamingContextExt':to_url(Tc, ":1@555xyz.com:99a9/", "")),
  381:     %% Bad IIOP-version
  382:     ?match({'EXCEPTION', {'CosNaming_NamingContextExt_InvalidAddress',_}}, 
  383: 	   'CosNaming_NamingContextExt':to_url(Tc, ":@555xyz.com:99a9/", "")),
  384:     %% Bad protocol
  385:     ?match({'EXCEPTION', {'CosNaming_NamingContextExt_InvalidAddress',_}}, 
  386: 	   'CosNaming_NamingContextExt':to_url(Tc, "iop:@555xyz.com:99a9/", "")),
  387:     %% Unsupported protocol
  388:     ?match({'EXCEPTION', {'CosNaming_NamingContextExt_InvalidAddress',_}}, 
  389: 	   'CosNaming_NamingContextExt':to_url(Tc, "atm:@555xyz.com:9999/", "")),
  390:     %% Bad Name
  391:     ?match({'EXCEPTION', {'CosNaming_NamingContext_InvalidName',_}}, 
  392: 	   'CosNaming_NamingContextExt':to_url(Tc, ":555xyz.com:9999/", "id1./id2.kind2")),
  393: 
  394:     ok.
  395: 
  396: