@@ -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