summaryrefslogtreecommitdiff
path: root/TAO/tests/Bug_3941_Regression/test.cpp
blob: 93813ed2bcb69b6e47ddf56dcd4d41d9ac5a6b93 (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
// $Id$

#include "testC.h"

int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  try
    {
      CORBA::ORB_var orb =
        CORBA::ORB_init (argc, argv);

      test::event0_init *ev0_fac = 0;
      ACE_NEW_RETURN (ev0_fac,
                      test::event0_init,
                      -1);
      CORBA::ValueFactoryBase_var ev0_fac_owner (ev0_fac);

      test::event1_init *ev1_fac = 0;
      ACE_NEW_RETURN (ev1_fac,
                      test::event1_init,
                      -1);
      CORBA::ValueFactoryBase_var ev1_fac_owner (ev1_fac);

      orb->register_value_factory (ev0_fac->tao_repository_id (), ev0_fac);
      orb->register_value_factory (ev1_fac->tao_repository_id (), ev1_fac);

      test::event0_var ev0;
      ACE_NEW_RETURN (ev0,
                      OBV_test::event0,
                      -1);
      ev0->message ("one");

      // write ev0 to CDR
      TAO_OutputCDR cdr ((size_t) 0,            // size
                         (int) ACE_CDR_BYTE_ORDER,
                         (ACE_Allocator *) 0,   // buffer_allocator
                         (ACE_Allocator *) 0,   // data_block_allocator
                         (ACE_Allocator *) 0,   // message_block_allocator
                         0,                     // memcpy_tradeoff
                         1,
                         1);
      cdr.reset ();

      if (!(cdr << ev0.in ()))
        {
          ACE_ERROR_RETURN ((LM_DEBUG,
                             "ERROR: cdr << ev0\n"),
                            -1);
        }

      // convert cdr into safe_octet_seq
      CORBA::OctetSeq safe_octet_seq (cdr.total_length ());
      safe_octet_seq.length (cdr.total_length ());

      CORBA::Octet *buffer = safe_octet_seq.get_buffer ();
      for (ACE_Message_Block const *i = cdr.begin ();
           i != 0;
           i = i->cont ())
        {
          CORBA::ULong len = i->length ();
          ACE_OS_String::memcpy (buffer, i->rd_ptr (), (size_t) len);
          buffer += len;
        }

      // Use TAO_InputCDR for unmarshalling
      buffer = safe_octet_seq.get_buffer ();
      size_t char_len = safe_octet_seq.length () * sizeof (CORBA::Octet);
      TAO_InputCDR input ((char const*) buffer,
                          char_len,
                          ACE_CDR_BYTE_ORDER,
                          TAO_DEF_GIOP_MAJOR,
                          TAO_DEF_GIOP_MINOR,
                          orb->orb_core ());

      // Read ev1 from CDR, this should fail (we actually encoded a ev0),
      // but *NOT* leak memory.
      test::event1_var ev1;
      if (input >> ev1.out ())
        {
          ACE_ERROR_RETURN ((LM_DEBUG,
                             "ERROR: unmarshal shouldn't work\n"),
                            -1);
        }

      ACE_DEBUG ((LM_DEBUG,
                  "Test passed.\n"));

      orb->destroy ();
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception (
                           "Caught exception in server:");
      return 1;
    }

  return 0;
}