Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_json_jsonBlobExpandAndAppendOneByte.c134 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5#include <stdint.h>6 7/* Wrapper for the static function under test (provided in module) */8extern void test_jsonBlobExpandAndAppendOneByte(JsonParse *pParse, u8 c);9 10static sqlite3 *gDb = NULL;11 12void setUp(void) {13  int rc = sqlite3_open(":memory:", &gDb);14  TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_open failed");15  TEST_ASSERT_NOT_NULL(gDb);16}17 18void tearDown(void) {19  if (gDb) {20    sqlite3_close(gDb);21    gDb = NULL;22  }23}24 25/* Helper to initialize a zeroed JsonParse bound to current db */26static void initJsonParse(JsonParse *p){27  memset(p, 0, sizeof(*p));28  p->db = gDb;29}30 31/* Test: appending to an empty, zero-capacity buffer allocates and writes one byte */32void test_jsonBlobExpandAndAppendOneByte_from_empty_appends_byte(void) {33  JsonParse p;34  initJsonParse(&p);35 36  /* Preconditions: no buffer, no capacity, size 0 */37  TEST_ASSERT_NULL(p.aBlob);38  TEST_ASSERT_EQUAL_UINT32(0u, p.nBlob);39  TEST_ASSERT_EQUAL_UINT32(0u, p.nBlobAlloc);40  TEST_ASSERT_EQUAL_INT(0, p.oom);41 42  const u8 c = (u8)'z';43  test_jsonBlobExpandAndAppendOneByte(&p, c);44 45  /* Postconditions */46  TEST_ASSERT_EQUAL_INT(0, p.oom);47  TEST_ASSERT_NOT_NULL(p.aBlob);48  TEST_ASSERT_TRUE(p.nBlobAlloc >= 1);49  TEST_ASSERT_EQUAL_UINT32(1u, p.nBlob);50  TEST_ASSERT_EQUAL_UINT8(c, p.aBlob[0]);51 52  sqlite3DbFree(p.db, p.aBlob);53}54 55/* Test: when buffer is full (nBlob == nBlobAlloc), it expands and appends */56void test_jsonBlobExpandAndAppendOneByte_full_buffer_expands_and_appends(void) {57  JsonParse p;58  initJsonParse(&p);59 60  /* Allocate a small initial buffer of exactly 2 bytes and mark it full */61  p.aBlob = (u8*)sqlite3DbRealloc(p.db, NULL, 2);62  TEST_ASSERT_NOT_NULL(p.aBlob);63  p.nBlobAlloc = 2;64  p.nBlob = 2;65  p.aBlob[0] = (u8)'A';66  p.aBlob[1] = (u8)'B';67 68  const u8 c = (u8)'C';69  test_jsonBlobExpandAndAppendOneByte(&p, c);70 71  /* Postconditions */72  TEST_ASSERT_EQUAL_INT(0, p.oom);73  TEST_ASSERT_NOT_NULL(p.aBlob);74  TEST_ASSERT_TRUE(p.nBlobAlloc >= 3);75  TEST_ASSERT_EQUAL_UINT32(3u, p.nBlob);76  TEST_ASSERT_EQUAL_UINT8((u8)'A', p.aBlob[0]);77  TEST_ASSERT_EQUAL_UINT8((u8)'B', p.aBlob[1]);78  TEST_ASSERT_EQUAL_UINT8((u8)'C', p.aBlob[2]);79 80  sqlite3DbFree(p.db, p.aBlob);81}82 83/* Test: if the oom flag is already set, the function must not append a byte */84void test_jsonBlobExpandAndAppendOneByte_does_not_append_when_oom_set(void) {85  JsonParse p;86  initJsonParse(&p);87 88  /* Start with a "full" 2-byte buffer containing 'X','Y' */89  p.aBlob = (u8*)sqlite3DbRealloc(p.db, NULL, 2);90  TEST_ASSERT_NOT_NULL(p.aBlob);91  p.nBlobAlloc = 2;92  p.nBlob = 2;93  p.aBlob[0] = (u8)'X';94  p.aBlob[1] = (u8)'Y';95 96  p.oom = 1; /* Simulate prior OOM condition */97 98  /* Attempt to append another byte */99  test_jsonBlobExpandAndAppendOneByte(&p, (u8)'Z');100 101  /* Postconditions: no append should have occurred */102  TEST_ASSERT_EQUAL_INT(1, p.oom);          /* Still OOM */103  TEST_ASSERT_EQUAL_UINT32(2u, p.nBlob);    /* Length unchanged */104  TEST_ASSERT_EQUAL_UINT8((u8)'X', p.aBlob[0]);105  TEST_ASSERT_EQUAL_UINT8((u8)'Y', p.aBlob[1]);106 107  sqlite3DbFree(p.db, p.aBlob);108}109 110/* Test: appending a zero byte (0x00) is handled correctly */111void test_jsonBlobExpandAndAppendOneByte_appends_zero_byte(void) {112  JsonParse p;113  initJsonParse(&p);114 115  const u8 c = (u8)0x00;116  test_jsonBlobExpandAndAppendOneByte(&p, c);117 118  TEST_ASSERT_EQUAL_INT(0, p.oom);119  TEST_ASSERT_NOT_NULL(p.aBlob);120  TEST_ASSERT_TRUE(p.nBlobAlloc >= 1);121  TEST_ASSERT_EQUAL_UINT32(1u, p.nBlob);122  TEST_ASSERT_EQUAL_UINT8((u8)0x00, p.aBlob[0]);123 124  sqlite3DbFree(p.db, p.aBlob);125}126 127int main(void) {128  UNITY_BEGIN();129  RUN_TEST(test_jsonBlobExpandAndAppendOneByte_from_empty_appends_byte);130  RUN_TEST(test_jsonBlobExpandAndAppendOneByte_full_buffer_expands_and_appends);131  RUN_TEST(test_jsonBlobExpandAndAppendOneByte_does_not_append_when_oom_set);132  RUN_TEST(test_jsonBlobExpandAndAppendOneByte_appends_zero_byte);133  return UNITY_END();134}