Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_json_jsonBlobAppendNode.c198 linesDownload Raw Back to tests
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}