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: