Skip to content

Commit 7d8f91e

Browse files
committed
add try-construct test for nested sequences
1 parent 981f81e commit 7d8f91e

2 files changed

Lines changed: 178 additions & 0 deletions

File tree

src/core/ddsc/tests/CdrStreamTryconstruct.idl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,17 @@ module CdrStreamTryconstruct {
5959
@try_construct(USE_DEFAULT) sequence<@try_construct(USE_DEFAULT) string<3>, 3> f5;
6060
string f6;
6161
};
62+
63+
@final struct t7 {
64+
sequence<sequence<unsigned long, 3>, 3> f1;
65+
sequence<@try_construct(TRIM) sequence<unsigned long, 3>, 3> f2;
66+
sequence<@try_construct(USE_DEFAULT) sequence<unsigned long, 3>, 3> f3;
67+
@try_construct(TRIM) sequence<sequence<unsigned long, 3>, 3> f4;
68+
@try_construct(TRIM) sequence<@try_construct(TRIM) sequence<unsigned long, 3>, 3> f5;
69+
@try_construct(TRIM) sequence<@try_construct(USE_DEFAULT) sequence<unsigned long, 3>, 3> f6;
70+
@try_construct(USE_DEFAULT) sequence<sequence<unsigned long, 3>, 3> f7;
71+
@try_construct(USE_DEFAULT) sequence<@try_construct(TRIM) sequence<unsigned long, 3>, 3> f8;
72+
@try_construct(USE_DEFAULT) sequence<@try_construct(USE_DEFAULT) sequence<unsigned long, 3>, 3> f9;
73+
string f10;
74+
};
6275
};

