AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* The function under test is static in the module. Use the provided wrapper. */7extern void test_jsonBlobAppendNode(JsonParse *pParse, u8 eType, u32 szPayload, const void *aPayload);8 9static void initParse(JsonParse *p, u32 cap, u32 startOffset, int prefill){10 memset(p, 0, sizeof(*p));11 p->db = 0; /* Use global allocator path */12 p->nBlob = startOffset;13 p->nBlobAlloc = 0;14 p->aBlob = NULL;15 p->oom = 0;16 p->bReadOnly = 0;17 if( cap>0 ){18 p->aBlob = (u8*)sqlite3_malloc(cap);19 TEST_ASSERT_NOT_NULL(p->aBlob);20 p->nBlobAlloc = cap;21 if( prefill ){22 memset(p->aBlob, 0xEE, cap);23 }24 }25}26 27static void freeParse(JsonParse *p){28 if( p->aBlob ){29 sqlite3_free(p->aBlob);30 p->aBlob = NULL;31 }32 memset(p, 0, sizeof(*p));33}34 35void setUp(void) {36 /* Setup code here */37}38 39void tearDown(void) {40 /* Cleanup code here */41}42 43/* 1-byte header, szPayload=0, payload pointer non-NULL but length 0 */44void test_jsonBlobAppendNode_header1_zero_payload(void){45 JsonParse jp;46 initParse(&jp, 16, 0, 1);47 u8 eType = 0x0b;48 const char *dummy = "";49 test_jsonBlobAppendNode(&jp, eType, 0, (const void*)dummy);50 51 TEST_ASSERT_EQUAL_UINT32(1, jp.nBlob);52 TEST_ASSERT_EQUAL_UINT8((u8)(eType | (0u<<4)), jp.aBlob[0]);53 54 freeParse(&jp);55}56 57/* 1-byte header, szPayload=11, payload appended */58void test_jsonBlobAppendNode_header1_with_payload_11(void){59 JsonParse jp;60 initParse(&jp, 64, 0, 1);61 u8 eType = 0x0b;62 u32 sz = 11;63 unsigned char payload[11];64 for(u32 i=0;i<sz;i++) payload[i] = (unsigned char)('A' + i); /* A..K */65 66 test_jsonBlobAppendNode(&jp, eType, sz, payload);67 68 TEST_ASSERT_EQUAL_UINT32(1u + sz, jp.nBlob);69 TEST_ASSERT_EQUAL_UINT8((u8)(eType | (sz<<4)), jp.aBlob[0]);70 TEST_ASSERT_EQUAL_INT(0, memcmp(&jp.aBlob[1], payload, sz));71 72 freeParse(&jp);73}74 75/* 2-byte header (12..255), payload appended */76void test_jsonBlobAppendNode_header2_with_payload_200(void){77 JsonParse jp;78 initParse(&jp, 300, 0, 1);79 u8 eType = 0x02;80 u32 sz = 200;81 unsigned char *payload = (unsigned char*)sqlite3_malloc(sz);82 TEST_ASSERT_NOT_NULL(payload);83 for(u32 i=0;i<sz;i++) payload[i] = (unsigned char)(i & 0xFF);84 85 test_jsonBlobAppendNode(&jp, eType, sz, payload);86 87 TEST_ASSERT_EQUAL_UINT32(2u + sz, jp.nBlob);88 TEST_ASSERT_EQUAL_UINT8((u8)(eType | 0xC0), jp.aBlob[0]);89 TEST_ASSERT_EQUAL_UINT8((u8)(sz & 0xFF), jp.aBlob[1]);90 TEST_ASSERT_EQUAL_INT(0, memcmp(&jp.aBlob[2], payload, sz));91 92 sqlite3_free(payload);93 freeParse(&jp);94}95 96/* 3-byte header (256..65535), payload appended */97void test_jsonBlobAppendNode_header3_with_payload_0x1234(void){98 JsonParse jp;99 /* capacity enough to avoid expansion */100 const u32 sz = 0x1234; /* 4660 */101 initParse(&jp, 6000, 0, 1);102 u8 eType = 0x06;103 unsigned char *payload = (unsigned char*)sqlite3_malloc(sz);104 TEST_ASSERT_NOT_NULL(payload);105 for(u32 i=0;i<sz;i++) payload[i] = (unsigned char)((i*7) & 0xFF);106 107 test_jsonBlobAppendNode(&jp, eType, sz, payload);108 109 TEST_ASSERT_EQUAL_UINT32(3u + sz, jp.nBlob);110 TEST_ASSERT_EQUAL_UINT8((u8)(eType | 0xD0), jp.aBlob[0]);111 TEST_ASSERT_EQUAL_UINT8((u8)((sz >> 8) & 0xFF), jp.aBlob[1]);112 TEST_ASSERT_EQUAL_UINT8((u8)(sz & 0xFF), jp.aBlob[2]);113 TEST_ASSERT_EQUAL_INT(0, memcmp(&jp.aBlob[3], payload, sz));114 115 sqlite3_free(payload);116 freeParse(&jp);117}118 119/* 5-byte header (>65535), aPayload==NULL. Ensure reservation and header correctness */120void test_jsonBlobAppendNode_header5_reserve_only(void){121 JsonParse jp;122 /* Start with zero capacity to force expansion */123 initParse(&jp, 0, 0, 0);124 u8 eType = 0x0C;125 u32 sz = 70000; /* > 65535 -> 5-byte header */126 test_jsonBlobAppendNode(&jp, eType, sz, NULL);127 128 TEST_ASSERT_NOT_NULL(jp.aBlob);129 TEST_ASSERT_EQUAL_UINT32(5u, jp.nBlob);130 TEST_ASSERT_TRUE(jp.nBlobAlloc >= (u32)(5u + sz));131 132 TEST_ASSERT_EQUAL_UINT8((u8)(eType | 0xE0), jp.aBlob[0]);133 TEST_ASSERT_EQUAL_UINT8((u8)((sz >> 24) & 0xFF), jp.aBlob[1]);134 TEST_ASSERT_EQUAL_UINT8((u8)((sz >> 16) & 0xFF), jp.aBlob[2]);135 TEST_ASSERT_EQUAL_UINT8((u8)((sz >> 8) & 0xFF), jp.aBlob[3]);136 TEST_ASSERT_EQUAL_UINT8((u8)(sz & 0xFF), jp.aBlob[4]);137 138 freeParse(&jp);139}140 141/* Expansion path with small payload (ensure growth and append) */142void test_jsonBlobAppendNode_forces_expand_and_appends(void){143 JsonParse jp;144 initParse(&jp, 1, 0, 1); /* insufficient capacity to hold header+payload */145 u8 eType = 0x03;146 u32 sz = 4;147 unsigned char payload[4] = {1,2,3,4};148 149 test_jsonBlobAppendNode(&jp, eType, sz, payload);150 151 TEST_ASSERT_NOT_NULL(jp.aBlob);152 TEST_ASSERT_TRUE(jp.nBlobAlloc >= (u32)(1 + sz)); /* header 1 + payload */153 TEST_ASSERT_EQUAL_UINT32(1u + sz, jp.nBlob);154 TEST_ASSERT_EQUAL_UINT8((u8)(eType | (sz<<4)), jp.aBlob[0]);155 TEST_ASSERT_EQUAL_INT(0, memcmp(&jp.aBlob[1], payload, sz));156 157 freeParse(&jp);158}159 160/* Non-zero starting offset: ensure correct placement and no overwrite of prior bytes */161void test_jsonBlobAppendNode_nonzero_offset(void){162 JsonParse jp;163 initParse(&jp, 100, 10, 1);164 /* Fill the first 10 bytes with a known pattern */165 memset(jp.aBlob, 0xAA, 10);166 167 u8 eType = 0x04;168 u32 sz = 2;169 unsigned char payload[2] = { 'x', 'y' };170 171 test_jsonBlobAppendNode(&jp, eType, sz, payload);172 173 /* Prior bytes unchanged */174 for(u32 i=0;i<10;i++){175 TEST_ASSERT_EQUAL_UINT8(0xAA, jp.aBlob[i]);176 }177 /* Header at offset 10 */178 TEST_ASSERT_EQUAL_UINT8((u8)(eType | (sz<<4)), jp.aBlob[10]);179 /* Payload follows */180 TEST_ASSERT_EQUAL_UINT8('x', jp.aBlob[11]);181 TEST_ASSERT_EQUAL_UINT8('y', jp.aBlob[12]);182 /* nBlob advanced correctly */183 TEST_ASSERT_EQUAL_UINT32(10u + 1u + sz, jp.nBlob);184 185 freeParse(&jp);186}187 188int main(void){189 UNITY_BEGIN();190 RUN_TEST(test_jsonBlobAppendNode_header1_zero_payload);191 RUN_TEST(test_jsonBlobAppendNode_header1_with_payload_11);192 RUN_TEST(test_jsonBlobAppendNode_header2_with_payload_200);193 RUN_TEST(test_jsonBlobAppendNode_header3_with_payload_0x1234);194 RUN_TEST(test_jsonBlobAppendNode_header5_reserve_only);195 RUN_TEST(test_jsonBlobAppendNode_forces_expand_and_appends);196 RUN_TEST(test_jsonBlobAppendNode_nonzero_offset);197 return UNITY_END();198}