Add wal & config UT.
This commit is contained in:
parent
1a176e6e94
commit
3c3e8fdbff
|
@ -157,7 +157,7 @@ int32_t walLoadMeta(SWal* pWal);
|
||||||
int32_t walSaveMeta(SWal* pWal);
|
int32_t walSaveMeta(SWal* pWal);
|
||||||
int32_t walRemoveMeta(SWal* pWal);
|
int32_t walRemoveMeta(SWal* pWal);
|
||||||
int32_t walRollFileInfo(SWal* pWal);
|
int32_t walRollFileInfo(SWal* pWal);
|
||||||
|
int32_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx, int64_t* lastVer);
|
||||||
int32_t walCheckAndRepairMeta(SWal* pWal);
|
int32_t walCheckAndRepairMeta(SWal* pWal);
|
||||||
|
|
||||||
int32_t walCheckAndRepairIdx(SWal* pWal);
|
int32_t walCheckAndRepairIdx(SWal* pWal);
|
||||||
|
|
|
@ -46,7 +46,7 @@ static FORCE_INLINE int walBuildTmpMetaName(SWal* pWal, char* buf) {
|
||||||
return snprintf(buf, WAL_FILE_LEN, "%s/meta-ver.tmp", pWal->path);
|
return snprintf(buf, WAL_FILE_LEN, "%s/meta-ver.tmp", pWal->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx, int64_t* lastVer) {
|
FORCE_INLINE int32_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx, int64_t* lastVer) {
|
||||||
int32_t code = 0, lino = 0;
|
int32_t code = 0, lino = 0;
|
||||||
int32_t sz = taosArrayGetSize(pWal->fileInfoSet);
|
int32_t sz = taosArrayGetSize(pWal->fileInfoSet);
|
||||||
int64_t retVer = -1;
|
int64_t retVer = -1;
|
||||||
|
|
|
@ -127,7 +127,7 @@ class WalRetentionEnv : public ::testing::Test {
|
||||||
SWalCfg cfg;
|
SWalCfg cfg;
|
||||||
cfg.rollPeriod = -1;
|
cfg.rollPeriod = -1;
|
||||||
cfg.segSize = -1;
|
cfg.segSize = -1;
|
||||||
cfg.committed =-1;
|
cfg.committed = -1;
|
||||||
cfg.retentionPeriod = -1;
|
cfg.retentionPeriod = -1;
|
||||||
cfg.retentionSize = 0;
|
cfg.retentionSize = 0;
|
||||||
cfg.rollPeriod = 0;
|
cfg.rollPeriod = 0;
|
||||||
|
@ -146,6 +146,83 @@ class WalRetentionEnv : public ::testing::Test {
|
||||||
const char* pathName = TD_TMP_DIR_PATH "wal_test";
|
const char* pathName = TD_TMP_DIR_PATH "wal_test";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WalSkipLevel : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
int code = walInit(NULL);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() { walCleanUp(); }
|
||||||
|
|
||||||
|
void walResetEnv() {
|
||||||
|
TearDown();
|
||||||
|
taosRemoveDir(pathName);
|
||||||
|
SetUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetUp() override {
|
||||||
|
SWalCfg cfg;
|
||||||
|
cfg.rollPeriod = -1;
|
||||||
|
cfg.segSize = -1;
|
||||||
|
cfg.committed = -1;
|
||||||
|
cfg.retentionPeriod = -1;
|
||||||
|
cfg.retentionSize = 0;
|
||||||
|
cfg.rollPeriod = 0;
|
||||||
|
cfg.vgId = 1;
|
||||||
|
cfg.level = TAOS_WAL_SKIP;
|
||||||
|
pWal = walOpen(pathName, &cfg);
|
||||||
|
ASSERT(pWal != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override {
|
||||||
|
walClose(pWal);
|
||||||
|
pWal = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SWal* pWal = NULL;
|
||||||
|
const char* pathName = TD_TMP_DIR_PATH "wal_test";
|
||||||
|
};
|
||||||
|
|
||||||
|
class WalEncrypted : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
int code = walInit(NULL);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() { walCleanUp(); }
|
||||||
|
|
||||||
|
void walResetEnv() {
|
||||||
|
TearDown();
|
||||||
|
taosRemoveDir(pathName);
|
||||||
|
SetUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetUp() override {
|
||||||
|
SWalCfg cfg;
|
||||||
|
cfg.rollPeriod = -1;
|
||||||
|
cfg.segSize = -1;
|
||||||
|
cfg.committed = -1;
|
||||||
|
cfg.retentionPeriod = -1;
|
||||||
|
cfg.retentionSize = 0;
|
||||||
|
cfg.rollPeriod = 0;
|
||||||
|
cfg.vgId = 0;
|
||||||
|
cfg.level = TAOS_WAL_FSYNC;
|
||||||
|
cfg.encryptAlgorithm = 1;
|
||||||
|
pWal = walOpen(pathName, &cfg);
|
||||||
|
ASSERT(pWal != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override {
|
||||||
|
walClose(pWal);
|
||||||
|
pWal = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SWal* pWal = NULL;
|
||||||
|
const char* pathName = TD_TMP_DIR_PATH "wal_test";
|
||||||
|
};
|
||||||
|
|
||||||
TEST_F(WalCleanEnv, createNew) {
|
TEST_F(WalCleanEnv, createNew) {
|
||||||
walRollFileInfo(pWal);
|
walRollFileInfo(pWal);
|
||||||
ASSERT(pWal->fileInfoSet != NULL);
|
ASSERT(pWal->fileInfoSet != NULL);
|
||||||
|
@ -373,6 +450,183 @@ TEST_F(WalKeepEnv, readHandleRead) {
|
||||||
walCloseReader(pRead);
|
walCloseReader(pRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walLogExist) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
SWalReader* pRead = walOpenReader(pWal, NULL, 0);
|
||||||
|
ASSERT(pRead != NULL);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, i, 0, syncMeta, newStr, len);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
walLogExist(pWal, 0);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
walCloseReader(pRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walScanLogGetLastVerHeadMissMatch) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
do {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, 0, 0, syncMeta, newStr, len);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
int64_t offset = walGetCurFileOffset(pWal);
|
||||||
|
SWalFileInfo* pFileInfo = walGetCurFileInfo(pWal);
|
||||||
|
|
||||||
|
pWal->writeHead.head.version = i;
|
||||||
|
pWal->writeHead.head.bodyLen = len;
|
||||||
|
pWal->writeHead.head.msgType = 0;
|
||||||
|
pWal->writeHead.head.ingestTs = taosGetTimestampUs();
|
||||||
|
|
||||||
|
pWal->writeHead.head.syncMeta = syncMeta;
|
||||||
|
|
||||||
|
pWal->writeHead.cksumHead = 1;
|
||||||
|
pWal->writeHead.cksumBody = walCalcBodyCksum(newStr, len);
|
||||||
|
taosWriteFile(pWal->pLogFile, &pWal->writeHead, sizeof(SWalCkHead));
|
||||||
|
taosWriteFile(pWal->pLogFile, newStr, len);
|
||||||
|
|
||||||
|
int64_t lastVer = 0;
|
||||||
|
code = walScanLogGetLastVer(pWal, 0, &lastVer);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_WAL_CHKSUM_MISMATCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walScanLogGetLastVerBodyMissMatch) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
do {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, 0, 0, syncMeta, newStr, len);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
int64_t offset = walGetCurFileOffset(pWal);
|
||||||
|
SWalFileInfo* pFileInfo = walGetCurFileInfo(pWal);
|
||||||
|
|
||||||
|
pWal->writeHead.head.version = i;
|
||||||
|
pWal->writeHead.head.bodyLen = len;
|
||||||
|
pWal->writeHead.head.msgType = 0;
|
||||||
|
pWal->writeHead.head.ingestTs = taosGetTimestampUs();
|
||||||
|
|
||||||
|
pWal->writeHead.head.syncMeta = syncMeta;
|
||||||
|
|
||||||
|
pWal->writeHead.cksumHead = walCalcHeadCksum(&pWal->writeHead);
|
||||||
|
pWal->writeHead.cksumBody = 1;
|
||||||
|
taosWriteFile(pWal->pLogFile, &pWal->writeHead, sizeof(SWalCkHead));
|
||||||
|
taosWriteFile(pWal->pLogFile, newStr, len);
|
||||||
|
|
||||||
|
int64_t lastVer = 0;
|
||||||
|
code = walScanLogGetLastVer(pWal, 0, &lastVer);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_WAL_CHKSUM_MISMATCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walCheckAndRepairIdxFile) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
do {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, 0);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, 0, 0, syncMeta, newStr, len);
|
||||||
|
} while (0);
|
||||||
|
SWalFileInfo* pFileInfo = walGetCurFileInfo(pWal);
|
||||||
|
for (int i = 1; i < 100; i++) {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
pWal->writeHead.head.version = i;
|
||||||
|
pWal->writeHead.head.bodyLen = len;
|
||||||
|
pWal->writeHead.head.msgType = 0;
|
||||||
|
pWal->writeHead.head.ingestTs = taosGetTimestampUs();
|
||||||
|
pWal->writeHead.head.syncMeta = syncMeta;
|
||||||
|
pWal->writeHead.cksumHead = walCalcHeadCksum(&pWal->writeHead);
|
||||||
|
pWal->writeHead.cksumBody = walCalcBodyCksum(newStr, len);
|
||||||
|
taosWriteFile(pWal->pLogFile, &pWal->writeHead, sizeof(SWalCkHead));
|
||||||
|
taosWriteFile(pWal->pLogFile, newStr, len);
|
||||||
|
}
|
||||||
|
pWal->vers.lastVer = 99;
|
||||||
|
pFileInfo->lastVer = 99;
|
||||||
|
code = walCheckAndRepairIdx(pWal);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walRestoreFromSnapshot1) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, i, 0, syncMeta, newStr, len);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
code = walRestoreFromSnapshot(pWal, 50);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walRestoreFromSnapshot2) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, i, 0, syncMeta, newStr, len);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
SWalRef* ref = walOpenRef(pWal);
|
||||||
|
ref->refVer = 10;
|
||||||
|
code = walRestoreFromSnapshot(pWal, 99);
|
||||||
|
ASSERT_EQ(code, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalKeepEnv, walRollback) {
|
||||||
|
walResetEnv();
|
||||||
|
int code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
char newStr[100];
|
||||||
|
sprintf(newStr, "%s-%d", ranStr, i);
|
||||||
|
int len = strlen(newStr);
|
||||||
|
code = walAppendLog(pWal, i, 0, syncMeta, newStr, len);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
code = walRollback(pWal, -1);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_WAL_INVALID_VER);
|
||||||
|
pWal->vers.lastVer = 50;
|
||||||
|
pWal->vers.commitVer = 40;
|
||||||
|
pWal->vers.snapshotVer = 40;
|
||||||
|
SWalFileInfo* fileInfo = walGetCurFileInfo(pWal);
|
||||||
|
|
||||||
|
code = walRollback(pWal, 48);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(WalRetentionEnv, repairMeta1) {
|
TEST_F(WalRetentionEnv, repairMeta1) {
|
||||||
walResetEnv();
|
walResetEnv();
|
||||||
int code;
|
int code;
|
||||||
|
@ -456,44 +710,6 @@ TEST_F(WalRetentionEnv, repairMeta1) {
|
||||||
walCloseReader(pRead);
|
walCloseReader(pRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
class WalSkipLevel : public ::testing::Test {
|
|
||||||
protected:
|
|
||||||
static void SetUpTestCase() {
|
|
||||||
int code = walInit(NULL);
|
|
||||||
ASSERT(code == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TearDownTestCase() { walCleanUp(); }
|
|
||||||
|
|
||||||
void walResetEnv() {
|
|
||||||
TearDown();
|
|
||||||
taosRemoveDir(pathName);
|
|
||||||
SetUp();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetUp() override {
|
|
||||||
SWalCfg cfg;
|
|
||||||
cfg.rollPeriod = -1;
|
|
||||||
cfg.segSize = -1;
|
|
||||||
cfg.committed =-1;
|
|
||||||
cfg.retentionPeriod = -1;
|
|
||||||
cfg.retentionSize = 0;
|
|
||||||
cfg.rollPeriod = 0;
|
|
||||||
cfg.vgId = 1;
|
|
||||||
cfg.level = TAOS_WAL_SKIP;
|
|
||||||
pWal = walOpen(pathName, &cfg);
|
|
||||||
ASSERT(pWal != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TearDown() override {
|
|
||||||
walClose(pWal);
|
|
||||||
pWal = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SWal* pWal = NULL;
|
|
||||||
const char* pathName = TD_TMP_DIR_PATH "wal_test";
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(WalSkipLevel, restart) {
|
TEST_F(WalSkipLevel, restart) {
|
||||||
walResetEnv();
|
walResetEnv();
|
||||||
int code;
|
int code;
|
||||||
|
@ -533,4 +749,15 @@ TEST_F(WalSkipLevel, roll) {
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
code = walEndSnapshot(pWal);
|
code = walEndSnapshot(pWal);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(WalEncrypted, write) {
|
||||||
|
int code;
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
code = walAppendLog(pWal, i, i + 1, syncMeta, (void*)ranStr, ranStrLen);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(pWal->vers.lastVer, i);
|
||||||
|
}
|
||||||
|
code = walSaveMeta(pWal);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
}
|
}
|
|
@ -517,7 +517,7 @@ int32_t cfgSetItemVal(SConfigItem *pItem, const char *name, const char *value, E
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
if (pItem == NULL) {
|
if (pItem == NULL) {
|
||||||
TAOS_RETURN(TSDB_CODE_INVALID_CFG);
|
TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
|
||||||
}
|
}
|
||||||
switch (pItem->dtype) {
|
switch (pItem->dtype) {
|
||||||
case CFG_DTYPE_BOOL: {
|
case CFG_DTYPE_BOOL: {
|
||||||
|
@ -627,6 +627,7 @@ int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *p
|
||||||
cfgUnLock(pCfg);
|
cfgUnLock(pCfg);
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pItem->category == CFG_CATEGORY_GLOBAL) && alterType == CFG_ALTER_DNODE) {
|
if ((pItem->category == CFG_CATEGORY_GLOBAL) && alterType == CFG_ALTER_DNODE) {
|
||||||
uError("failed to config:%s, not support update global config on only one dnode", name);
|
uError("failed to config:%s, not support update global config on only one dnode", name);
|
||||||
cfgUnLock(pCfg);
|
cfgUnLock(pCfg);
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include "osFile.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
|
|
||||||
class CfgTest : public ::testing::Test {
|
class CfgTest : public ::testing::Test {
|
||||||
|
@ -35,6 +37,9 @@ TEST_F(CfgTest, 01_Str) {
|
||||||
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ENV_CMD), "env_cmd");
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ENV_CMD), "env_cmd");
|
||||||
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_APOLLO_URL), "apollo_url");
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_APOLLO_URL), "apollo_url");
|
||||||
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ARG_LIST), "arg_list");
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ARG_LIST), "arg_list");
|
||||||
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_TAOS_OPTIONS), "taos_options");
|
||||||
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ALTER_CLIENT_CMD), "alter_client_cmd");
|
||||||
|
EXPECT_STREQ(cfgStypeStr(CFG_STYPE_ALTER_SERVER_CMD), "alter_server_cmd");
|
||||||
EXPECT_STREQ(cfgStypeStr(ECfgSrcType(1024)), "invalid");
|
EXPECT_STREQ(cfgStypeStr(ECfgSrcType(1024)), "invalid");
|
||||||
|
|
||||||
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_NONE), "none");
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_NONE), "none");
|
||||||
|
@ -47,6 +52,10 @@ TEST_F(CfgTest, 01_Str) {
|
||||||
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
||||||
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
||||||
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DIR), "dir");
|
||||||
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_DOUBLE), "double");
|
||||||
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_LOCALE), "locale");
|
||||||
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_CHARSET), "charset");
|
||||||
|
EXPECT_STREQ(cfgDtypeStr(CFG_DTYPE_TIMEZONE), "timezone");
|
||||||
EXPECT_STREQ(cfgDtypeStr(ECfgDataType(1024)), "invalid");
|
EXPECT_STREQ(cfgDtypeStr(ECfgDataType(1024)), "invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,24 +66,30 @@ TEST_F(CfgTest, 02_Basic) {
|
||||||
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
ASSERT_NE(pConfig, nullptr);
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 0, 0), 0);
|
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 6, 0), 0);
|
||||||
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 0, 0), 0);
|
|
||||||
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 0, 0), 0);
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 21, 0, 16, 0, 1, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 0, 0), 0);
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 1, 0), 0);
|
||||||
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 0, 0), 0);
|
|
||||||
EXPECT_EQ(cfgAddDir(pConfig, "test_dir", TD_TMP_DIR_PATH, 0, 0, 0), 0);
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 21, 0, 16, 0, 2, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 2, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 21, 0, 16, 0, 6, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 6, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 6, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddDir(pConfig, "test_dir", TD_TMP_DIR_PATH, 0, 6, 0), 0);
|
||||||
|
|
||||||
EXPECT_EQ(cfgGetSize(pConfig), 6);
|
EXPECT_EQ(cfgGetSize(pConfig), 6);
|
||||||
|
|
||||||
int32_t size = cfgGetSize(pConfig);
|
int32_t size = cfgGetSize(pConfig);
|
||||||
|
|
||||||
SConfigItem* pItem = NULL;
|
SConfigItem *pItem = NULL;
|
||||||
SConfigIter *pIter = NULL;
|
SConfigIter *pIter = NULL;
|
||||||
code = cfgCreateIter(pConfig, &pIter);
|
code = cfgCreateIter(pConfig, &pIter);
|
||||||
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
ASSERT_NE(pIter, nullptr);
|
ASSERT_NE(pIter, nullptr);
|
||||||
|
|
||||||
while((pItem = cfgNextIter(pIter)) != NULL) {
|
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
||||||
switch (pItem->dtype) {
|
switch (pItem->dtype) {
|
||||||
case CFG_DTYPE_BOOL:
|
case CFG_DTYPE_BOOL:
|
||||||
printf("index:%d, cfg:%s value:%d\n", size, pItem->name, pItem->bval);
|
printf("index:%d, cfg:%s value:%d\n", size, pItem->name, pItem->bval);
|
||||||
|
@ -115,12 +130,16 @@ TEST_F(CfgTest, 02_Basic) {
|
||||||
EXPECT_EQ(pItem->dtype, CFG_DTYPE_INT32);
|
EXPECT_EQ(pItem->dtype, CFG_DTYPE_INT32);
|
||||||
EXPECT_STREQ(pItem->name, "test_int32");
|
EXPECT_STREQ(pItem->name, "test_int32");
|
||||||
EXPECT_EQ(pItem->i32, 1);
|
EXPECT_EQ(pItem->i32, 1);
|
||||||
|
code = cfgSetItem(pConfig, "test_int32", "21", CFG_STYPE_DEFAULT, true);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
pItem = cfgGetItem(pConfig, "test_int64");
|
pItem = cfgGetItem(pConfig, "test_int64");
|
||||||
EXPECT_EQ(pItem->stype, CFG_STYPE_DEFAULT);
|
EXPECT_EQ(pItem->stype, CFG_STYPE_DEFAULT);
|
||||||
EXPECT_EQ(pItem->dtype, CFG_DTYPE_INT64);
|
EXPECT_EQ(pItem->dtype, CFG_DTYPE_INT64);
|
||||||
EXPECT_STREQ(pItem->name, "test_int64");
|
EXPECT_STREQ(pItem->name, "test_int64");
|
||||||
EXPECT_EQ(pItem->i64, 2);
|
EXPECT_EQ(pItem->i64, 2);
|
||||||
|
code = cfgSetItem(pConfig, "test_int64", "21", CFG_STYPE_DEFAULT, true);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
pItem = cfgGetItem(pConfig, "test_float");
|
pItem = cfgGetItem(pConfig, "test_float");
|
||||||
EXPECT_EQ(pItem->stype, CFG_STYPE_DEFAULT);
|
EXPECT_EQ(pItem->stype, CFG_STYPE_DEFAULT);
|
||||||
|
@ -140,5 +159,210 @@ TEST_F(CfgTest, 02_Basic) {
|
||||||
EXPECT_STREQ(pItem->name, "test_dir");
|
EXPECT_STREQ(pItem->name, "test_dir");
|
||||||
EXPECT_STREQ(pItem->str, TD_TMP_DIR_PATH);
|
EXPECT_STREQ(pItem->str, TD_TMP_DIR_PATH);
|
||||||
|
|
||||||
|
code = cfgGetAndSetItem(pConfig, &pItem, "err_cfg", "err_val", CFG_STYPE_DEFAULT, true);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_CFG_NOT_FOUND);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_int32", "4", false, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_INVALID_CFG);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_int64", "4", true, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_INVALID_CFG);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_bool", "3", false, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_int32", "74", true, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_int64", "74", false, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
|
code = cfgCheckRangeForDynUpdate(pConfig, "test_float", "74", false, CFG_ALTER_LOCAL);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
|
||||||
cfgCleanup(pConfig);
|
cfgCleanup(pConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, initWithArray) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 0, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 0, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 0, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 0, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 0, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddDir(pConfig, "test_dir", TD_TMP_DIR_PATH, 0, 0, 0), 0);
|
||||||
|
|
||||||
|
SArray *pArgs = taosArrayInit(6, sizeof(SConfigPair));
|
||||||
|
SConfigPair *pPair = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair->name = "test_bool";
|
||||||
|
pPair->value = "1";
|
||||||
|
taosArrayPush(pArgs, pPair);
|
||||||
|
SConfigPair *pPair1 = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair1->name = "test_int32";
|
||||||
|
pPair1->value = "2";
|
||||||
|
taosArrayPush(pArgs, pPair1);
|
||||||
|
SConfigPair *pPair2 = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair2->name = "test_int64";
|
||||||
|
pPair2->value = "3";
|
||||||
|
taosArrayPush(pArgs, pPair2);
|
||||||
|
SConfigPair *pPair3 = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair3->name = "test_float";
|
||||||
|
pPair3->value = "4";
|
||||||
|
taosArrayPush(pArgs, pPair3);
|
||||||
|
SConfigPair *pPair4 = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair4->name = "test_string";
|
||||||
|
pPair4->value = "5";
|
||||||
|
taosArrayPush(pArgs, pPair4);
|
||||||
|
SConfigPair *pPair5 = (SConfigPair *)taosMemoryMalloc(sizeof(SConfigPair));
|
||||||
|
pPair5->name = "test_dir";
|
||||||
|
pPair5->value = TD_TMP_DIR_PATH;
|
||||||
|
taosArrayPush(pArgs, pPair5);
|
||||||
|
code = cfgLoadFromArray(pConfig, pArgs);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgDumpItemCategory) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 6, 100), 0);
|
||||||
|
|
||||||
|
SConfigItem *pItem = NULL;
|
||||||
|
pItem = cfgGetItem(pConfig, "test_bool");
|
||||||
|
EXPECT_EQ(pItem->stype, CFG_STYPE_DEFAULT);
|
||||||
|
EXPECT_EQ(pItem->dtype, CFG_DTYPE_BOOL);
|
||||||
|
EXPECT_STREQ(pItem->name, "test_bool");
|
||||||
|
EXPECT_EQ(pItem->bval, 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgDumpItemCategory(pItem, NULL, 0, 0), TSDB_CODE_INVALID_CFG);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgDumpCfgS3) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
cfgAddInt32(pConfig, "s3MigrateIntervalSec", 60 * 60, 600, 100000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER,
|
||||||
|
CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddBool(pConfig, "s3MigrateEnabled", 60 * 60, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER, CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddString(pConfig, "s3Accesskey", "", CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER_LAZY, CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddString(pConfig, "s3Endpoint", "", CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER_LAZY, CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddString(pConfig, "s3BucketName", "", CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER_LAZY, CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddInt32(pConfig, "s3PageCacheSize", 10, 4, 1024 * 1024 * 1024, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER_LAZY,
|
||||||
|
CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddInt32(pConfig, "s3UploadDelaySec", 10, 1, 60 * 60 * 24 * 30, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER,
|
||||||
|
CFG_CATEGORY_GLOBAL);
|
||||||
|
cfgAddDir(pConfig, "scriptDir", configDir, CFG_SCOPE_BOTH, CFG_DYN_NONE, CFG_CATEGORY_LOCAL);
|
||||||
|
|
||||||
|
cfgDumpCfgS3(pConfig, false, false);
|
||||||
|
|
||||||
|
cfgDumpCfgS3(pConfig, true, true);
|
||||||
|
|
||||||
|
cfgDumpCfgS3(pConfig, false, true);
|
||||||
|
|
||||||
|
cfgDumpCfgS3(pConfig, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgLoadFromEnvVar) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 6, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 21, 0, 16, 0, 1, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 1, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 21, 0, 16, 0, 2, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 2, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 21, 0, 16, 0, 6, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 6, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 6, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddDir(pConfig, "test_dir", TD_TMP_DIR_PATH, 0, 6, 0), 0);
|
||||||
|
|
||||||
|
setenv("test_bool", "1", 1);
|
||||||
|
setenv("test_int32", "2", 1);
|
||||||
|
setenv("test_int64", "3", 1);
|
||||||
|
setenv("test_float", "4", 1);
|
||||||
|
setenv("test_string", "5", 1);
|
||||||
|
setenv("test_dir", TD_TMP_DIR_PATH, 1);
|
||||||
|
|
||||||
|
ASSERT_EQ(cfgLoad(pConfig, CFG_STYPE_ENV_VAR, "test_bool"), TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgLoadFromEnvCmd) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 6, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 21, 0, 16, 0, 1, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 1, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 21, 0, 16, 0, 2, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 2, 0), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 21, 0, 16, 0, 6, 0), TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 6, 0), 0);
|
||||||
|
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 6, 0), 0);
|
||||||
|
|
||||||
|
const char *envCmd[] = {"test_bool=1", "test_int32=2", "test_int64=3", "test_float=4", "test_string=5", NULL};
|
||||||
|
|
||||||
|
ASSERT_EQ(cfgLoad(pConfig, CFG_STYPE_ENV_CMD, envCmd), TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgLoadFromEnvFile) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
TdFilePtr envFile = NULL;
|
||||||
|
const char *envFilePath = TD_TMP_DIR_PATH "envFile";
|
||||||
|
envFile = taosOpenFile(envFilePath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||||
|
const char *buf = "test_bool=1\ntest_int32=2\ntest_int64=3\ntest_float=4\ntest_string=5\n";
|
||||||
|
taosWriteFile(envFile, buf, strlen(buf));
|
||||||
|
taosCloseFile(&envFile);
|
||||||
|
ASSERT_EQ(cfgLoad(pConfig, CFG_STYPE_ENV_FILE, envFilePath), TSDB_CODE_SUCCESS);
|
||||||
|
|
||||||
|
taosRemoveFile(envFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CfgTest, cfgLoadFromApollUrl) {
|
||||||
|
SConfig *pConfig = NULL;
|
||||||
|
int32_t code = cfgInit(&pConfig);
|
||||||
|
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
|
ASSERT_NE(pConfig, nullptr);
|
||||||
|
|
||||||
|
TdFilePtr jsonFile = NULL;
|
||||||
|
const char *jsonFilePath = TD_TMP_DIR_PATH "envJson.json";
|
||||||
|
jsonFile = taosOpenFile(jsonFilePath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||||
|
const char *buf =
|
||||||
|
"{\"test_bool\":\"1\",\"test_int32\":\"2\",\"test_int64\":\"3\",\"test_float\":\"4\",\"test_string\":\"5\"}";
|
||||||
|
taosWriteFile(jsonFile, buf, strlen(buf));
|
||||||
|
taosCloseFile(&jsonFile);
|
||||||
|
|
||||||
|
char str[256];
|
||||||
|
snprintf(str, sizeof(str), "jsonFile:%s", jsonFilePath);
|
||||||
|
ASSERT_EQ(cfgLoad(pConfig, CFG_STYPE_APOLLO_URL, str), TSDB_CODE_INVALID_DATA_FMT);
|
||||||
|
|
||||||
|
taosRemoveFile(jsonFilePath);
|
||||||
|
}
|
Loading…
Reference in New Issue