src/core/ddsc/tests/cdrstream.c

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2851,6 +2851,171 @@ CU_Test (ddsc_cdrstream, tryconstruct)
28512851
dds_cdrstream_desc_fini (&desc, &dds_cdrstream_default_allocator);
28522852
}
28532853
}
2854+
2855+
static bool eq_seq_seq_unsigned_long (const dds_sequence_sequence_dds_sequence_unsigned_long *a, const dds_sequence_sequence_dds_sequence_unsigned_long *b)
2856+
{
2857+
if (a->_length != b->_length)
2858+
return false;
2859+
for (uint32_t i = 0; i < a->_length; i++)
2860+
{
2861+
if (a->_buffer[i]._length != b->_buffer[i]._length)
2862+
return false;
2863+
if (a->_buffer[i]._length > 0 && memcmp (a->_buffer[i]._buffer, b->_buffer[i]._buffer, a->_buffer[i]._length) != 0)
2864+
return false;
2865+
}
2866+
return true;
2867+
}
2868+
2869+
static bool eq_CdrStreamTryconstruct_t7 (const void *va, const void *vb)
2870+
{
2871+
const CdrStreamTryconstruct_t7 *a = va;
2872+
const CdrStreamTryconstruct_t7 *b = vb;
2873+
if (!eq_seq_seq_unsigned_long (&a->f1, &b->f1)) return false;
2874+
if (!eq_seq_seq_unsigned_long (&a->f2, &b->f2)) return false;
2875+
if (!eq_seq_seq_unsigned_long (&a->f3, &b->f3)) return false;
2876+
if (!eq_seq_seq_unsigned_long (&a->f4, &b->f4)) return false;
2877+
if (!eq_seq_seq_unsigned_long (&a->f5, &b->f5)) return false;
2878+
if (!eq_seq_seq_unsigned_long (&a->f6, &b->f6)) return false;
2879+
if (!eq_seq_seq_unsigned_long (&a->f7, &b->f7)) return false;
2880+
if (!eq_seq_seq_unsigned_long (&a->f8, &b->f8)) return false;
2881+
if (!eq_seq_seq_unsigned_long (&a->f9, &b->f9)) return false;
2882+
if (strcmp (a->f10, b->f10) != 0) return false;
2883+
return true;
2884+
}
2885+
2886+
static void init_CdrStreamTryconstruct_t7 (struct CdrStreamTryconstruct_t7 *a, unsigned char **cdr, uint32_t *cdrsize, uint32_t fidx, uint32_t n0, uint32_t n1, bool xcdr2)
2887+
{
2888+
assert (n0 <= 9 && n1 <= 9);
2889+
memset (a, 0, sizeof (*a));
2890+
dds_sequence_sequence_dds_sequence_unsigned_long *x = NULL;
2891+
switch (fidx) {
2892+
case 0: x = &a->f1; break;
2893+
case 1: x = &a->f2; break;
2894+
case 2: x = &a->f3; break;
2895+
case 3: x = &a->f4; break;
2896+
case 4: x = &a->f5; break;
2897+
case 5: x = &a->f6; break;
2898+
case 6: x = &a->f7; break;
2899+
case 7: x = &a->f8; break;
2900+
case 8: x = &a->f9; break;
2901+
default: abort ();
2902+
}
2903+
assert (x);
2904+
x->_length = x->_maximum = n0;
2905+
x->_release = true;
2906+
x->_buffer = dds_alloc (n0 * sizeof (*x->_buffer));
2907+
for (uint32_t i = 0; i < n0; i++)
2908+
{
2909+
dds_sequence_unsigned_long * const y = &x->_buffer[i];
2910+
y->_length = y->_maximum = n1;
2911+
y->_release = true;
2912+
y->_buffer = dds_alloc (n1 * sizeof (*y->_buffer));
2913+
for (uint32_t j = 0; j < n1; j++)
2914+
y->_buffer[j] = ((j + 1) << 24) | ((j + 1) << 16) | ((j + 1) << 8) | (j + 1);
2915+
}
2916+
a->f10 = dds_alloc (6);
2917+
snprintf (a->f10, 6, "%1"PRIu32"_%1"PRIu32"_%1"PRIu32, fidx, n0, n1);
2918+
2919+
if (cdr)
2920+
{
2921+
const uint32_t y_cdrsize = /* prim seq: no dhr */ 0 + /* nelem */ 4 + /* content */ n1 * 4;
2922+
const uint32_t x_cdrsize = (xcdr2 ? /* dhdr */ 4 : 0) + /* nelem */ 4 + /* content */ n0 * y_cdrsize;
2923+
*cdrsize = /* 8 * dhr + empty seq */ 8 * (xcdr2 ? 8 : 4) + x_cdrsize + /* f10 */ 10;
2924+
*cdr = ddsrt_malloc (*cdrsize);
2925+
memset (*cdr, 0, *cdrsize);
2926+
uint32_t *d = (uint32_t *) *cdr;
2927+
for (uint32_t i = 0; i < fidx; i++)
2928+
{
2929+
if (xcdr2)
2930+
*d++ = 4; /* dhdr */
2931+
*d++ = 0; /* nelem */
2932+
}
2933+
if (xcdr2)
2934+
*d++ = x_cdrsize - 4 /* dhdr */;
2935+
*d++ = n0;
2936+
for (uint32_t i = 0; i < n0; i++)
2937+
{
2938+
*d++ = n1;
2939+
for (uint32_t j = 0; j < n1; j++)
2940+
*d++ = x->_buffer[i]._buffer[j];
2941+
}
2942+
for (uint32_t i = fidx + 1; i < 9; i++)
2943+
{
2944+
if (xcdr2)
2945+
*d++ = 4; /* dhdr */
2946+
*d++ = 0; /* nelem */
2947+
}
2948+
*d++ = (uint32_t) (strlen (a->f10) + 1);
2949+
memcpy (d, a->f10, strlen (a->f10) + 1);
2950+
}
2951+
}
2952+
2953+
CU_Test (ddsc_cdrstream, tryconstruct_nested_seq)
2954+
{
2955+
struct dds_cdrstream_desc desc;
2956+
dds_cdrstream_desc_from_topic_desc (&desc, &CdrStreamTryconstruct_t7_desc);
2957+
assert (desc.ops.ops);
2958+
for (int xcdri = 1; xcdri <= 2; xcdri++)
2959+
{
2960+
const uint32_t xcdrv = (xcdri == 1) ? XCDR1 : XCDR2;
2961+
for (uint32_t fidx = 0; fidx < 9; fidx++)
2962+
{
2963+
const enum { DISCARD, TRIM, DEF } tc0 = fidx / 3, tc1 = fidx % 3;
2964+
for (uint32_t n0 = 1; n0 <= 4; n0++)
2965+
{
2966+
const uint32_t n0cmp = (n0 <= 3) ? n0 : (tc0 == TRIM) ? 3 : 0;
2967+
for (uint32_t n1 = 4; n1 <= 4; n1++)
2968+
{
2969+
const uint32_t n1cmp = (n1 <= 3) ? n1 : (tc1 == TRIM) ? 3 : 0;
2970+
struct CdrStreamTryconstruct_t7 a;
2971+
unsigned char *cdr;
2972+
uint32_t cdrsize;
2973+
init_CdrStreamTryconstruct_t7 (&a, &cdr, &cdrsize, fidx, n0, n1, xcdrv == XCDR2);
2974+
if (n0 <= 3 && n1 <= 3)
2975+
{
2976+
dds_ostream_t os;
2977+
dds_ostream_init (&os, &dds_cdrstream_default_allocator, 0, xcdrv);
2978+
const bool wres = dds_stream_write_sample (&os, &dds_cdrstream_default_allocator, &a, &desc);
2979+
CU_ASSERT_FATAL (wres);
2980+
CU_ASSERT_MEMEQ_FATAL (os.m_buffer, os.m_index, cdr, cdrsize);
2981+
dds_ostream_fini (&os, &dds_cdrstream_default_allocator);
2982+
}
2983+
2984+
uint32_t act_size;
2985+
const enum dds_stream_normalize_result norm_res =
2986+
dds_stream_normalize (cdr, cdrsize, false, xcdrv, &desc, false, &act_size);
2987+
2988+
if ((tc0 == DISCARD && n0 > 3) || (tc1 == DISCARD && n1 > 3))
2989+
{
2990+
CU_ASSERT_EQ_FATAL (norm_res, DDS_STREAM_NORMALIZE_DISCARD);
2991+
}
2992+
else
2993+
{
2994+
CU_ASSERT_EQ_FATAL (norm_res, DDS_STREAM_NORMALIZE_SUCCESS);
2995+
CU_ASSERT_EQ_FATAL (cdrsize, act_size);
2996+
2997+
struct CdrStreamTryconstruct_t7 acmp;
2998+
init_CdrStreamTryconstruct_t7 (&acmp, NULL, NULL, fidx, n0cmp, n1cmp, xcdrv == XCDR2);
2999+
snprintf (acmp.f10, strlen (acmp.f10) + 1, "%"PRIu32"_%"PRIu32"_%"PRIu32, fidx, n0, n1);
3000+
3001+
struct CdrStreamTryconstruct_t7 ard = {0};
3002+
dds_istream_t is;
3003+
dds_istream_init (&is, act_size, cdr, xcdrv);
3004+
dds_stream_read (&is, (char *) &ard, &dds_cdrstream_default_allocator, desc.ops.ops);
3005+
3006+
CU_ASSERT_FATAL (eq_CdrStreamTryconstruct_t7 (&ard, &acmp));
3007+
dds_stream_free_sample (&ard, &dds_cdrstream_default_allocator, desc.ops.ops);
3008+
dds_stream_free_sample (&acmp, &dds_cdrstream_default_allocator, desc.ops.ops);
3009+
}
3010+
3011+
dds_stream_free_sample (&a, &dds_cdrstream_default_allocator, desc.ops.ops);
3012+
ddsrt_free (cdr);
3013+
}
3014+
}
3015+
}
3016+
}
3017+
dds_cdrstream_desc_fini (&desc, &dds_cdrstream_default_allocator);
3018+
}
28543019
#undef E2a
28553020
#undef E1a
28563021
#undef ena2

0 commit comments

Comments
 (0)