xref: /AOO41X/main/testtools/source/bridgetest/cli/cli_cs_bridgetest.cs (revision cf279e262acddfb6714fdc2d1bf31dfcd968f271)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 using System;
25 using System.Diagnostics;
26 using System.Reflection;
27 using uno;
28 using uno.util;
29 using unoidl.com.sun.star.uno;
30 using unoidl.com.sun.star.lang;
31 //using unoidl.com.sun.star.test.bridge;
32 using unoidl.test.testtools.bridgetest;
33 
34 namespace foo
35 {
36     public interface MyInterface
37     {
38     }
39 }
40 
41 namespace cs_testobj
42 {
43     class ORecursiveCall: WeakBase, XRecursiveCall
44     {
callRecursivly(XRecursiveCall xCall, int nToCall)45         public void  callRecursivly(XRecursiveCall xCall, int nToCall)
46         {
47             lock (this)
48             {
49                 if (nToCall > 0)
50                 {
51                     nToCall --;
52                     xCall.callRecursivly(this, nToCall);
53                 }
54             }
55         }
56     };
57 
58 class Constants
59 {
60    public const string STRING_TEST_CONSTANT = "\" paco\' chorizo\\\' \"\'";
61 }
62 
63 public class BridgeTest : WeakBase, XMain
64 {
compareData(Object val1, Object val2)65     static bool compareData(Object val1, Object val2)
66     {
67         if (val1 == null && val2 == null || val1 == val2)
68             return true;
69         if ((val1 == null && val2 != null) ||
70             (val1 != null && val2 == null) || val1.GetType() != val2.GetType())
71             return false;
72 
73         bool ret = false;
74         Type t1  = val1.GetType();
75             //Sequence
76         if (t1.IsArray)
77         {
78             ret = compareSequence((Array) val1, (Array) val2);
79         }
80             //String
81         else if (t1 == typeof(string))
82         {
83             ret = (string) val1 == (string) val2;
84         }
85             // Interface implementation
86         else if (t1.GetInterfaces().Length > 0 && ! t1.IsValueType)
87         {
88             ret = val1 == val2;
89         }
90             // Struct
91         else if ( ! t1.IsValueType)
92         {
93             ret = compareStruct(val1, val2);
94         }
95         else if (t1 == typeof(Any))
96         {
97             Any a1 = (Any) val1;
98             Any a2 = (Any) val2;
99             ret = a1.Type == a2.Type && compareData(a1.Value, a2.Value);
100         }
101         else if (t1.IsValueType)
102         {
103             //Any, enum, int, bool char, float, double etc.
104             ret = val1.Equals(val2);
105         }
106         else
107         {
108             Debug.Assert(false);
109         }
110         return ret;
111     }
112 
113     // Arrays have only one dimension
compareSequence(Array ar1, Array ar2)114     static bool compareSequence(Array ar1, Array ar2)
115     {
116         Debug.Assert(ar1 != null && ar2 != null);
117         Type t1 = ar1.GetType();
118         Type t2 = ar2.GetType();
119 
120         if (!(ar1.Rank == 1 && ar2.Rank == 1
121             && ar1.Length == ar2.Length && t1.GetElementType() == t2.GetElementType()))
122             return false;
123 
124         //arrays have same rank and size and element type.
125         int len  = ar1.Length;
126         Type elemType = t1.GetElementType();
127         bool ret = true;
128         for (int i = 0; i < len; i++)
129         {
130             if (compareData(ar1.GetValue(i), ar2.GetValue(i)) == false)
131             {
132                 ret = false;
133                 break;
134             }
135         }
136         return ret;
137     }
138 
compareStruct(Object val1, Object val2)139     static bool compareStruct(Object val1, Object val2)
140     {
141         Debug.Assert(val1 != null && val2 != null);
142         Type t1 = val1.GetType();
143         Type t2 = val2.GetType();
144         if (t1 != t2)
145             return false;
146         FieldInfo[] fields = t1.GetFields();
147         int cFields = fields.Length;
148         bool ret = true;
149         for (int i = 0; i < cFields; i++)
150         {
151             Object fieldVal1 = fields[i].GetValue(val1);
152             Object fieldVal2 = fields[i].GetValue(val2);
153             if ( ! compareData(fieldVal1, fieldVal2))
154             {
155                 ret = false;
156                 break;
157             }
158         }
159         return ret;
160     }
161 
check( bool b , string message )162     static bool check( bool b , string message )
163     {
164         if ( ! b)
165         Console.WriteLine("{0} failed\n" , message);
166         return b;
167     }
168 
equals(TestElement rData1, TestElement rData2)169     static bool equals(TestElement rData1, TestElement  rData2)
170     {
171         check( rData1.Bool == rData2.Bool, "### bool does not match!" );
172         check( rData1.Char == rData2.Char, "### char does not match!" );
173         check( rData1.Byte == rData2.Byte, "### byte does not match!" );
174         check( rData1.Short == rData2.Short, "### short does not match!" );
175         check( rData1.UShort == rData2.UShort, "### unsigned short does not match!" );
176         check( rData1.Long == rData2.Long, "### long does not match!" );
177         check( rData1.ULong == rData2.ULong, "### unsigned long does not match!" );
178         check( rData1.Hyper == rData2.Hyper, "### hyper does not match!" );
179         check( rData1.UHyper == rData2.UHyper, "### unsigned hyper does not match!" );
180         check( rData1.Float == rData2.Float, "### float does not match!" );
181         check( rData1.Double == rData2.Double, "### double does not match!" );
182         check( rData1.Enum == rData2.Enum, "### enum does not match!" );
183         check( rData1.String == rData2.String, "### string does not match!" );
184         check( rData1.Interface == rData2.Interface, "### interface does not match!" );
185         check( compareData(rData1.Any, rData2.Any), "### any does not match!" );
186 
187         return (rData1.Bool == rData2.Bool &&
188                 rData1.Char == rData2.Char &&
189                 rData1.Byte == rData2.Byte &&
190                 rData1.Short == rData2.Short &&
191                 rData1.UShort == rData2.UShort &&
192                 rData1.Long == rData2.Long &&
193                 rData1.ULong == rData2.ULong &&
194                 rData1.Hyper == rData2.Hyper &&
195                 rData1.UHyper == rData2.UHyper &&
196                 rData1.Float == rData2.Float &&
197                 rData1.Double == rData2.Double &&
198                 rData1.Enum == rData2.Enum &&
199                 rData1.String == rData2.String &&
200                 rData1.Interface == rData2.Interface &&
201                 compareData(rData1.Any, rData2.Any));
202     }
203 
assign( TestElement rData, bool bBool, char cChar, byte nByte, short nShort, ushort nUShort, int nLong, uint nULong, long nHyper, ulong nUHyper, float fFloat, double fDouble, TestEnum eEnum, string rStr, Object xTest, Any rAny )204 static void assign( TestElement rData,
205                     bool bBool, char cChar, byte nByte,
206                     short nShort, ushort nUShort,
207                     int nLong, uint nULong,
208                     long nHyper, ulong nUHyper,
209                     float fFloat, double fDouble,
210                     TestEnum eEnum, string rStr,
211                     Object xTest,
212                     Any rAny )
213 {
214     rData.Bool = bBool;
215     rData.Char = cChar;
216     rData.Byte = nByte;
217     rData.Short = nShort;
218     rData.UShort = nUShort;
219     rData.Long = nLong;
220     rData.ULong = nULong;
221     rData.Hyper = nHyper;
222     rData.UHyper = nUHyper;
223     rData.Float = fFloat;
224     rData.Double = fDouble;
225     rData.Enum = eEnum;
226     rData.String = rStr;
227     rData.Interface = xTest;
228     rData.Any = rAny;
229 }
230 
assign( TestDataElements rData, bool bBool, char cChar, byte nByte, short nShort, ushort nUShort, int nLong, uint nULong, long nHyper, ulong nUHyper, float fFloat, double fDouble, TestEnum eEnum, string rStr, Object xTest, Any rAny, TestElement[] rSequence)231 static void assign( TestDataElements rData,
232                     bool bBool, char cChar, byte nByte,
233                     short nShort, ushort nUShort,
234                     int nLong, uint nULong,
235                     long nHyper, ulong nUHyper,
236                     float fFloat, double fDouble,
237                     TestEnum eEnum, string rStr,
238                     Object xTest,
239                     Any rAny,
240                     TestElement[] rSequence)
241 {
242     assign( (TestElement) rData,
243             bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
244             eEnum, rStr, xTest, rAny );
245     rData.Sequence = rSequence;
246 }
247 
248 // template < class type >
testAny(Type typ, Object value, XBridgeTest xLBT )249 static bool testAny(Type typ, Object  value, XBridgeTest xLBT )
250 {
251     Any any;
252     if (typ == null)
253         any = new Any(value.GetType(), value);
254     else
255         any = new Any(typ, value);
256 
257     Any any2 = xLBT.transportAny(any);
258     bool ret;
259     if( ! (ret= compareData(any, any2)))
260     {
261         Console.WriteLine("any is different after roundtrip: in {0}, out {1}\n",
262                           any.Type.FullName, any2.Type.FullName);
263     }
264     return ret;
265 }
266 
267 
268 
performAnyTest(XBridgeTest xLBT, TestDataElements data)269 static bool performAnyTest(XBridgeTest xLBT,  TestDataElements data)
270 {
271     bool bReturn = true;
272     bReturn = testAny( null, data.Byte ,xLBT ) && bReturn;
273     bReturn = testAny( null, data.Short,xLBT ) && bReturn;
274     bReturn = testAny(  null, data.UShort,xLBT ) && bReturn;
275     bReturn = testAny(  null, data.Long,xLBT ) && bReturn;
276     bReturn = testAny(  null, data.ULong,xLBT ) && bReturn;
277     bReturn = testAny(  null, data.Hyper,xLBT ) && bReturn;
278     bReturn = testAny(  null,data.UHyper,xLBT ) && bReturn;
279     bReturn = testAny( null, data.Float,xLBT ) && bReturn;
280     bReturn = testAny( null, data.Double,xLBT ) && bReturn;
281     bReturn = testAny( null, data.Enum,xLBT ) && bReturn;
282     bReturn = testAny( null, data.String,xLBT ) && bReturn;
283     bReturn = testAny(typeof(XWeak), data.Interface,xLBT ) && bReturn;
284     bReturn = testAny(null, data, xLBT ) && bReturn;
285 
286     {
287         Any a1= new Any(true);
288         Any a2 = xLBT.transportAny( a1 );
289         bReturn = compareData(a2, a1) && bReturn;
290     }
291 
292     {
293         Any a1= new Any('A');
294         Any a2 = xLBT.transportAny(a1);
295         bReturn = compareData(a2, a1) && bReturn;
296     }
297     return bReturn;
298 }
299 
performSequenceOfCallTest(XBridgeTest xLBT)300 static bool performSequenceOfCallTest(XBridgeTest xLBT)
301 {
302     int i,nRounds;
303     int nGlobalIndex = 0;
304     const int nWaitTimeSpanMUSec = 10000;
305     for( nRounds = 0 ; nRounds < 10 ; nRounds ++ )
306     {
307         for( i = 0 ; i < nRounds ; i ++ )
308         {
309             // fire oneways
310             xLBT.callOneway(nGlobalIndex, nWaitTimeSpanMUSec);
311             nGlobalIndex++;
312         }
313 
314         // call synchron
315         xLBT.call(nGlobalIndex, nWaitTimeSpanMUSec);
316         nGlobalIndex++;
317     }
318     return xLBT.sequenceOfCallTestPassed();
319 }
320 
321 
322 
323 
performRecursiveCallTest(XBridgeTest xLBT)324 static bool performRecursiveCallTest(XBridgeTest  xLBT)
325 {
326     xLBT.startRecursiveCall(new ORecursiveCall(), 50);
327     // on failure, the test would lock up or crash
328     return true;
329 }
330 
performQueryForUnknownType(XBridgeTest xLBT)331 static bool performQueryForUnknownType(XBridgeTest xLBT)
332 {
333     bool bRet = false;
334     // test queryInterface for an unknown type
335     try
336     {
337         foo.MyInterface a = (foo.MyInterface) xLBT;
338     }
339     catch( System.InvalidCastException)
340     {
341         bRet = true;
342     }
343 
344     return bRet;
345 }
346 
347 // //==================================================================================================
performTest(XBridgeTest xLBT)348 bool performTest(XBridgeTest xLBT)
349 {
350     check( xLBT != null, "### no test interface!" );
351     bool bRet = true;
352     if (xLBT == null)
353         return false;
354 
355     // this data is never ever granted access to by calls other than equals(), assign()!
356     TestDataElements aData = new TestDataElements(); // test against this data
357 
358     Object xI= new WeakBase();
359 
360     Any aAny = new Any( typeof(Object), xI);
361     assign( (TestElement)aData,
362             true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
363             0x123456789abcdef0, 0xfedcba9876543210,
364             17.0815f, 3.1415926359, TestEnum.LOLA,
365             Constants.STRING_TEST_CONSTANT, xI,
366             aAny);
367 
368     bRet = check( aData.Any.Value == xI, "### unexpected any!" ) && bRet;
369     bRet = check( !(aData.Any.Value != xI), "### unexpected any!" ) && bRet;
370 
371     aData.Sequence = new TestElement[2];
372     aData.Sequence[0] = new TestElement(
373         aData.Bool, aData.Char, aData.Byte, aData.Short,
374         aData.UShort, aData.Long, aData.ULong,
375         aData.Hyper, aData.UHyper, aData.Float,
376         aData.Double, aData.Enum, aData.String,
377         aData.Interface, aData.Any); //(TestElement) aData;
378     aData.Sequence[1] = new TestElement(); //is empty
379 
380     // aData complete
381     //
382     // this is a manually copy of aData for first setting...
383     TestDataElements aSetData = new TestDataElements();
384     Any aAnySet= new Any(typeof(Object), xI);
385     assign( (TestElement)aSetData,
386             aData.Bool, aData.Char, aData.Byte, aData.Short, aData.UShort,
387             aData.Long, aData.ULong, aData.Hyper, aData.UHyper, aData.Float, aData.Double,
388             aData.Enum, aData.String, xI,
389             aAnySet);
390 
391     aSetData.Sequence = new TestElement[2];
392     aSetData.Sequence[0] = new TestElement(
393         aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short,
394         aSetData.UShort, aSetData.Long, aSetData.ULong,
395         aSetData.Hyper, aSetData.UHyper, aSetData.Float,
396         aSetData.Double, aSetData.Enum, aSetData.String,
397         aSetData.Interface, aSetData.Any); //TestElement) aSetData;
398     aSetData.Sequence[1] = new TestElement(); // empty struct
399 
400     xLBT.setValues(
401         aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short, aSetData.UShort,
402         aSetData.Long, aSetData.ULong, aSetData.Hyper, aSetData.UHyper, aSetData.Float, aSetData.Double,
403         aSetData.Enum, aSetData.String, aSetData.Interface, aSetData.Any, aSetData.Sequence, aSetData );
404 
405     {
406         TestDataElements aRet = new TestDataElements();
407         TestDataElements aRet2 = new TestDataElements();
408         xLBT.getValues(
409             out aRet.Bool, out aRet.Char, out aRet.Byte, out aRet.Short, out aRet.UShort,
410             out aRet.Long, out aRet.ULong, out aRet.Hyper, out aRet.UHyper,
411             out aRet.Float, out aRet.Double, out aRet.Enum, out aRet.String,
412             out aRet.Interface, out aRet.Any, out aRet.Sequence, out aRet2 );
413 
414         bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "getValues test") && bRet;
415 
416         // set last retrieved values
417         TestDataElements aSV2ret = xLBT.setValues2(
418             ref aRet.Bool, ref aRet.Char, ref aRet.Byte, ref aRet.Short, ref aRet.UShort,
419             ref aRet.Long, ref aRet.ULong, ref aRet.Hyper, ref aRet.UHyper, ref aRet.Float,
420             ref aRet.Double, ref aRet.Enum, ref aRet.String, ref aRet.Interface, ref aRet.Any,
421             ref aRet.Sequence, ref aRet2 );
422 
423         // check inout sequence order
424         // => inout sequence parameter was switched by test objects
425         TestElement temp = aRet.Sequence[ 0 ];
426         aRet.Sequence[ 0 ] = aRet.Sequence[ 1 ];
427         aRet.Sequence[ 1 ] = temp;
428 
429         bRet = check(
430             compareData( aData, aSV2ret ) && compareData( aData, aRet2 ),
431             "getValues2 test") && bRet;
432     }
433     {
434         TestDataElements aRet = new TestDataElements();
435         TestDataElements aRet2 = new TestDataElements();
436         TestDataElements aGVret = xLBT.getValues(
437             out aRet.Bool, out aRet.Char, out aRet.Byte, out aRet.Short,
438             out aRet.UShort, out aRet.Long, out aRet.ULong, out aRet.Hyper,
439             out aRet.UHyper, out aRet.Float, out aRet.Double, out aRet.Enum,
440             out aRet.String, out aRet.Interface, out aRet.Any, out aRet.Sequence,
441             out aRet2 );
442 
443         bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) && compareData( aData, aGVret ), "getValues test" ) && bRet;
444 
445         // set last retrieved values
446         xLBT.Bool = aRet.Bool;
447         xLBT.Char = aRet.Char;
448         xLBT.Byte = aRet.Byte;
449         xLBT.Short = aRet.Short;
450         xLBT.UShort = aRet.UShort;
451         xLBT.Long = aRet.Long;
452         xLBT.ULong = aRet.ULong;
453         xLBT.Hyper = aRet.Hyper;
454         xLBT.UHyper = aRet.UHyper;
455         xLBT.Float = aRet.Float;
456         xLBT.Double = aRet.Double;
457         xLBT.Enum = aRet.Enum;
458         xLBT.String = aRet.String;
459         xLBT.Interface = aRet.Interface;
460         xLBT.Any = aRet.Any;
461         xLBT.Sequence = aRet.Sequence;
462         xLBT.Struct = aRet2;
463     }
464     {
465         TestDataElements aRet = new TestDataElements();
466         TestDataElements aRet2 = new TestDataElements();
467         aRet.Hyper = xLBT.Hyper;
468         aRet.UHyper = xLBT.UHyper;
469         aRet.Float = xLBT.Float;
470         aRet.Double = xLBT.Double;
471         aRet.Byte = xLBT.Byte;
472         aRet.Char = xLBT.Char;
473         aRet.Bool = xLBT.Bool;
474         aRet.Short = xLBT.Short;
475         aRet.UShort = xLBT.UShort;
476         aRet.Long = xLBT.Long;
477         aRet.ULong = xLBT.ULong;
478         aRet.Enum = xLBT.Enum;
479         aRet.String = xLBT.String;
480         aRet.Interface = xLBT.Interface;
481         aRet.Any = xLBT.Any;
482         aRet.Sequence = xLBT.Sequence;
483         aRet2 = xLBT.Struct;
484 
485         bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "struct comparison test") && bRet;
486 
487         bRet = check(performSequenceTest(xLBT), "sequence test") && bRet;
488 
489         // any test
490         bRet = check( performAnyTest( xLBT , aData ) , "any test" ) && bRet;
491 
492         // sequence of call test
493         bRet = check( performSequenceOfCallTest( xLBT ) , "sequence of call test" ) && bRet;
494 
495         // recursive call test
496         bRet = check( performRecursiveCallTest( xLBT ) , "recursive test" ) && bRet;
497 
498         bRet = (compareData( aData, aRet ) && compareData( aData, aRet2 )) && bRet ;
499 
500         // check setting of null reference
501         xLBT.Interface = null;
502         aRet.Interface = xLBT.Interface;
503         bRet = (aRet.Interface == null) && bRet;
504 
505     }
506         // Test extended attributes that raise exceptions:
507     try {
508         int i = xLBT.RaiseAttr1;
509             bRet &= check(false, "getRaiseAttr1 did not throw");
510     } catch (RuntimeException )
511     {
512     }
513     catch (System.Exception) {
514         bRet &= check(false, "getRaiseAttr1 threw wrong type");
515     }
516     try {
517         xLBT.RaiseAttr1 = 0;
518         bRet &= check(false, "setRaiseAttr1 did not throw");
519     } catch (IllegalArgumentException) {
520     } catch (System.Exception) {
521         bRet &= check(false, "setRaiseAttr1 threw wrong type");
522     }
523     try {
524         int i = xLBT.RaiseAttr2;
525         bRet &= check(false, "getRaiseAttr2 did not throw");
526     } catch (IllegalArgumentException ) {
527     } catch (System.Exception) {
528         bRet &= check(false, "getRaiseAttr2 threw wrong type");
529     }
530 
531        // Test instantiated polymorphic struct types:
532     {
533         TestPolyStruct poly = new TestPolyStruct(true);
534         bRet &= check(
535             (bool) xLBT.transportPolyBoolean(poly).member,
536             "transportPolyBoolean");
537         poly = new TestPolyStruct(12345L);
538         xLBT.transportPolyHyper(ref poly);
539         bRet &= check((long)poly.member == 12345L, "transportPolyUnsignedHyper");
540 
541         Any[] seq = {  new Any(33), new Any("ABC")};
542         poly = new TestPolyStruct(seq);
543         TestPolyStruct poly2;
544         xLBT.transportPolySequence(poly, out poly2);
545         try {
546             Any[] ar = (Any[]) poly2.member;
547             bRet &= check(
548             ar.Length == 2, "transportPolySequence, length");
549 
550             int v0;
551             v0 = (int) ar[0].Value;
552             bRet &= check(v0 == 33, "transportPolySequence, element 0");
553 
554             string v1 = (string) ar[1].Value;
555             bRet &= check(
556             v1.Equals("ABC"),
557             "transportPolySequence, element 1");
558         } catch (InvalidCastException )
559         {
560             bRet &= check(false, "transportPolySequence");
561         }
562 
563         try {
564             //When the test object is a cli object then them member is null
565             //otherwise the bridge has provided a default value.
566             TestPolyStruct s =  xLBT.getNullPolyLong();
567             if (s.member != null)
568                 bRet &= check(((int) s.member) == 0, "getNullPolyLong");
569 
570             s = xLBT.getNullPolyString();
571             if (s.member != null)
572                 bRet &= check(((string) s.member).Length == 0,
573                               "getNullPolyString");
574             s = xLBT.getNullPolyType();
575             if (s.member != null)
576                 bRet &= check(((Type) s.member) == typeof(void),
577                               "getNullPolyType");
578             s = xLBT.getNullPolyAny();
579             if (s.member != null)
580             {
581                 Any nullAny = (Any) s.member;
582                 //???
583                 bRet &= check(nullAny.Type == typeof(void),
584                     "getNullPolyAny");
585             }
586             s = xLBT.getNullPolySequence();
587             if (s.member != null)
588                 bRet &= check(((bool[]) s.member).Length == 0,
589                               "getNullPolySequence");
590             s = xLBT.getNullPolyEnum();
591             if (s.member != null)
592                 bRet &= check(((TestEnum) s.member) == TestEnum.TEST,
593                               "getNullPolyEnum");
594             s = xLBT.getNullPolyStruct();
595             if (s.member != null)
596                 bRet &= check(((TestStruct) s.member).member == 0,
597                               "getNullPolyStruct");
598             s = xLBT.getNullPolyInterface();
599                 bRet &= check(s.member == null, "getNullPolyInterface");
600 
601             s = xLBT.getNullPolyBadEnum();
602             bRet &= check(((TestBadEnum)s.member) == TestBadEnum.M, "getNullPolyBadEnum");
603 
604         } catch(InvalidCastException)
605         {
606             bRet &= check(false, "getNullPolyXXX, InvalidCastException");
607         }
608 
609         }
610 
611     XBridgeTest2 xBT2 = xLBT as XBridgeTest2;
612     if (xBT2 != null) {
613         try {
614             xBT2.testConstructorsService(m_xContext);
615         } catch (BadConstructorArguments) {
616             bRet = false;
617         }
618     }
619 
620     return bRet;
621 }
performSequenceTest(XBridgeTest xBT)622 static bool performSequenceTest(XBridgeTest xBT)
623 {
624     bool bRet = true;
625     XBridgeTest2  xBT2 = xBT as XBridgeTest2;
626     if ( xBT2 == null)
627         return false;
628 
629     // perform sequence tests (XBridgeTest2)
630     // create the sequence which are compared with the results
631     bool[] arBool = {true, false, true};
632     char[] arChar = {'A','B','C'};
633     byte[] arByte = { 1,  2,  0xff};
634     short[] arShort = {Int16.MinValue, 1,  Int16.MaxValue};
635     UInt16[] arUShort = {UInt16.MinValue , 1, UInt16.MaxValue};
636     int[] arLong = {Int32.MinValue, 1, Int32.MaxValue};
637     UInt32[] arULong = {UInt32.MinValue, 1, UInt32.MaxValue};
638     long[] arHyper = {Int64.MinValue, 1, Int64.MaxValue};
639     UInt64[] arUHyper = {UInt64.MinValue, 1, UInt64.MaxValue};
640     float[] arFloat = {1.1f, 2.2f, 3.3f};
641     double[] arDouble = {1.11, 2.22, 3.33};
642     string[] arString = {"String 1", "String 2", "String 3"};
643 
644     Any[] arAny = {new Any(true), new Any(11111), new Any(3.14)};
645     Object[] arObject = {new WeakBase(), new WeakBase(), new WeakBase()};
646     TestEnum[] arEnum = {TestEnum.ONE, TestEnum.TWO, TestEnum.CHECK};
647 
648     TestElement[] arStruct = {new TestElement(), new TestElement(),
649                                new TestElement()};
650     assign( arStruct[0], true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
651             0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
652             TestEnum.LOLA, Constants.STRING_TEST_CONSTANT, arObject[0],
653             new Any( typeof(Object),  arObject[0]) );
654     assign( arStruct[1], true, 'A', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
655             0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
656             TestEnum.TWO, Constants.STRING_TEST_CONSTANT, arObject[1],
657             new Any( typeof(Object), arObject[1]) );
658     assign( arStruct[2], true, 'B', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
659             0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
660             TestEnum.CHECK, Constants.STRING_TEST_CONSTANT, arObject[2],
661             new Any( typeof(Object), arObject[2] ) );
662 
663 
664     int[][][] arLong3 = new int[][][]{
665         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
666         new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
667         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
668 
669     {
670     int[][] seqSeqRet = xBT2.setDim2(arLong3[0]);
671     bRet = check( compareData(seqSeqRet, arLong3[0]), "sequence test") && bRet;
672     int[][][] seqSeqRet2 = xBT2.setDim3(arLong3);
673     bRet = check( compareData(seqSeqRet2, arLong3), "sequence test") && bRet;
674     Any[] seqAnyRet = xBT2.setSequenceAny(arAny);
675     bRet = check( compareData(seqAnyRet, arAny), "sequence test") && bRet;
676     bool[] seqBoolRet = xBT2.setSequenceBool(arBool);
677     bRet = check( compareData(seqBoolRet, arBool), "sequence test") && bRet;
678     byte[] seqByteRet = xBT2.setSequenceByte(arByte);
679     bRet = check( compareData(seqByteRet, arByte), "sequence test") && bRet;
680     char[] seqCharRet = xBT2.setSequenceChar(arChar);
681     bRet = check( compareData(seqCharRet, arChar), "sequence test") && bRet;
682     short[] seqShortRet = xBT2.setSequenceShort(arShort);
683     bRet = check( compareData(seqShortRet, arShort), "sequence test") && bRet;
684     int[] seqLongRet = xBT2.setSequenceLong(arLong);
685     bRet = check( compareData(seqLongRet, arLong), "sequence test") && bRet;
686     long[] seqHyperRet = xBT2.setSequenceHyper(arHyper);
687     bRet = check( compareData(seqHyperRet,arHyper), "sequence test") && bRet;
688     float[] seqFloatRet = xBT2.setSequenceFloat(arFloat);
689     bRet = check( compareData(seqFloatRet, arFloat), "sequence test") && bRet;
690     double[] seqDoubleRet = xBT2.setSequenceDouble(arDouble);
691     bRet = check( compareData(seqDoubleRet, arDouble), "sequence test") && bRet;
692     TestEnum[] seqEnumRet = xBT2.setSequenceEnum(arEnum);
693     bRet = check( compareData(seqEnumRet, arEnum), "sequence test") && bRet;
694     UInt16[] seqUShortRet = xBT2.setSequenceUShort(arUShort);
695     bRet = check( compareData(seqUShortRet, arUShort), "sequence test") && bRet;
696     UInt32[] seqULongRet = xBT2.setSequenceULong(arULong);
697     bRet = check( compareData(seqULongRet, arULong), "sequence test") && bRet;
698     UInt64[] seqUHyperRet = xBT2.setSequenceUHyper(arUHyper);
699     bRet = check( compareData(seqUHyperRet, arUHyper), "sequence test") && bRet;
700     Object[] seqObjectRet = xBT2.setSequenceXInterface(arObject);
701     bRet = check( compareData(seqObjectRet, arObject), "sequence test") && bRet;
702     string[] seqStringRet = xBT2.setSequenceString(arString);
703     bRet = check( compareData(seqStringRet, arString), "sequence test") && bRet;
704     TestElement[] seqStructRet = xBT2.setSequenceStruct(arStruct);
705     bRet = check( compareData(seqStructRet, arStruct), "sequence test") && bRet;
706     }
707     {
708     bool[] arBoolTemp = (bool[]) arBool.Clone();
709     char[] arCharTemp = (char[]) arChar.Clone();
710     byte[] arByteTemp = (byte[]) arByte.Clone();
711     short[] arShortTemp = (short[]) arShort.Clone();
712     UInt16[] arUShortTemp = (UInt16[]) arUShort.Clone();
713     int[] arLongTemp = (int[]) arLong.Clone();
714     UInt32[] arULongTemp = (UInt32[]) arULong.Clone();
715     long[] arHyperTemp = (long[]) arHyper.Clone();
716     UInt64[] arUHyperTemp = (UInt64[]) arUHyper.Clone();
717     float[] arFloatTemp = (float[]) arFloat.Clone();
718     double[] arDoubleTemp = (double[]) arDouble.Clone();
719     TestEnum[] arEnumTemp = (TestEnum[]) arEnum.Clone();
720     string[] arStringTemp = (string[]) arString.Clone();
721     Object[] arObjectTemp = (Object[]) arObject.Clone();
722     Any[] arAnyTemp = (Any[]) arAny.Clone();
723     // make sure this are has the same contents as arLong3[0]
724     int[][] arLong2Temp = new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} };
725     // make sure this are has the same contents as arLong3
726     int[][][] arLong3Temp = new int[][][]{
727         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
728         new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
729         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
730 
731     xBT2.setSequencesInOut(ref arBoolTemp, ref arCharTemp, ref arByteTemp,
732                            ref arShortTemp, ref arUShortTemp, ref arLongTemp,
733                            ref arULongTemp,ref arHyperTemp, ref arUHyperTemp,
734                            ref arFloatTemp,ref arDoubleTemp, ref arEnumTemp,
735                            ref arStringTemp, ref  arObjectTemp,
736                            ref arAnyTemp, ref arLong2Temp, ref arLong3Temp);
737     bRet = check(
738         compareData(arBoolTemp, arBool) &&
739         compareData(arCharTemp , arChar) &&
740         compareData(arByteTemp , arByte) &&
741         compareData(arShortTemp , arShort) &&
742         compareData(arUShortTemp , arUShort) &&
743         compareData(arLongTemp , arLong) &&
744         compareData(arULongTemp , arULong) &&
745         compareData(arHyperTemp , arHyper) &&
746         compareData(arUHyperTemp , arUHyper) &&
747         compareData(arFloatTemp , arFloat) &&
748         compareData(arDoubleTemp , arDouble) &&
749         compareData(arEnumTemp , arEnum) &&
750         compareData(arStringTemp , arString) &&
751         compareData(arObjectTemp , arObject) &&
752         compareData(arAnyTemp , arAny) &&
753         compareData(arLong2Temp , arLong3[0]) &&
754         compareData(arLong3Temp , arLong3), "sequence test") && bRet;
755 
756     bool[] arBoolOut;
757     char[] arCharOut;
758     byte[] arByteOut;
759     short[] arShortOut;
760     UInt16[] arUShortOut;
761     int[] arLongOut;
762     UInt32[] arULongOut;
763     long[] arHyperOut;
764     UInt64[] arUHyperOut;
765     float[] arFloatOut;
766     double[] arDoubleOut;
767     TestEnum[] arEnumOut;
768     string[] arStringOut;
769     Object[] arObjectOut;
770     Any[] arAnyOut;
771     int[][] arLong2Out;
772     int[][][] arLong3Out;
773 
774     xBT2.setSequencesOut(out arBoolOut, out arCharOut, out arByteOut,
775                          out arShortOut, out arUShortOut, out arLongOut,
776                          out arULongOut, out arHyperOut, out arUHyperOut,
777                          out arFloatOut, out arDoubleOut, out arEnumOut,
778                          out arStringOut, out arObjectOut, out arAnyOut,
779                          out arLong2Out, out arLong3Out);
780     bRet = check(
781         compareData(arBoolOut, arBool) &&
782         compareData(arCharOut, arChar) &&
783         compareData(arByteOut, arByte) &&
784         compareData(arShortOut, arShort) &&
785         compareData(arUShortOut, arUShort) &&
786         compareData(arLongOut, arLong) &&
787         compareData(arULongOut, arULong) &&
788         compareData(arHyperOut, arHyper) &&
789         compareData(arUHyperOut, arUHyper) &&
790         compareData(arFloatOut, arFloat) &&
791         compareData(arDoubleOut, arDouble) &&
792         compareData(arEnumOut, arEnum) &&
793         compareData(arStringOut, arString) &&
794         compareData(arObjectOut, arObject) &&
795         compareData(arAnyOut, arAny) &&
796         compareData(arLong2Out, arLong3[0]) &&
797         compareData(arLong3Out, arLong3), "sequence test") && bRet;
798     }
799     {
800     //test with empty sequences
801     int[][] _arLong2 = new int[0][];
802     int[][] seqSeqRet = xBT2.setDim2(_arLong2);
803     bRet = check( compareData(seqSeqRet, _arLong2), "sequence test") && bRet;
804     int[][][] _arLong3 = new int[0][][];
805     int[][][] seqSeqRet2 = xBT2.setDim3(_arLong3);
806     bRet = check( compareData(seqSeqRet2, _arLong3), "sequence test") && bRet;
807     Any[] _arAny = new Any[0];
808     Any[] seqAnyRet = xBT2.setSequenceAny(_arAny);
809     bRet = check( compareData(seqAnyRet, _arAny), "sequence test") && bRet;
810     bool[] _arBool = new bool[0];
811     bool[] seqBoolRet = xBT2.setSequenceBool(_arBool);
812     bRet = check( compareData(seqBoolRet, _arBool), "sequence test") && bRet;
813     byte[] _arByte = new byte[0];
814     byte[] seqByteRet = xBT2.setSequenceByte(_arByte);
815     bRet = check( compareData(seqByteRet, _arByte), "sequence test") && bRet;
816     char[] _arChar = new char[0];
817     char[] seqCharRet = xBT2.setSequenceChar(_arChar);
818     bRet = check( compareData(seqCharRet, _arChar), "sequence test") && bRet;
819     short[] _arShort = new short[0];
820     short[] seqShortRet = xBT2.setSequenceShort(_arShort);
821     bRet = check( compareData(seqShortRet, _arShort), "sequence test") && bRet;
822     int[] _arLong = new int[0];
823     int[] seqLongRet = xBT2.setSequenceLong(_arLong);
824     bRet = check( compareData(seqLongRet, _arLong), "sequence test") && bRet;
825     long[] _arHyper = new long[0];
826     long[] seqHyperRet = xBT2.setSequenceHyper(_arHyper);
827     bRet = check( compareData(seqHyperRet, _arHyper), "sequence test") && bRet;
828     float[] _arFloat = new float[0];
829     float[] seqFloatRet = xBT2.setSequenceFloat(_arFloat);
830     bRet = check( compareData(seqFloatRet, _arFloat), "sequence test") && bRet;
831     double[] _arDouble = new double[0];
832     double[] seqDoubleRet = xBT2.setSequenceDouble(_arDouble);
833     bRet = check( compareData(seqDoubleRet, _arDouble), "sequence test") && bRet;
834     TestEnum[] _arEnum = new TestEnum[0];
835     TestEnum[] seqEnumRet = xBT2.setSequenceEnum(_arEnum);
836     bRet = check( compareData(seqEnumRet, _arEnum), "sequence test") && bRet;
837     UInt16[] _arUShort = new UInt16[0];
838     UInt16[] seqUShortRet = xBT2.setSequenceUShort(_arUShort);
839     bRet = check( compareData(seqUShortRet, _arUShort), "sequence test") && bRet;
840     UInt32[] _arULong = new UInt32[0];
841     UInt32[] seqULongRet = xBT2.setSequenceULong(_arULong);
842     bRet = check( compareData(seqULongRet, _arULong), "sequence test") && bRet;
843     UInt64[] _arUHyper = new UInt64[0];
844     UInt64[] seqUHyperRet = xBT2.setSequenceUHyper(_arUHyper);
845     bRet = check( compareData(seqUHyperRet, _arUHyper), "sequence test") && bRet;
846     Object[] _arObject = new Object[0];
847     Object[] seqObjectRet = xBT2.setSequenceXInterface(_arObject);
848     bRet = check( compareData(seqObjectRet, _arObject), "sequence test") && bRet;
849     string[] _arString = new string[0];
850     string[] seqStringRet = xBT2.setSequenceString(_arString);
851     bRet = check( compareData(seqStringRet, _arString), "sequence test") && bRet;
852     TestElement[] _arStruct = new TestElement[0];
853     TestElement[] seqStructRet = xBT2.setSequenceStruct(_arStruct);
854     bRet = check( compareData(seqStructRet, _arStruct), "sequence test") && bRet;
855 
856     }
857 
858 
859     return bRet;
860 }
861 /** Test the System::Object method on the proxy object
862  */
testObjectMethodsImplemention(XBridgeTest xLBT)863 static bool testObjectMethodsImplemention(XBridgeTest xLBT)
864 {
865     bool ret = false;
866     Object obj = new Object();
867     Object xInt = (Object) xLBT;
868     XBridgeTestBase xBase = xLBT as XBridgeTestBase;
869     if (xBase == null)
870         return false;
871     // Object.Equals
872     ret = xLBT.Equals(obj) == false;
873     ret = xLBT.Equals(xLBT) && ret;
874     ret = Object.Equals(obj, obj) && ret;
875     ret = Object.Equals(xLBT, xBase) && ret;
876     //Object.GetHashCode
877     // Don't know how to verify this. Currently it is not possible to get the object id from a proxy
878     int nHash = xLBT.GetHashCode();
879     ret = nHash == xBase.GetHashCode() && ret;
880 
881     //Object.ToString
882     // Don't know how to verify this automatically.
883     string s = xLBT.ToString();
884     ret = (s.Length > 0) && ret;
885     return ret;
886 }
887 
888 
raiseOnewayException(XBridgeTest xLBT)889 static bool raiseOnewayException(XBridgeTest xLBT)
890 {
891     bool bReturn = true;
892     string sCompare = Constants.STRING_TEST_CONSTANT;
893     try
894     {
895         // Note : the exception may fly or not (e.g. remote scenario).
896         //        When it flies, it must contain the correct elements.
897         xLBT.raiseRuntimeExceptionOneway(sCompare, xLBT.Interface );
898     }
899     catch (RuntimeException  e )
900     {
901         bReturn = ( xLBT.Interface == e.Context );
902     }
903     return bReturn;
904 }
905 
906 // //==================================================================================================
raiseException(XBridgeTest xLBT )907 static bool raiseException(XBridgeTest xLBT )
908 {
909     int nCount = 0;
910     try
911     {
912         try
913         {
914             try
915             {
916                 TestDataElements aRet = new TestDataElements();
917                 TestDataElements aRet2 = new TestDataElements();
918                 xLBT.raiseException(
919                     5, Constants.STRING_TEST_CONSTANT, xLBT.Interface );
920             }
921             catch (unoidl.com.sun.star.lang.IllegalArgumentException aExc)
922             {
923                 if (aExc.ArgumentPosition == 5 &&
924                     aExc.Context == xLBT.Interface)
925                 {
926                     ++nCount;
927                 }
928                 else
929                 {
930                     check( false, "### unexpected exception content!" );
931                 }
932 
933                 /** it is certain, that the RuntimeException testing will fail,
934                     if no */
935                 xLBT.RuntimeException = 0;
936             }
937         }
938         catch (unoidl.com.sun.star.uno.RuntimeException rExc)
939         {
940             if (rExc.Context == xLBT.Interface )
941             {
942                 ++nCount;
943             }
944             else
945             {
946                 check( false, "### unexpected exception content!" );
947             }
948 
949             /** it is certain, that the RuntimeException testing will fail, if no */
950             unchecked
951              {
952                  xLBT.RuntimeException = (int) 0xcafebabe;
953              }
954         }
955     }
956     catch (unoidl.com.sun.star.uno.Exception  rExc)
957     {
958         if (rExc.Context == xLBT.Interface)
959         {
960             ++nCount;
961         }
962         else
963 
964         {
965             check( false, "### unexpected exception content!" );
966         }
967         return (nCount == 3);
968     }
969     return false;
970 }
971 
perform_test( XBridgeTest xLBT )972     private void perform_test( XBridgeTest xLBT )
973     {
974         bool bRet= true;;
975        bRet = check( performTest( xLBT ), "standard test" ) && bRet;
976        bRet = check( raiseException( xLBT ) , "exception test" )&& bRet;
977        bRet = check( raiseOnewayException( xLBT ), "oneway exception test" ) && bRet;
978        bRet = check( testObjectMethodsImplemention(xLBT), "object methods test") && bRet;
979        bRet = performQueryForUnknownType( xLBT ) && bRet;
980         if ( ! bRet)
981         {
982             throw new unoidl.com.sun.star.uno.RuntimeException( "error (cli_cs_bridgetest.cs): test failed!", null);
983         }
984     }
985 
BridgeTest( XComponentContext xContext )986     public BridgeTest( XComponentContext xContext )
987     {
988         m_xContext = xContext;
989     }
990 
991     private XComponentContext m_xContext;
992 
run( String [] args )993     public int run( String [] args )
994     {
995         Debug.AutoFlush = true;
996 //      System.Diagnostics.Debugger.Launch();
997         try
998         {
999             if (args.Length < 1)
1000             {
1001                 throw new RuntimeException(
1002                     "missing argument for bridgetest!", this );
1003             }
1004             Object test_obj =
1005                 m_xContext.getServiceManager().createInstanceWithContext(
1006                 args[ 0 ], m_xContext );
1007 
1008             Debug.WriteLine(
1009                 "Calling object: {0}", test_obj.ToString() );
1010 
1011             XBridgeTest xTest = (XBridgeTest) test_obj ;
1012             perform_test( xTest );
1013             Console.WriteLine( "\n### cli_uno C# bridgetest succeeded." );
1014             return 0;
1015         }
1016         catch (unoidl.com.sun.star.uno.RuntimeException)
1017         {
1018             throw;
1019         }
1020         catch (System.Exception exc)
1021         {
1022             throw new unoidl.com.sun.star.uno.RuntimeException(
1023                 "cli_cs_bridgetest.cs: unexpected exception occured in XMain::run. Original exception: " +
1024                 exc.GetType().Name + "\n Message: " + exc.Message , null);
1025         }
1026     }
1027 }
1028 
1029 }
1030