From 9f2d45c6a5f67abd414043186ed7a974eadb3624 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 17 Jan 2022 13:02:34 +0800 Subject: [PATCH 1/2] add queue UT --- source/libs/transport/test/transportTests.cc | 117 +++++++++++++++++-- 1 file changed, 110 insertions(+), 7 deletions(-) diff --git a/source/libs/transport/test/transportTests.cc b/source/libs/transport/test/transportTests.cc index 468aeba8a9..151deaf29b 100644 --- a/source/libs/transport/test/transportTests.cc +++ b/source/libs/transport/test/transportTests.cc @@ -13,23 +13,126 @@ * along with this program. If not, see . */ +#ifdef USE_UV + #include #include #include #include #include +#include #include "transportInt.h" #include "trpc.h" using namespace std; -int main() { - SRpcInit init = {.localPort = 6030, .label = "rpc", .numOfThreads = 5}; - void* p = rpcOpen(&init); - - while (1) { - std::cout << "cron task" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(10 * 1000)); +struct QueueElem { + queue q; + int val; +}; +class QueueObj { + public: + QueueObj() { + // avoid formate + QUEUE_INIT(&head); } + void Push(QueueElem *el) { + // avoid formate + QUEUE_PUSH(&head, &el->q); + } + QueueElem *Pop() { + QueueElem *el = NULL; + if (!IsEmpty()) { + queue *h = QUEUE_HEAD(&head); + el = QUEUE_DATA(h, QueueElem, q); + QUEUE_REMOVE(&el->q); + } + return el; + } + bool IsEmpty() { + // avoid formate + return QUEUE_IS_EMPTY(&head); + } + void RmElem(QueueElem *el) { + // impl + QUEUE_REMOVE(&el->q); + } + void ForEach(std::vector &result) { + queue *h; + QUEUE_FOREACH(h, &head) { + // add more + QueueElem *el = QUEUE_DATA(h, QueueElem, q); + result.push_back(el->val); + } + } + + private: + queue head; +}; + +class QueueEnv : public ::testing::Test { + protected: + virtual void SetUp() { + // TODO + q = new QueueObj(); + } + virtual void TearDown() { + delete q; + // formate + } + QueueObj *q; +}; + +TEST_F(QueueEnv, testPushAndPop) { + // add more test + assert(q->IsEmpty()); + + for (int i = 0; i < 100; i++) { + QueueElem *el = (QueueElem *)malloc(sizeof(QueueElem)); + el->val = i; + q->Push(el); + } + int i = 0; + while (!q->IsEmpty()) { + QueueElem *el = q->Pop(); + assert(el->val == i++); + free(el); + } + assert(q->IsEmpty()); } +TEST_F(QueueEnv, testRm) { + // add more test + + std::vector set; + assert(q->IsEmpty()); + + for (int i = 0; i < 100; i++) { + QueueElem *el = (QueueElem *)malloc(sizeof(QueueElem)); + el->val = i; + q->Push(el); + set.push_back(el); + } + for (int i = set.size() - 1; i >= 0; i--) { + QueueElem *el = set[i]; + q->RmElem(el); + free(el); + } + assert(q->IsEmpty()); +} +TEST_F(QueueEnv, testIter) { + // add more test + assert(q->IsEmpty()); + std::vector vals; + for (int i = 0; i < 100; i++) { + QueueElem *el = (QueueElem *)malloc(sizeof(QueueElem)); + el->val = i; + q->Push(el); + vals.push_back(i); + } + std::vector result; + q->ForEach(result); + assert(result.size() == vals.size()); +} + +#endif From b6bd41d99eec5d504d8668458bae788820eb36c2 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 17 Jan 2022 14:29:37 +0800 Subject: [PATCH 2/2] [td-11818] Fix bug in jsonToObj --- source/client/test/clientTests.cpp | 2 +- source/libs/planner/src/physicalPlanJson.c | 21 ++++++++++++++++----- source/libs/qworker/src/qworker.c | 3 ++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 9810b30857..4170401f00 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -49,7 +49,7 @@ int main(int argc, char** argv) { TEST(testCase, driverInit_Test) { taos_init(); } TEST(testCase, connect_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + TAOS* pConn = taos_connect("localhost", "root", "taosdata", "abc1", 0); if (pConn == NULL) { printf("failed to connect to server, reason:%s\n", taos_errstr(NULL)); } diff --git a/source/libs/planner/src/physicalPlanJson.c b/source/libs/planner/src/physicalPlanJson.c index 97eb63ac31..c7a4e438ba 100644 --- a/source/libs/planner/src/physicalPlanJson.c +++ b/source/libs/planner/src/physicalPlanJson.c @@ -30,7 +30,8 @@ static void copyString(const cJSON* json, const char* name, char* dst) { } static int64_t getNumber(const cJSON* json, const char* name) { - return cJSON_GetNumberValue(cJSON_GetObjectItem(json, name)); + double d = cJSON_GetNumberValue(cJSON_GetObjectItem(json, name)); + return (int64_t) d; } static bool addObject(cJSON* json, const char* name, FToJson func, const void* obj) { @@ -541,17 +542,27 @@ static const char* jkTimeWindowEndKey = "EndKey"; static bool timeWindowToJson(const void* obj, cJSON* json) { const STimeWindow* win = (const STimeWindow*)obj; - bool res = cJSON_AddNumberToObject(json, jkTimeWindowStartKey, win->skey); + + char tmp[32] = {0}; + sprintf(tmp, "%"PRId64, win->skey); + + bool res = cJSON_AddStringToObject(json, jkTimeWindowStartKey, tmp); if (res) { - res = cJSON_AddNumberToObject(json, jkTimeWindowEndKey, win->ekey); + memset(tmp, 0, tListLen(tmp)); + sprintf(tmp, "%"PRId64, win->ekey); + res = cJSON_AddStringToObject(json, jkTimeWindowEndKey, tmp); } return res; } static bool timeWindowFromJson(const cJSON* json, void* obj) { STimeWindow* win = (STimeWindow*)obj; - win->skey = getNumber(json, jkTimeWindowStartKey); - win->ekey = getNumber(json, jkTimeWindowEndKey); + + char* p = getString(json, jkTimeWindowStartKey); + win->skey = strtoll(p, NULL, 10); + + p = getString(json, jkTimeWindowEndKey); + win->ekey = strtoll(p, NULL, 10); return true; } diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 1be190065a..249c784313 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -1262,7 +1262,8 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) { } QW_ERR_JRET(qwAddTask(qWorkerMgmt, sId, qId, tId, JOB_TASK_STATUS_EXECUTING)); - + QW_DLOG("query task received, reqId:0x%"PRIx64", physical plan:%s", qId, msg->msg); + code = qStringToSubplan(msg->msg, &plan); if (TSDB_CODE_SUCCESS != code) { QW_TASK_ELOG("string to subplan failed, code:%d", code);