AryaWu/sqlite
0
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}