summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/Simple_Naming/client.h
blob: 767a41855965b0a44ec86d36b6cf930b28c38538 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
/* -*- C++ -*- */

//=============================================================================
/**
 *  @file    client.h
 *
 *    This class tests the facilities to connect to the naming service.
 *
 *  @author   Marina Spivak <marina@cs.wustl.edu>
 */
//=============================================================================


#include "test_objectS.h"
#include "orbsvcs/CosNamingC.h"
#include "orbsvcs/Naming/Naming_Client.h"
#include "tao/Utils/ORB_Manager.h"
#include "ace/Task.h"

/**
 * @class Naming_Test
 *
 * @brief This is an abstract class which is subclassed
 * to create different Naming Service tests.
 *
 * This is a basic example of the "Strategy" pattern.  This class
 * provides a common interface for different tests (or
 * "strategies"), so that a specific test to be used can be
 * chosen at runtime.
 */
class Naming_Test
{

public:
  /// Execute the test code.  <root_context> is the context to assume
  /// as the root for all tests operations.
  virtual ~Naming_Test (void);
  virtual int execute (TAO_Naming_Client &root_context) = 0;

protected:
  Naming_Test (PortableServer::POA_ptr poa);

  PortableServer::POA_var poa_;
};

/**
 * @class Simple_Test
 *
 * @brief This class implements a simple Naming Service test.
 *
 * The test binds(), resolves(), and unbinds() an object
 * reference from the given Naming Context.
 */
class Simple_Test : public Naming_Test
{
public:
  Simple_Test (PortableServer::POA_ptr poa);

  /// Execute the simple test code.
  virtual int execute (TAO_Naming_Client &root_context);
};

/**
 * @class MT_Test
 *
 * @brief This class implements a simple Multithreaded (multiclient) Naming Service test.
 *
 * The test spawns multiple threads: each attempts to
 * bind(), resolve(), and unbind() an object
 * reference using the same name, and the same Naming Context.
 */
class MT_Test : public Naming_Test, public ACE_Task_Base
{
public:
  // = Initialization and termination methods.

  /// Constructor.  Takes in an orb pointer and number of threads to spawn.
  MT_Test (CORBA::ORB_ptr orb,
           PortableServer::POA_ptr poa,
           int size = 10);

  /// Execute the MT test code.
  virtual int execute (TAO_Naming_Client &root_context);

  /// This code is executed by each thread.
  virtual int svc (void);

private:
  /// Number of threads to spawn.  By default is set to 10.
  int size_;

  /// A pointer to our ORB.
  CORBA::ORB_var orb_;

  /**
   * IOR in the string format for Naming Service we are to deal with.
   * Each thread will use string_to_object() and this IOR to create
   * its own NamingContext stub for invoking operations on the
   * Naming Service.  If all threads try to use the same stub, bad things
   * happen...
   */
  CORBA::String_var name_service_ior_;

  // This can be replaced with CORBA::String_var when <string_to_object>
  // is fixed - this will clean up the memory properly.

  /// Holds name used for registering the object with Naming Service.
  CosNaming::Name test_name_;

  /// Holds object to be registered with the Naming Service by each thread.
  Test_Object_var test_ref_;

};

/**
 * @class Tree_Test
 *
 * @brief This class implements a test of all Naming Service functions
 * on a tree of Naming Contexts.
 *
 * Bind_context() under the root context with the name level1.
 * Create_new_context(), bind() foo object into it, and
 * bind the context into root/level1 under the name level2.
 * Resolve (root/level1/level2/foo).
 * Unbind (root/level1/level2/foo).
 * Bind (root/level1/level2/foo, obj)
 * Create_new_context()
 * and invoke rebind_context() to substitute it for the current
 * level2 context.
 * Bind (root/level1/level2/foo, obj)
 * Resolve (root/level1/level2/foo).
 * Rebind() to have a different object under the name bar.
 * Resolve (root/level1/level2/foo) to make sure correct reference is returned.
 */
