447 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			447 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
| #if 0
 | |
| 
 | |
| #include <iostream>
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| 
 | |
| #include "tencode.h"
 | |
| 
 | |
| #pragma GCC diagnostic push
 | |
| #pragma GCC diagnostic ignored "-Wshift-count-overflow"
 | |
| #pragma GCC diagnostic ignored "-Woverflow"
 | |
| #pragma GCC diagnostic ignored "-Woverflow"
 | |
| 
 | |
| #define BUF_SIZE 64
 | |
| td_endian_t endian_arr[2] = {TD_LITTLE_ENDIAN, TD_BIG_ENDIAN};
 | |
| 
 | |
| static int32_t encode(SEncoder *pCoder, int8_t val) { return tEncodeI8(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, uint8_t val) { return tEncodeU8(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, int16_t val) { return tEncodeI16(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, uint16_t val) { return tEncodeU16(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, int32_t val) { return tEncodeI32(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, uint32_t val) { return tEncodeU32(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, int64_t val) { return tEncodeI64(pCoder, val); }
 | |
| static int32_t encode(SEncoder *pCoder, uint64_t val) { return tEncodeU64(pCoder, val); }
 | |
| 
 | |
| static int32_t decode(SDecoder *pCoder, int8_t *val) { return tDecodeI8(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, uint8_t *val) { return tDecodeU8(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, int16_t *val) { return tDecodeI16(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, uint16_t *val) { return tDecodeU16(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, int32_t *val) { return tDecodeI32(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, uint32_t *val) { return tDecodeU32(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, int64_t *val) { return tDecodeI64(pCoder, val); }
 | |
| static int32_t decode(SDecoder *pCoder, uint64_t *val) { return tDecodeU64(pCoder, val); }
 | |
| 
 | |
| static int32_t encodev(SEncoder *pCoder, int8_t val) { return tEncodeI8(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, uint8_t val) { return tEncodeU8(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, int16_t val) { return tEncodeI16v(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, uint16_t val) { return tEncodeU16v(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, int32_t val) { return tEncodeI32v(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, uint32_t val) { return tEncodeU32v(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, int64_t val) { return tEncodeI64v(pCoder, val); }
 | |
| static int32_t encodev(SEncoder *pCoder, uint64_t val) { return tEncodeU64v(pCoder, val); }
 | |
| 
 | |
| static int32_t decodev(SDecoder *pCoder, int8_t *val) { return tDecodeI8(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, uint8_t *val) { return tDecodeU8(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, int16_t *val) { return tDecodeI16v(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, uint16_t *val) { return tDecodeU16v(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, int32_t *val) { return tDecodeI32v(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, uint32_t *val) { return tDecodeU32v(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, int64_t *val) { return tDecodeI64v(pCoder, val); }
 | |
| static int32_t decodev(SDecoder *pCoder, uint64_t *val) { return tDecodeU64v(pCoder, val); }
 | |
| 
 | |
| template <typename T>
 | |
| static void simple_encode_decode_func(bool var_len) {
 | |
|   uint8_t  buf[BUF_SIZE];
 | |
|   SEncoder encoder = {0};
 | |
|   SDecoder decoder = {0};
 | |
|   T        min_val, max_val;
 | |
|   T        step = 1;
 | |
| 
 | |
|   if (typeid(T) == typeid(int8_t)) {
 | |
|     min_val = INT8_MIN;
 | |
|     max_val = INT8_MAX;
 | |
|     step = 1;
 | |
|   } else if (typeid(T) == typeid(uint8_t)) {
 | |
|     min_val = 0;
 | |
|     max_val = UINT8_MAX;
 | |
|     step = 1;
 | |
|   } else if (typeid(T) == typeid(int16_t)) {
 | |
|     min_val = INT16_MIN;
 | |
|     max_val = INT16_MAX;
 | |
|     step = 1;
 | |
|   } else if (typeid(T) == typeid(uint16_t)) {
 | |
|     min_val = 0;
 | |
|     max_val = UINT16_MAX;
 | |
|     step = 1;
 | |
|   } else if (typeid(T) == typeid(int32_t)) {
 | |
|     min_val = INT32_MIN;
 | |
|     max_val = INT32_MAX;
 | |
|     step = ((T)1) << 16;
 | |
|   } else if (typeid(T) == typeid(uint32_t)) {
 | |
|     min_val = 0;
 | |
|     max_val = UINT32_MAX;
 | |
|     step = ((T)1) << 16;
 | |
|   } else if (typeid(T) == typeid(int64_t)) {
 | |
|     min_val = INT64_MIN;
 | |
|     max_val = INT64_MAX;
 | |
|     step = ((T)1) << 48;
 | |
|   } else if (typeid(T) == typeid(uint64_t)) {
 | |
|     min_val = 0;
 | |
|     max_val = UINT64_MAX;
 | |
|     step = ((T)1) << 48;
 | |
|   }
 | |
| 
 | |
|   T i = min_val;
 | |
|   for (;; /*T i = min_val; i <= max_val; i += step*/) {
 | |
|     T dval;
 | |
| 
 | |
|     // Encode NULL
 | |
|     for (td_endian_t endian : endian_arr) {
 | |
|       tEncoderInit(&encoder, endian, NULL, 0, TD_ENCODER);
 | |
| 
 | |
|       if (var_len) {
 | |
|         GTEST_ASSERT_EQ(encodev(&encoder, i), 0);
 | |
|       } else {
 | |
|         GTEST_ASSERT_EQ(encode(&encoder, i), 0);
 | |
|         GTEST_ASSERT_EQ(encoder.pos, sizeof(T));
 | |
|       }
 | |
| 
 | |
|       tCoderClear(&encoder);
 | |
|     }
 | |
| 
 | |
|     // Encode and decode
 | |
|     for (td_endian_t e_endian : endian_arr) {
 | |
|       for (td_endian_t d_endian : endian_arr) {
 | |
|         // Encode
 | |
|         tCoderInit(&encoder, e_endian, buf, BUF_SIZE, TD_ENCODER);
 | |
| 
 | |
|         if (var_len) {
 | |
|           GTEST_ASSERT_EQ(encodev(&encoder, i), 0);
 | |
|         } else {
 | |
|           GTEST_ASSERT_EQ(encode(&encoder, i), 0);
 | |
|           GTEST_ASSERT_EQ(encoder.pos, sizeof(T));
 | |
|         }
 | |
| 
 | |
|         int32_t epos = encoder.pos;
 | |
| 
 | |
|         tCoderClear(&encoder);
 | |
|         // Decode
 | |
|         tCoderInit(&encoder, d_endian, buf, BUF_SIZE, TD_DECODER);
 | |
| 
 | |
|         if (var_len) {
 | |
|           GTEST_ASSERT_EQ(decodev(&encoder, &dval), 0);
 | |
|         } else {
 | |
|           GTEST_ASSERT_EQ(decode(&encoder, &dval), 0);
 | |
|           GTEST_ASSERT_EQ(encoder.pos, sizeof(T));
 | |
|         }
 | |
| 
 | |
|         GTEST_ASSERT_EQ(encoder.pos, epos);
 | |
| 
 | |
|         if (typeid(T) == typeid(int8_t) || typeid(T) == typeid(uint8_t) || e_endian == d_endian) {
 | |
|           GTEST_ASSERT_EQ(i, dval);
 | |
|         }
 | |
| 
 | |
|         tCoderClear(&encoder);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (i == max_val) break;
 | |
| 
 | |
|     if (max_val - i < step) {
 | |
|       i = max_val;
 | |
|     } else {
 | |
|       i = i + step;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST(td_encode_test, encode_decode_fixed_len_integer) {
 | |
|   simple_encode_decode_func<int8_t>(false);
 | |
|   simple_encode_decode_func<uint8_t>(false);
 | |
|   simple_encode_decode_func<int16_t>(false);
 | |
|   simple_encode_decode_func<uint16_t>(false);
 | |
|   simple_encode_decode_func<int32_t>(false);
 | |
|   simple_encode_decode_func<uint32_t>(false);
 | |
|   simple_encode_decode_func<int64_t>(false);
 | |
|   simple_encode_decode_func<uint64_t>(false);
 | |
| }
 | |
| 
 | |
| TEST(td_encode_test, encode_decode_variant_len_integer) {
 | |
|   simple_encode_decode_func<int16_t>(true);
 | |
|   simple_encode_decode_func<uint16_t>(true);
 | |
|   simple_encode_decode_func<int32_t>(true);
 | |
|   simple_encode_decode_func<uint32_t>(true);
 | |
|   simple_encode_decode_func<int64_t>(true);
 | |
|   simple_encode_decode_func<uint64_t>(true);
 | |
| }
 | |
| 
 | |
| TEST(td_encode_test, encode_decode_cstr) {
 | |
|   uint8_t    *buf = new uint8_t[1024 * 1024];
 | |
|   char       *cstr = new char[1024 * 1024];
 | |
|   const char *dcstr;
 | |
|   SCoder      encoder;
 | |
|   SCoder      decoder;
 | |
| 
 | |
|   for (size_t i = 0; i < 1024 * 2 - 1; i++) {
 | |
|     memset(cstr, 'a', i);
 | |
|     cstr[i] = '\0';
 | |
|     for (td_endian_t endian : endian_arr) {
 | |
|       // Encode
 | |
|       tCoderInit(&encoder, endian, buf, 1024 * 1024, TD_ENCODER);
 | |
| 
 | |
|       GTEST_ASSERT_EQ(tEncodeCStr(&encoder, cstr), 0);
 | |
| 
 | |
|       tCoderClear(&encoder);
 | |
| 
 | |
|       // Decode
 | |
|       tCoderInit(&decoder, endian, buf, 1024 * 1024, TD_DECODER);
 | |
| 
 | |
|       GTEST_ASSERT_EQ(tDecodeCStr(&decoder, &dcstr), 0);
 | |
|       GTEST_ASSERT_EQ(memcmp(dcstr, cstr, i + 1), 0);
 | |
| 
 | |
|       tCoderClear(&decoder);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   delete[] buf;
 | |
|   delete[] cstr;
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|   int32_t A_a;
 | |
|   int64_t A_b;
 | |
|   char   *A_c;
 | |
| } SStructA_v1;
 | |
| 
 | |
| static int32_t tSStructA_v1_encode(SCoder *pCoder, const SStructA_v1 *pSAV1) {
 | |
|   if (tStartEncode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tEncodeI32(pCoder, pSAV1->A_a) < 0) return -1;
 | |
|   if (tEncodeI64(pCoder, pSAV1->A_b) < 0) return -1;
 | |
|   if (tEncodeCStr(pCoder, pSAV1->A_c) < 0) return -1;
 | |
| 
 | |
|   tEndEncode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| static int32_t tSStructA_v1_decode(SCoder *pCoder, SStructA_v1 *pSAV1) {
 | |
|   if (tStartDecode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tDecodeI32(pCoder, &pSAV1->A_a) < 0) return -1;
 | |
|   if (tDecodeI64(pCoder, &pSAV1->A_b) < 0) return -1;
 | |
|   const char *tstr;
 | |
|   uint64_t    len;
 | |
|   if (tDecodeCStrAndLen(pCoder, &tstr, &len) < 0) return -1;
 | |
|   pSAV1->A_c = (char *)tCoderMalloc(pCoder, len + 1);
 | |
|   memcpy(pSAV1->A_c, tstr, len + 1);
 | |
| 
 | |
|   tEndDecode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|   int32_t A_a;
 | |
|   int64_t A_b;
 | |
|   char   *A_c;
 | |
|   // -------------------BELOW FEILDS ARE ADDED IN A NEW VERSION--------------
 | |
|   int16_t A_d;
 | |
|   int16_t A_e;
 | |
| } SStructA_v2;
 | |
| 
 | |
| static int32_t tSStructA_v2_encode(SCoder *pCoder, const SStructA_v2 *pSAV2) {
 | |
|   if (tStartEncode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tEncodeI32(pCoder, pSAV2->A_a) < 0) return -1;
 | |
|   if (tEncodeI64(pCoder, pSAV2->A_b) < 0) return -1;
 | |
|   if (tEncodeCStr(pCoder, pSAV2->A_c) < 0) return -1;
 | |
| 
 | |
|   // ------------------------NEW FIELDS ENCODE-------------------------------
 | |
|   if (tEncodeI16(pCoder, pSAV2->A_d) < 0) return -1;
 | |
|   if (tEncodeI16(pCoder, pSAV2->A_e) < 0) return -1;
 | |
| 
 | |
|   tEndEncode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| static int32_t tSStructA_v2_decode(SCoder *pCoder, SStructA_v2 *pSAV2) {
 | |
|   if (tStartDecode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tDecodeI32(pCoder, &pSAV2->A_a) < 0) return -1;
 | |
|   if (tDecodeI64(pCoder, &pSAV2->A_b) < 0) return -1;
 | |
|   const char *tstr;
 | |
|   uint64_t    len;
 | |
|   if (tDecodeCStrAndLen(pCoder, &tstr, &len) < 0) return -1;
 | |
|   pSAV2->A_c = (char *)tCoderMalloc(pCoder, len + 1);
 | |
|   memcpy(pSAV2->A_c, tstr, len + 1);
 | |
| 
 | |
|   // ------------------------NEW FIELDS DECODE-------------------------------
 | |
|   if (!tDecodeIsEnd(pCoder)) {
 | |
|     if (tDecodeI16(pCoder, &pSAV2->A_d) < 0) return -1;
 | |
|     if (tDecodeI16(pCoder, &pSAV2->A_e) < 0) return -1;
 | |
|   } else {
 | |
|     pSAV2->A_d = 0;
 | |
|     pSAV2->A_e = 0;
 | |
|   }
 | |
| 
 | |
|   tEndDecode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|   SStructA_v1 *pA;
 | |
|   int32_t      v_a;
 | |
|   int8_t       v_b;
 | |
| } SFinalReq_v1;
 | |
| 
 | |
| static int32_t tSFinalReq_v1_encode(SCoder *pCoder, const SFinalReq_v1 *ps1) {
 | |
|   if (tStartEncode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tSStructA_v1_encode(pCoder, ps1->pA) < 0) return -1;
 | |
|   if (tEncodeI32(pCoder, ps1->v_a) < 0) return -1;
 | |
|   if (tEncodeI8(pCoder, ps1->v_b) < 0) return -1;
 | |
| 
 | |
|   tEndEncode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| static int32_t tSFinalReq_v1_decode(SCoder *pCoder, SFinalReq_v1 *ps1) {
 | |
|   if (tStartDecode(pCoder) < 0) return -1;
 | |
| 
 | |
|   ps1->pA = (SStructA_v1 *)tCoderMalloc(pCoder, sizeof(*(ps1->pA)));
 | |
|   if (tSStructA_v1_decode(pCoder, ps1->pA) < 0) return -1;
 | |
|   if (tDecodeI32(pCoder, &ps1->v_a) < 0) return -1;
 | |
|   if (tDecodeI8(pCoder, &ps1->v_b) < 0) return -1;
 | |
| 
 | |
|   tEndDecode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|   SStructA_v2 *pA;
 | |
|   int32_t      v_a;
 | |
|   int8_t       v_b;
 | |
|   // ----------------------- Feilds added -----------------------
 | |
|   int16_t v_c;
 | |
| } SFinalReq_v2;
 | |
| 
 | |
| static int32_t tSFinalReq_v2_encode(SCoder *pCoder, const SFinalReq_v2 *ps2) {
 | |
|   if (tStartEncode(pCoder) < 0) return -1;
 | |
| 
 | |
|   if (tSStructA_v2_encode(pCoder, ps2->pA) < 0) return -1;
 | |
|   if (tEncodeI32(pCoder, ps2->v_a) < 0) return -1;
 | |
|   if (tEncodeI8(pCoder, ps2->v_b) < 0) return -1;
 | |
| 
 | |
|   // ----------------------- Feilds added encode -----------------------
 | |
|   if (tEncodeI16(pCoder, ps2->v_c) < 0) return -1;
 | |
| 
 | |
|   tEndEncode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| static int32_t tSFinalReq_v2_decode(SCoder *pCoder, SFinalReq_v2 *ps2) {
 | |
|   if (tStartDecode(pCoder) < 0) return -1;
 | |
| 
 | |
|   ps2->pA = (SStructA_v2 *)tCoderMalloc(pCoder, sizeof(*(ps2->pA)));
 | |
|   if (tSStructA_v2_decode(pCoder, ps2->pA) < 0) return -1;
 | |
|   if (tDecodeI32(pCoder, &ps2->v_a) < 0) return -1;
 | |
|   if (tDecodeI8(pCoder, &ps2->v_b) < 0) return -1;
 | |
| 
 | |
|   // ----------------------- Feilds added decode -----------------------
 | |
|   if (tDecodeIsEnd(pCoder)) {
 | |
|     ps2->v_c = 0;
 | |
|   } else {
 | |
|     if (tDecodeI16(pCoder, &ps2->v_c) < 0) return -1;
 | |
|   }
 | |
| 
 | |
|   tEndDecode(pCoder);
 | |
|   return 0;
 | |
| }
 | |
| #if 0
 | |
| TEST(td_encode_test, compound_struct_encode_test) {
 | |
|   SCoder       encoder, decoder;
 | |
|   uint8_t *    buf1;
 | |
|   int32_t      buf1size;
 | |
|   uint8_t     *buf2;
 | |
|   int32_t      buf2size;
 | |
|   SStructA_v1  sa1 = {.A_a = 10, .A_b = 65478, .A_c = (char *)"Hello"};
 | |
|   SStructA_v2  sa2 = {.A_a = 10, .A_b = 65478, .A_c = (char *)"Hello", .A_d = 67, .A_e = 13};
 | |
|   SFinalReq_v1 req1 = {.pA = &sa1, .v_a = 15, .v_b = 35};
 | |
|   SFinalReq_v2 req2 = {.pA = &sa2, .v_a = 15, .v_b = 32, .v_c = 37};
 | |
|   SFinalReq_v1 dreq11, dreq21;
 | |
|   SFinalReq_v2 dreq12, dreq22;
 | |
| 
 | |
|   // Get size
 | |
|   tCoderInit(&encoder, TD_LITTLE_ENDIAN, nullptr, 0, TD_ENCODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v1_encode(&encoder, &req1), 0);
 | |
|   buf1size = encoder.pos;
 | |
|   buf1 = new uint8_t[encoder.pos];
 | |
|   tCoderClear(&encoder);
 | |
| 
 | |
|   tCoderInit(&encoder, TD_LITTLE_ENDIAN, nullptr, 0, TD_ENCODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v2_encode(&encoder, &req2), 0);
 | |
|   buf2size = encoder.pos;
 | |
|   buf2 = new uint8_t[encoder.pos];
 | |
|   tCoderClear(&encoder);
 | |
| 
 | |
|   // Encode
 | |
|   tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf1, buf1size, TD_ENCODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v1_encode(&encoder, &req1), 0);
 | |
|   tCoderClear(&encoder);
 | |
| 
 | |
|   tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf2, buf2size, TD_ENCODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v2_encode(&encoder, &req2), 0);
 | |
|   tCoderClear(&encoder);
 | |
| 
 | |
|   // Decode
 | |
|   // buf1 -> req1
 | |
|   tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf1, buf1size, TD_DECODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v1_decode(&decoder, &dreq11), 0);
 | |
|   GTEST_ASSERT_EQ(dreq11.pA->A_a, req1.pA->A_a);
 | |
|   GTEST_ASSERT_EQ(dreq11.pA->A_b, req1.pA->A_b);
 | |
|   GTEST_ASSERT_EQ(strcmp(dreq11.pA->A_c, req1.pA->A_c), 0);
 | |
|   GTEST_ASSERT_EQ(dreq11.v_a, req1.v_a);
 | |
|   GTEST_ASSERT_EQ(dreq11.v_b, req1.v_b);
 | |
|   tCoderClear(&decoder);
 | |
| 
 | |
|   // buf1 -> req2 (backward compatibility)
 | |
|   tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf1, buf1size, TD_DECODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v2_decode(&decoder, &dreq12), 0);
 | |
|   GTEST_ASSERT_EQ(dreq12.pA->A_a, req1.pA->A_a);
 | |
|   GTEST_ASSERT_EQ(dreq12.pA->A_b, req1.pA->A_b);
 | |
|   GTEST_ASSERT_EQ(strcmp(dreq12.pA->A_c, req1.pA->A_c), 0);
 | |
|   GTEST_ASSERT_EQ(dreq12.pA->A_d, 0);
 | |
|   GTEST_ASSERT_EQ(dreq12.pA->A_e, 0);
 | |
|   GTEST_ASSERT_EQ(dreq12.v_a, req1.v_a);
 | |
|   GTEST_ASSERT_EQ(dreq12.v_b, req1.v_b);
 | |
|   GTEST_ASSERT_EQ(dreq12.v_c, 0);
 | |
|   tCoderClear(&decoder);
 | |
| 
 | |
|   // buf2 -> req2
 | |
|   tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf2, buf2size, TD_DECODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v2_decode(&decoder, &dreq22), 0);
 | |
|   GTEST_ASSERT_EQ(dreq22.pA->A_a, req2.pA->A_a);
 | |
|   GTEST_ASSERT_EQ(dreq22.pA->A_b, req2.pA->A_b);
 | |
|   GTEST_ASSERT_EQ(strcmp(dreq22.pA->A_c, req2.pA->A_c), 0);
 | |
|   GTEST_ASSERT_EQ(dreq22.pA->A_d, req2.pA->A_d);
 | |
|   GTEST_ASSERT_EQ(dreq22.pA->A_e, req2.pA->A_e);
 | |
|   GTEST_ASSERT_EQ(dreq22.v_a, req2.v_a);
 | |
|   GTEST_ASSERT_EQ(dreq22.v_b, req2.v_b);
 | |
|   GTEST_ASSERT_EQ(dreq22.v_c, req2.v_c);
 | |
|   tCoderClear(&decoder);
 | |
| 
 | |
|   tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf2, buf2size, TD_DECODER);
 | |
|   GTEST_ASSERT_EQ(tSFinalReq_v1_decode(&decoder, &dreq21), 0);
 | |
|   GTEST_ASSERT_EQ(dreq21.pA->A_a, req2.pA->A_a);
 | |
|   GTEST_ASSERT_EQ(dreq21.pA->A_b, req2.pA->A_b);
 | |
|   GTEST_ASSERT_EQ(strcmp(dreq21.pA->A_c, req2.pA->A_c), 0);
 | |
|   GTEST_ASSERT_EQ(dreq21.v_a, req2.v_a);
 | |
|   GTEST_ASSERT_EQ(dreq21.v_b, req2.v_b);
 | |
|   tCoderClear(&decoder);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #pragma GCC diagnostic pop
 | |
| 
 | |
| #endif
 |