From 4931bfa7a09b6a6381a8c20a15a0c1d9ef296e98 Mon Sep 17 00:00:00 2001 From: shenglian zhou Date: Thu, 14 Sep 2023 09:02:32 +0800 Subject: [PATCH] enhance: add test for api --- tests/script/api/makefile | 2 + tests/script/api/whiteListTest.c | 150 ++++++++++++ tests/script/api/whitelist.c | 380 ------------------------------- 3 files changed, 152 insertions(+), 380 deletions(-) create mode 100644 tests/script/api/whiteListTest.c delete mode 100644 tests/script/api/whitelist.c diff --git a/tests/script/api/makefile b/tests/script/api/makefile index 6d55d8a75f..ac5c5c9138 100644 --- a/tests/script/api/makefile +++ b/tests/script/api/makefile @@ -16,6 +16,7 @@ exe: gcc $(CFLAGS) ./dbTableRoute.c -o $(ROOT)dbTableRoute $(LFLAGS) gcc $(CFLAGS) ./insertSameTs.c -o $(ROOT)insertSameTs $(LFLAGS) gcc $(CFLAGS) ./passwdTest.c -o $(ROOT)passwdTest $(LFLAGS) + gcc $(CFLAGS) ./whiteListTest.c -o $(ROOT)whiteListTest $(LFLAGS) clean: rm $(ROOT)batchprepare @@ -23,3 +24,4 @@ clean: rm $(ROOT)dbTableRoute rm $(ROOT)insertSameTs rm $(ROOT)passwdTest + rm $(ROOT)whiteListTest diff --git a/tests/script/api/whiteListTest.c b/tests/script/api/whiteListTest.c new file mode 100644 index 0000000000..c7eff7ceae --- /dev/null +++ b/tests/script/api/whiteListTest.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// TAOS standard API example. The same syntax as MySQL, but only a subset +// to compile: gcc -o demo demo.c -ltaos + +/** + * passwdTest.c + * - Run the test case in clear TDengine environment with default root passwd 'taosdata' + */ + +#include +#include +#include +#include +#include +#include "taos.h" // TAOS header file + +#define nDup 1 +#define nRoot 10 +#define nUser 10 +#define USER_LEN 24 +#define BUF_LEN 1024 + +typedef uint16_t VarDataLenT; + +#define TSDB_NCHAR_SIZE sizeof(int32_t) +#define VARSTR_HEADER_SIZE sizeof(VarDataLenT) + +#define GET_FLOAT_VAL(x) (*(float *)(x)) +#define GET_DOUBLE_VAL(x) (*(double *)(x)) + +#define varDataLen(v) ((VarDataLenT *)(v))[0] + +void createUsers(TAOS *taos, const char *host, char *qstr); +void passVerTestMulti(const char *host, char *qstr); +void sysInfoTest(TAOS *taos, const char *host, char *qstr); + +int nPassVerNotified = 0; +int nWhiteListVerNotified = 0; +TAOS *taosu[nRoot] = {0}; +char users[nUser][USER_LEN] = {0}; + +void __taos_notify_cb(void *param, void *ext, int type) { + switch (type) { + case TAOS_NOTIFY_PASSVER: { + ++nPassVerNotified; + printf("%s:%d type:%d user:%s ver:%d\n", __func__, __LINE__, type, param ? (char *)param : "NULL", *(int *)ext); + break; + } + case TAOS_NOTIFY_WHITELIST_VER: { + ++nWhiteListVerNotified; + printf("%s:%d type:%d user:%s ver:%d\n", __func__, __LINE__, type, param ? (char *)param : "NULL", *(int64_t *)ext); + break; + } + default: + printf("%s:%d unknown type:%d\n", __func__, __LINE__, type); + break; + } +} + +static void queryDB(TAOS *taos, char *command) { + int i; + TAOS_RES *pSql = NULL; + int32_t code = -1; + + for (i = 0; i < nDup; ++i) { + if (NULL != pSql) { + taos_free_result(pSql); + pSql = NULL; + } + + pSql = taos_query(taos, command); + code = taos_errno(pSql); + if (0 == code) { + break; + } + } + + if (code != 0) { + fprintf(stderr, "failed to run: %s, reason: %s\n", command, taos_errstr(pSql)); + taos_free_result(pSql); + taos_close(taos); + exit(EXIT_FAILURE); + } else { + fprintf(stderr, "success to run: %s\n", command); + } + + taos_free_result(pSql); +} + + +int main(int argc, char *argv[]) { + char qstr[1024]; + + // connect to server + if (argc < 2) { + printf("please input server-ip \n"); + return 0; + } + + TAOS *taos = taos_connect(argv[1], "root", "taosdata", NULL, 0); + if (taos == NULL) { + printf("failed to connect to server, reason:%s\n", "null taos" /*taos_errstr(taos)*/); + exit(1); + } + createUsers(taos, argv[1], qstr); + + taos_close(taos); + taos_cleanup(); +} + +void createUsers(TAOS *taos, const char *host, char *qstr) { + // users + for (int i = 0; i < nUser; ++i) { + sprintf(users[i], "user%d", i); + sprintf(qstr, "CREATE USER %s PASS 'taosdata'", users[i]); + queryDB(taos, qstr); + + taosu[i] = taos_connect(host, users[i], "taosdata", NULL, 0); + if (taosu[i] == NULL) { + printf("failed to connect to server, user:%s, reason:%s\n", users[i], "null taos" /*taos_errstr(taos)*/); + exit(1); + } + + int code = taos_set_notify_cb(taosu[i], __taos_notify_cb, users[i], TAOS_NOTIFY_WHITELIST_VER); + + if (code != 0) { + fprintf(stderr, "failed to run: taos_set_notify_cb for user:%s since %d\n", users[i], code); + } else { + fprintf(stderr, "success to run: taos_set_notify_cb for user:%s\n", users[i]); + } + + // alter pass for users + sprintf(qstr, "alter user %s add host '%d.%d.%d.%d/24'", users[i], i, i, i, i); + queryDB(taos, qstr); + } +} diff --git a/tests/script/api/whitelist.c b/tests/script/api/whitelist.c deleted file mode 100644 index 5562c3f508..0000000000 --- a/tests/script/api/whitelist.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * This program is free software: you can use, redistribute, and/or modify - * it under the terms of the GNU Affero General Public License, version 3 - * or later ("AGPL"), as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// TAOS standard API example. The same syntax as MySQL, but only a subset -// to compile: gcc -o demo demo.c -ltaos - -/** - * passwdTest.c - * - Run the test case in clear TDengine environment with default root passwd 'taosdata' - */ - -#include -#include -#include -#include -#include -#include "taos.h" // TAOS header file - -#define nDup 1 -#define nRoot 10 -#define nUser 10 -#define USER_LEN 24 -#define BUF_LEN 1024 - -typedef uint16_t VarDataLenT; - -#define TSDB_NCHAR_SIZE sizeof(int32_t) -#define VARSTR_HEADER_SIZE sizeof(VarDataLenT) - -#define GET_FLOAT_VAL(x) (*(float *)(x)) -#define GET_DOUBLE_VAL(x) (*(double *)(x)) - -#define varDataLen(v) ((VarDataLenT *)(v))[0] - -void createUsers(TAOS *taos, const char *host, char *qstr); -void passVerTestMulti(const char *host, char *qstr); -void sysInfoTest(TAOS *taos, const char *host, char *qstr); - -int nPassVerNotified = 0; -TAOS *taosu[nRoot] = {0}; -char users[nUser][USER_LEN] = {0}; - -void __taos_notify_cb(void *param, void *ext, int type) { - switch (type) { - case TAOS_NOTIFY_PASSVER: { - ++nPassVerNotified; - printf("%s:%d type:%d user:%s ver:%d\n", __func__, __LINE__, type, param ? (char *)param : "NULL", *(int *)ext); - break; - } - - default: - printf("%s:%d unknown type:%d\n", __func__, __LINE__, type); - break; - } -} - -static void queryDB(TAOS *taos, char *command) { - int i; - TAOS_RES *pSql = NULL; - int32_t code = -1; - - for (i = 0; i < nDup; ++i) { - if (NULL != pSql) { - taos_free_result(pSql); - pSql = NULL; - } - - pSql = taos_query(taos, command); - code = taos_errno(pSql); - if (0 == code) { - break; - } - } - - if (code != 0) { - fprintf(stderr, "failed to run: %s, reason: %s\n", command, taos_errstr(pSql)); - taos_free_result(pSql); - taos_close(taos); - exit(EXIT_FAILURE); - } else { - fprintf(stderr, "success to run: %s\n", command); - } - - taos_free_result(pSql); -} - -int printRow(char *str, TAOS_ROW row, TAOS_FIELD *fields, int numFields) { - int len = 0; - char split = ' '; - - for (int i = 0; i < numFields; ++i) { - if (i > 0) { - str[len++] = split; - } - - if (row[i] == NULL) { - len += sprintf(str + len, "%s", "NULL"); - continue; - } - - switch (fields[i].type) { - case TSDB_DATA_TYPE_TINYINT: - len += sprintf(str + len, "%d", *((int8_t *)row[i])); - break; - case TSDB_DATA_TYPE_UTINYINT: - len += sprintf(str + len, "%u", *((uint8_t *)row[i])); - break; - case TSDB_DATA_TYPE_SMALLINT: - len += sprintf(str + len, "%d", *((int16_t *)row[i])); - break; - case TSDB_DATA_TYPE_USMALLINT: - len += sprintf(str + len, "%u", *((uint16_t *)row[i])); - break; - case TSDB_DATA_TYPE_INT: - len += sprintf(str + len, "%d", *((int32_t *)row[i])); - break; - case TSDB_DATA_TYPE_UINT: - len += sprintf(str + len, "%u", *((uint32_t *)row[i])); - break; - case TSDB_DATA_TYPE_BIGINT: - len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i])); - break; - case TSDB_DATA_TYPE_UBIGINT: - len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i])); - break; - case TSDB_DATA_TYPE_FLOAT: { - float fv = 0; - fv = GET_FLOAT_VAL(row[i]); - len += sprintf(str + len, "%f", fv); - } break; - case TSDB_DATA_TYPE_DOUBLE: { - double dv = 0; - dv = GET_DOUBLE_VAL(row[i]); - len += sprintf(str + len, "%lf", dv); - } break; - case TSDB_DATA_TYPE_BINARY: - case TSDB_DATA_TYPE_VARBINARY: - case TSDB_DATA_TYPE_NCHAR: - case TSDB_DATA_TYPE_GEOMETRY: { - int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE); - memcpy(str + len, row[i], charLen); - len += charLen; - } break; - case TSDB_DATA_TYPE_TIMESTAMP: - len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i])); - break; - case TSDB_DATA_TYPE_BOOL: - len += sprintf(str + len, "%d", *((int8_t *)row[i])); - default: - break; - } - } - return len; -} - -static int printResult(TAOS_RES *res, char *output) { - int numFields = taos_num_fields(res); - TAOS_FIELD *fields = taos_fetch_fields(res); - char header[BUF_LEN] = {0}; - int len = 0; - for (int i = 0; i < numFields; ++i) { - len += sprintf(header + len, "%s ", fields[i].name); - } - puts(header); - if (output) { - strncpy(output, header, BUF_LEN); - } - - TAOS_ROW row = NULL; - while ((row = taos_fetch_row(res))) { - char temp[BUF_LEN] = {0}; - printRow(temp, row, fields, numFields); - puts(temp); - } -} - -int main(int argc, char *argv[]) { - char qstr[1024]; - - // connect to server - if (argc < 2) { - printf("please input server-ip \n"); - return 0; - } - - TAOS *taos = taos_connect(argv[1], "root", "taosdata", NULL, 0); - if (taos == NULL) { - printf("failed to connect to server, reason:%s\n", "null taos" /*taos_errstr(taos)*/); - exit(1); - } - createUsers(taos, argv[1], qstr); - passVerTestMulti(argv[1], qstr); - sysInfoTest(taos, argv[1], qstr); - - taos_close(taos); - taos_cleanup(); -} - -void createUsers(TAOS *taos, const char *host, char *qstr) { - // users - for (int i = 0; i < nUser; ++i) { - sprintf(users[i], "user%d", i); - sprintf(qstr, "CREATE USER %s PASS 'taosdata'", users[i]); - queryDB(taos, qstr); - - taosu[i] = taos_connect(host, users[i], "taosdata", NULL, 0); - if (taosu[i] == NULL) { - printf("failed to connect to server, user:%s, reason:%s\n", users[i], "null taos" /*taos_errstr(taos)*/); - exit(1); - } - - int code = taos_set_notify_cb(taosu[i], __taos_notify_cb, users[i], TAOS_NOTIFY_PASSVER); - - if (code != 0) { - fprintf(stderr, "failed to run: taos_set_notify_cb for user:%s since %d\n", users[i], code); - } else { - fprintf(stderr, "success to run: taos_set_notify_cb for user:%s\n", users[i]); - } - - // alter pass for users - sprintf(qstr, "alter user %s pass 'taos'", users[i]); - queryDB(taos, qstr); - } -} - -void passVerTestMulti(const char *host, char *qstr) { - // root - TAOS *taos[nRoot] = {0}; - char userName[USER_LEN] = "root"; - - for (int i = 0; i < nRoot; ++i) { - taos[i] = taos_connect(host, "root", "taosdata", NULL, 0); - if (taos[i] == NULL) { - printf("failed to connect to server, reason:%s\n", "null taos" /*taos_errstr(taos)*/); - exit(1); - } - - int code = taos_set_notify_cb(taos[i], __taos_notify_cb, userName, TAOS_NOTIFY_PASSVER); - - if (code != 0) { - fprintf(stderr, "failed to run: taos_set_notify_cb since %d\n", code); - } else { - fprintf(stderr, "success to run: taos_set_notify_cb\n"); - } - } - - queryDB(taos[0], "create database if not exists demo1 vgroups 1 minrows 10"); - queryDB(taos[0], "create database if not exists demo2 vgroups 1 minrows 10"); - queryDB(taos[0], "create database if not exists demo3 vgroups 1 minrows 10"); - - queryDB(taos[0], "create table demo1.stb (ts timestamp, c1 int) tags(t1 int)"); - queryDB(taos[0], "create table demo2.stb (ts timestamp, c1 int) tags(t1 int)"); - queryDB(taos[0], "create table demo3.stb (ts timestamp, c1 int) tags(t1 int)"); - - strcpy(qstr, "alter user root pass 'taos'"); - queryDB(taos[0], qstr); - - // calculate the nPassVerNotified for root and users - int nConn = nRoot + nUser; - - for (int i = 0; i < 15; ++i) { - printf("%s:%d [%d] second(s) elasped, passVer notification received:%d, total:%d\n", __func__, __LINE__, i, - nPassVerNotified, nConn); - if (nPassVerNotified >= nConn) break; - sleep(1); - } - - // close the taos_conn - for (int i = 0; i < nRoot; ++i) { - taos_close(taos[i]); - printf("%s:%d close taos[%d]\n", __func__, __LINE__, i); - // sleep(1); - } - - for (int i = 0; i < nUser; ++i) { - taos_close(taosu[i]); - printf("%s:%d close taosu[%d]\n", __func__, __LINE__, i); - // sleep(1); - } - - fprintf(stderr, "######## %s #########\n", __func__); - if (nPassVerNotified >= nConn) { - fprintf(stderr, ">>> succeed to get passVer notification since nNotify %d >= nConn %d\n", nPassVerNotified, - nConn); - } else { - fprintf(stderr, ">>> failed to get passVer notification since nNotify %d < nConn %d\n", nPassVerNotified, nConn); - } - fprintf(stderr, "######## %s #########\n", __func__); - // sleep(300); -} - -void sysInfoTest(TAOS *taosRoot, const char *host, char *qstr) { - TAOS *taos[nRoot] = {0}; - char userName[USER_LEN] = "user0"; - - for (int i = 0; i < nRoot; ++i) { - taos[i] = taos_connect(host, "user0", "taos", NULL, 0); - if (taos[i] == NULL) { - fprintf(stderr, "failed to connect to server, reason:%s\n", "null taos" /*taos_errstr(taos)*/); - exit(1); - } - } - - queryDB(taosRoot, "create database if not exists demo11 vgroups 1 minrows 10"); - queryDB(taosRoot, "create database if not exists demo12 vgroups 1 minrows 10"); - queryDB(taosRoot, "create database if not exists demo13 vgroups 1 minrows 10"); - - queryDB(taosRoot, "create table demo11.stb (ts timestamp, c1 int) tags(t1 int)"); - queryDB(taosRoot, "create table demo12.stb (ts timestamp, c1 int) tags(t1 int)"); - queryDB(taosRoot, "create table demo13.stb (ts timestamp, c1 int) tags(t1 int)"); - - sprintf(qstr, "show grants"); - char output[BUF_LEN]; - TAOS_RES *res = NULL; - int32_t nRep = 0; - -_REP: - fprintf(stderr, "######## %s loop:%d #########\n", __func__, nRep); - res = taos_query(taos[0], qstr); - if (taos_errno(res) != 0) { - fprintf(stderr, "%s:%d failed to execute: %s since %s\n", __func__, __LINE__, qstr, taos_errstr(res)); - taos_free_result(res); - exit(EXIT_FAILURE); - } - printResult(res, output); - taos_free_result(res); - if (!strstr(output, "timeseries")) { - fprintf(stderr, "%s:%d expected output: 'timeseries' not occur\n", __func__, __LINE__); - exit(EXIT_FAILURE); - } - - queryDB(taosRoot, "alter user user0 sysinfo 0"); - - fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__); - for (int i = 1; i <= 2; ++i) { - sleep(1); - } - - res = taos_query(taos[0], qstr); - if (taos_errno(res) != 0) { - if (!strstr(taos_errstr(res), "Permission denied")) { - fprintf(stderr, "%s:%d expected error: 'Permission denied' not occur\n", __func__, __LINE__); - taos_free_result(res); - exit(EXIT_FAILURE); - } - } - taos_free_result(res); - - queryDB(taosRoot, "alter user user0 sysinfo 1"); - fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__); - for (int i = 1; i <= 2; ++i) { - sleep(1); - } - - if(++nRep < 5) { - goto _REP; - } - - // close the taos_conn - for (int i = 0; i < nRoot; ++i) { - taos_close(taos[i]); - fprintf(stderr, "%s:%d close taos[%d]\n", __func__, __LINE__, i); - } - - fprintf(stderr, "######## %s #########\n", __func__); - fprintf(stderr, ">>> succeed to run sysInfoTest\n"); - fprintf(stderr, "######## %s #########\n", __func__); -} \ No newline at end of file