class Tree_Test : public Naming_Test
{
public:
  /// Execute the tree test code.
  Tree_Test (PortableServer::POA_ptr poa);
  virtual int execute (TAO_Naming_Client &root_context);
};

/**
 * @class Iterator_Test
 *
 * @brief This class implements a test of Naming Service functions
 * which involve BindingIterator.
 *
 * The test binds foo1, foo2, foo3, and foo4 objects to the
 * Naming Context.  It lists() one binding and receives
 * BindingIterator to iterate over the rest of the bindings.  It
 * then invokes next_one(), next_n(2), next_one(), and destroy()
 * on the iterator.
 */
class Iterator_Test : public Naming_Test
{
public:
  /// Execute the iterator test code.
  Iterator_Test (PortableServer::POA_ptr poa);
  virtual int execute (TAO_Naming_Client &root_context);
};

/**
 * @class Exceptions_Test
 *
 * @brief This class implements a test of exceptions in the Naming Service.
 *
 * Makes sure that Naming Service throws exceptions as expected, and
 * data inside exceptions is set correctly.  The test creates a tree of
 * of Naming Contexts: root context -> level1 -> level2.  It then binds() an
 * object with the name foo to each of Naming Contexts in the tree.
 * Invoke resolve() with a Name of length 0 - make sure we get InvalidName exception.
 * Invoke bind( foo, obj) on root context - make sure we get AlreadyBound exception.
 * Invoke bind( level1/foo, obj) on root context - make sure we get AlreadyBound exc.
 * Invoke unbind( level1/level2/bar) on root context - make sure we get NotFound exc.
 * with why = not_object, rest_of_name = bar.
 * Invoke unbind( level1/level3/foo) on root context - make sure we get NotFound exc.
 * with why = missing_node, rest_of_name = level3/foo.
 * Invoke unbind( level1/foo/foo) on root context - make sure we get NotFound exc.
 * with why = not_context, rest_of_name = foo/foo.
 */
class Exceptions_Test : public Naming_Test
{
public:
  /// Execute the exceptions test code.
  Exceptions_Test (PortableServer::POA_ptr poa);
  virtual int execute (TAO_Naming_Client &root_context);

private:
  // the following functions isolate specific tests due to the
  // limitation of only 1 TAO_TRY being allowed per function.

  void invalid_name_test (TAO_Naming_Client &root_context);
  void already_bound_test (TAO_Naming_Client &root_context);
  void already_bound_test2 (TAO_Naming_Client &root_context);
  void not_found_test (TAO_Naming_Client &root_context);
  void not_found_test2 (TAO_Naming_Client &root_context);
  void not_found_test3 (TAO_Naming_Client &root_context);
};

/**
 * @class Destroy_Test
 *
 * @brief This class implements a test of destroy() function
 * in the Naming Service.
 *
 * Create a context and bind an object under it.
 * Attempt to destroy the context - NotEmpty exception should be raised.
 * Unbind the object and call destroy on the context.
 * Attempt to call destroy on the object again - OBJECT_NOT_EXIST
 * exception should be raised.
 */
class Destroy_Test : public Naming_Test
{
public:
  /// Execute the destroy test code.
  Destroy_Test (PortableServer::POA_ptr poa);
  virtual int execute (TAO_Naming_Client &root_context);

private:
  // = The following functions isolate specific tests.
  void not_empty_test (CosNaming::NamingContext_var &ref);
  void not_exist_test (CosNaming::NamingContext_var &ref);
};

/**
 * @class Persistent_Test_Begin
 *
 * @brief This class implements the first part of the Persistent Naming
 * Service test.
 *
 * This test creates the Naming Context hierarchy:
 * root -> level1_context -> level2_context,
 * and prints out the ior of the <level1_context>.
 */
class Persistent_Test_Begin : public Naming_Test
{
public:
  // = Initialization and termination methods.

