Revert "Minor modernization of DynamicAny code"
[ACE_TAO.git] / TAO / tests / Bug_4097_Regression / README
blobe3c8e158def49fb0c5de62108177b0f5cc39a5f9
3 This is Prismtech Jira TAO-69 and Bugzilla_4097
5 Typecodes for UNIONs with multiple labels per individual case are
6 generated incorrectly.
10 For example the following legal IDL union declarion:
12 union MultiLabelUnion switch (long) {
13  case 0:
14  case 1:
15    char mlu_char;
16  case 2:
17    long mlu_long;
20 Currently TAO (and a few other orbs including JacOrb and eOrb'C' eORB'C++') do
21 not handle the typecode generation correctly for this. Only one of the above
22 cases for the mlu_char member are dealt with in the typecode information, even
23 though the generated (de)marshaling code correctly handles all case labels.
24 This means that such unions sent inside anys are impossiable to decode at the
25 receiving end if the missing case label is being used for the union it holds.
27 When using the typecode interface functions for the above it incorrectly gives:
28 tc->member_count () returns 2 (for the two types)
29 tc->member_label(0), tc->member_name(0) and tc->member_type(0)
30   returns 0, "mlu_char", and char
31 tc->member_label(1), tc->member_name(1) and tc->member_type(1)
32   returns 2, "mlu_long", and long
34 The exact handling for the above is not actually dealt with in the CORBA spec
35 as far as I can see excepting that multiple case labels for a type are
36 perfectly valid for unions. BUT I've found a little passage detailing this in
37 the Henning and Vinoski "Advanced CORBA Programming with C++" bilble. See
38 page 700. (of the 16.3.2 Chapter "Type Code Parameters" page 698-700
39 covering "Type Code Parameters for Unions"). This states that the
40 member_count for unions should actually be the number of case labels NOT the
41 number of types. This would make the typecode information that needs to be
42 generated for the above type produce:
44 tc->member_count () returns 3 (for the the number of labels)
45 tc->member_label(0), tc->member_name(0) and tc->member_type(0)
46   returns 0, "mlu_char", and char
47 tc->member_label(1), tc->member_name(1) and tc->member_type(1)
48   returns 1, "mlu_char", and char
49 tc->member_label(2), tc->member_name(2) and tc->member_type(2)
50   returns 2, "mlu_long", and long
52 This was found by a Prismtech customer who noted that inter-op with TIDorb
53 wasn't working correctly when extracting such a union from an any as generated
54 by TAO. As a work-a-round, if they modified the IDL for the type to:
56 union MultiLabelUnion switch (long) {
57  case 0:
58    char mlu_char;
59  case 1:
60    char mlu_char;
61  case 2:
62    long mlu_long;
65 everything started working again, but that the normal IDL (that doesn't work)
66 should also work.
68 ----------------
69 Failing test run:
70 ----------------
72 Starting
73 Creating union using default descriminant of mlu_char type
74 . Extracted descriminant is correct (0)
75 . Extracted value is correct (x)
76 Encode->Decode any with union using default descriminant of mlu_char type
77 . Size of encoding is 129
78 . Extracted descriminant is correct (0)
79 . Extracted value is correct (x)
80 Creating union using case 0
81 . Extracted descriminant is correct (0)
82 . Extracted value is correct (y)
83 Encode->Decode any with union using case 0
84 . Size of encoding is 129
85 . Extracted descriminant is correct (0)
86 . Extracted value is correct (y)
87 Creating union using case 1
88 . Extracted descriminant is correct (1)
89 . Extracted value is correct (z)
90 Encode->Decode any with union using case 1
91 . Size of encoding is 129
92 . DID NOT Extract from any (Test Failure)
93 Test FAILED.
95 ----------------
96 Passing test run:
97 ----------------
99 Starting
100 Creating union using default descriminant of mlu_char type
101 . Extracted descriminant is correct (0)
102 . Extracted value is correct (x)
103 Encode->Decode any with union using default descriminant of mlu_char type
104 . Size of encoding is 129
105 . Extracted descriminant is correct (0)
106 . Extracted value is correct (x)
107 Creating union using case 0
108 . Extracted descriminant is correct (0)
109 . Extracted value is correct (y)
110 Encode->Decode any with union using case 0
111 . Size of encoding is 129
112 . Extracted descriminant is correct (0)
113 . Extracted value is correct (y)
114 Creating union using case 1
115 . Extracted descriminant is correct (1)
116 . Extracted value is correct (z)
117 Encode->Decode any with union using case 1
118 . Size of encoding is 129
119 . Extracted descriminant is correct (1)
120 . Extracted value is correct (z)
121 Test SUCCEEDED.