  /// Constructor.  Takes in an orb pointer.
  Persistent_Test_Begin (CORBA::ORB_ptr orb,
                         PortableServer::POA_ptr poa,
                         FILE * ior_output_file);

  /// Destructor.
  virtual ~Persistent_Test_Begin (void);

  /// Execute the persistent test (part 1) code.
  virtual int execute (TAO_Naming_Client &root_context);

private:

  /// A pointer to our ORB (needed for object/string conversion).
  CORBA::ORB_var orb_;

  /// File where we output the ior for use by part 2 of persistent test.
  FILE *file_;
};

/**
 * @class Persistent_Test_End
 *
 * @brief This class implements the second part of the Persistent Naming
 * Service test.
 *
 * This test attempts to resolve <level2_context> both through the
 * <root> Naming Context, which it gets from <resolve_initial_references>, and
 * through <level1_context> stringified ior, which it gets from part 1 of
 * the persistent test.  The results of both methods are then
 * compared for equality.
 */
class Persistent_Test_End : public Naming_Test
{
public:
  // = Initialization and termination methods.

  /// Constructor.  Takes in an orb pointer and the ior received from
  /// <Persistent_Test_Begin>.
  Persistent_Test_End (CORBA::ORB_ptr orb,
                       PortableServer::POA_ptr poa,
                       const ACE_TCHAR * ior);

  /// Destructor.
  virtual ~Persistent_Test_End (void);

  /// Execute the persistent test (part 2).
  virtual int execute (TAO_Naming_Client &root_context);

private:

  /// A pointer to our ORB (used for string/object conversion).
  CORBA::ORB_var orb_;

  /// IOR of <level1_context> recorded during the run of part 1 of
  /// persistent test.
  const ACE_TCHAR* ior_;
};

/**
 * @class Persistent_List_Test
 *
 * @brief This class implements the third part of the Persistent Naming
 * Service test.
 *
 * This test attempts to invoke various list() methods on different
 * known contexts.
 */
class Persistent_List_Test : public Naming_Test
{
public:
  // = Initialization and termination methods.

  /// Constructor.  Takes in an orb pointer.
  Persistent_List_Test (CORBA::ORB_ptr orb,
                        PortableServer::POA_ptr poa);

  /// Destructor.
  virtual ~Persistent_List_Test (void);

  /// Execute the persistent test (part 3).
  virtual int execute (TAO_Naming_Client &root_context);

private:

  /// A pointer to our ORB (used for string/object conversion).
  CORBA::ORB_var orb_;
};

/**
 * @class CosNaming_Client
 *
 * @brief Defines a class that encapsulates behaviour of the CosNaming
 * client example.  Provides a better understanding of the logic
 * in an object-oriented way.
 *
 * This class declares an interface to run the example client for
 * CosNaming CORBA server.  All the complexity for initializing
 * the server is hidden in the class.  Just the <run> interface
 * is needed.
 */
class CosNaming_Client
{
public:
  // = Initialization and termination methods.

  /// Constructor.
  CosNaming_Client (void);

  /// Destructor.
  ~CosNaming_Client (void);

  /// Execute client example code.
  int run (void);

  /// Initialize the client communication endpoint with server.
  int init (int argc, ACE_TCHAR **argv);

  // = Symbolic ids.
  enum OBJ_ID
  {
    OBJ1_ID = 5,
    OBJ2_ID = 6
  };

private:
  /// Parses the arguments passed on the command line.
  int parse_args (void);

  /// # of arguments on the command line.
  int argc_;

  /// arguments from command line.
  ACE_TCHAR **argv_;

  /// A pointer to the specific Naming Service test a client will
  /// execute.
  Naming_Test *test_;

  /// Our ORB manager helper class.
  TAO_ORB_Manager orbmgr_;

  /// Our naming client helper class.
  TAO_Naming_Client naming_client_;
};