sdbTest.cpp 7.5 KB
Newer Older
S
Shengliang Guan 已提交
1 2 3 4 5 6 7 8 9 10 11
/**
 * @file sdbTest.cpp
 * @author slguan (slguan@taosdata.com)
 * @brief MNODE module sdb tests
 * @version 1.0
 * @date 2022-04-27
 *
 * @copyright Copyright (c) 2022
 *
 */

S
Shengliang Guan 已提交
12
#include <gtest/gtest.h>
S
Shengliang Guan 已提交
13

S
Shengliang Guan 已提交
14
#include "sdb.h"
S
Shengliang Guan 已提交
15

S
Shengliang Guan 已提交
16 17 18 19
class MndTestSdb : public ::testing::Test {
 protected:
  static void SetUpTestSuite() {}
  static void TearDownTestSuite() {}
S
Shengliang Guan 已提交
20 21 22 23 24 25

 public:
  void SetUp() override {}
  void TearDown() override {}
};

S
Shengliang Guan 已提交
26 27 28 29 30 31
typedef struct SMnode {
  int32_t v100;
  int32_t v200;
  SSdb   *pSdb;
} SMnode;

S
Shengliang Guan 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
typedef struct SStrObj {
  char    key[24];
  int8_t  v8;
  int16_t v16;
  int32_t v32;
  int64_t v64;
  char    vstr[32];
  char    unused[48];
} SStrObj;

typedef struct SI32Obj {
  int32_t key;
  int8_t  v8;
  int16_t v16;
  int32_t v32;
  int64_t v64;
  char    vstr[32];
  char    unused[48];
} SI32Obj;

typedef struct SI64Obj {
  int64_t key;
  int8_t  v8;
  int16_t v16;
  int32_t v32;
  int64_t v64;
  char    vstr[32];
  char    unused[48];
} SI64Obj;

SSdbRaw *strEncode(SStrObj *pObj) {
  int32_t  dataPos = 0;
  SSdbRaw *pRaw = sdbAllocRaw(SDB_USER, 1, sizeof(SStrObj));

  sdbSetRawBinary(pRaw, dataPos, pObj->key, sizeof(pObj->key));
  dataPos += sizeof(pObj->key);
  sdbSetRawInt8(pRaw, dataPos, pObj->v8);
  dataPos += sizeof(pObj->v8);
  sdbSetRawInt16(pRaw, dataPos, pObj->v16);
  dataPos += sizeof(pObj->v16);
  sdbSetRawInt32(pRaw, dataPos, pObj->v32);
  dataPos += sizeof(pObj->v32);
  sdbSetRawInt64(pRaw, dataPos, pObj->v64);
  dataPos += sizeof(pObj->v64);
S
Shengliang Guan 已提交
76 77
  sdbSetRawBinary(pRaw, dataPos, pObj->vstr, sizeof(pObj->vstr));
  dataPos += sizeof(pObj->vstr);
S
Shengliang Guan 已提交
78 79 80
  sdbSetRawDataLen(pRaw, dataPos);

  return pRaw;
S
Shengliang Guan 已提交
81 82
}

S
Shengliang Guan 已提交
83 84 85 86
SSdbRow *strDecode(SSdbRaw *pRaw) {
  int8_t sver = 0;
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) return NULL;
  if (sver != 1) return NULL;
S
Shengliang Guan 已提交
87

S
Shengliang Guan 已提交
88 89 90 91 92 93 94 95
  SSdbRow *pRow = sdbAllocRow(sizeof(SStrObj));
  if (pRow == NULL) return NULL;

  SStrObj *pObj = (SStrObj *)sdbGetRowObj(pRow);
  if (pObj == NULL) return NULL;

  int32_t dataPos = 0;
  sdbGetRawBinary(pRaw, dataPos, pObj->key, sizeof(pObj->key));
S
Shengliang Guan 已提交
96
  dataPos += sizeof(pObj->key);
S
Shengliang Guan 已提交
97
  sdbGetRawInt8(pRaw, dataPos, &pObj->v8);
S
Shengliang Guan 已提交
98
  dataPos += sizeof(pObj->v8);
S
Shengliang Guan 已提交
99
  sdbGetRawInt16(pRaw, dataPos, &pObj->v16);
S
Shengliang Guan 已提交
100
  dataPos += sizeof(pObj->v16);
S
Shengliang Guan 已提交
101
  sdbGetRawInt32(pRaw, dataPos, &pObj->v32);
S
Shengliang Guan 已提交
102
  dataPos += sizeof(pObj->v32);
S
Shengliang Guan 已提交
103
  sdbGetRawInt64(pRaw, dataPos, &pObj->v64);
S
Shengliang Guan 已提交
104
  dataPos += sizeof(pObj->v64);
S
Shengliang Guan 已提交
105 106
  sdbGetRawBinary(pRaw, dataPos, pObj->vstr, sizeof(pObj->vstr));
  dataPos += sizeof(pObj->vstr);
S
Shengliang Guan 已提交
107

S
Shengliang Guan 已提交
108
  return pRow;
S
Shengliang Guan 已提交
109 110
}

S
Shengliang Guan 已提交
111 112 113 114 115 116 117 118 119
int32_t strInsert(SSdb *pSdb, SStrObj *pObj) { return 0; }

int32_t strDelete(SSdb *pSdb, SStrObj *pObj, bool callFunc) { return 0; }

int32_t strUpdate(SSdb *pSdb, SStrObj *pOld, SStrObj *pNew) {
  pOld->v8 = pNew->v8;
  pOld->v16 = pNew->v16;
  pOld->v32 = pNew->v32;
  pOld->v64 = pNew->v64;
S
Shengliang Guan 已提交
120
  strcpy(pOld->vstr, pNew->vstr);
S
Shengliang Guan 已提交
121 122 123
  return 0;
}

S
Shengliang Guan 已提交
124 125 126 127 128 129 130 131 132 133
void strSetDefault(SStrObj *pObj, int32_t index) {
  memset(pObj, 0, sizeof(SStrObj));
  snprintf(pObj->key, sizeof(pObj->key), "k%d", index * 1000);
  pObj->v8 = index;
  pObj->v16 = index;
  pObj->v32 = index * 1000;
  pObj->v64 = index * 1000;
  snprintf(pObj->vstr, sizeof(pObj->vstr), "v%d", index * 1000);
}

S
Shengliang Guan 已提交
134
int32_t strDefault(SMnode *pMnode) {
S
Shengliang Guan 已提交
135 136 137 138 139 140 141 142 143 144
  SStrObj  strObj;
  SSdbRaw *pRaw = NULL;

  strSetDefault(&strObj, 1);
  pRaw = strEncode(&strObj);
  sdbSetRawStatus(pRaw, SDB_STATUS_READY);
  if (sdbWrite(pMnode->pSdb, pRaw) != 0) return -1;

  strSetDefault(&strObj, 2);
  pRaw = strEncode(&strObj);
S
Shengliang Guan 已提交
145
  sdbSetRawStatus(pRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
146 147 148 149 150 151 152 153 154 155 156
  if (sdbWriteWithoutFree(pMnode->pSdb, pRaw) != 0) return -1;
  sdbFreeRaw(pRaw);

  return 0;
}

bool sdbTraverseSucc1(SMnode *pMnode, SStrObj *pObj, int32_t *p1, int32_t *p2, int32_t *p3) {
  if (pObj->v8 == 1) {
    *p1 = *p2 + *p3 + pObj->v8;
  }
  return true;
S
Shengliang Guan 已提交
157 158
}

S
Shengliang Guan 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
bool sdbTraverseSucc2(SMnode *pMnode, SStrObj *pObj, int32_t *p1, int32_t *p2, int32_t *p3) {
  *p1 = *p2 + *p3 + pObj->v8;
  return true;
}

bool sdbTraverseFail(SMnode *pMnode, SStrObj *pObj, int32_t *p1, int32_t *p2, int32_t *p3) {
  *p1 = *p2 + *p3;
  return false;
}

TEST_F(MndTestSdb, 01_Write) {
  void    *pIter;
  int32_t  num;
  SStrObj *pObj;
  SMnode   mnode;
  SSdb    *pSdb;
  SSdbOpt  opt = {0};
  int32_t  p1 = 0;
  int32_t  p2 = 111;
  int32_t  p3 = 222;

S
Shengliang Guan 已提交
180 181 182
  mnode.v100 = 100;
  mnode.v200 = 200;
  opt.pMnode = &mnode;
S
Shengliang Guan 已提交
183
  opt.path = "/tmp/mnode_test_sdb";
S
Shengliang Guan 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
  taosRemoveDir(opt.path);

  SSdbTable strTable = {
      .sdbType = SDB_USER,
      .keyType = SDB_KEY_BINARY,
      .deployFp = (SdbDeployFp)strDefault,
      .encodeFp = (SdbEncodeFp)strEncode,
      .decodeFp = (SdbDecodeFp)strDecode,
      .insertFp = (SdbInsertFp)strInsert,
      .updateFp = (SdbUpdateFp)strUpdate,
      .deleteFp = (SdbDeleteFp)strDelete,
  };

  pSdb = sdbInit(&opt);
  mnode.pSdb = pSdb;

  ASSERT_NE(pSdb, nullptr);
  ASSERT_EQ(sdbSetTable(pSdb, strTable), 0);
  ASSERT_EQ(sdbDeploy(pSdb), 0);
#if 0
  pObj = (SStrObj *)sdbAcquire(pSdb, SDB_USER, "k1000");
  ASSERT_NE(pObj, nullptr);
  EXPECT_STREQ(pObj->key, "k1000");
  EXPECT_STREQ(pObj->vstr, "v1000");
  EXPECT_EQ(pObj->v8, 1);
  EXPECT_EQ(pObj->v16, 1);
  EXPECT_EQ(pObj->v32, 1000);
  EXPECT_EQ(pObj->v64, 1000);
  sdbRelease(pSdb, pObj);

  pObj = (SStrObj *)sdbAcquire(pSdb, SDB_USER, "k2000");
  ASSERT_NE(pObj, nullptr);
  EXPECT_STREQ(pObj->key, "k2000");
  EXPECT_STREQ(pObj->vstr, "v2000");
  EXPECT_EQ(pObj->v8, 2);
  EXPECT_EQ(pObj->v16, 2);
  EXPECT_EQ(pObj->v32, 2000);
  EXPECT_EQ(pObj->v64, 2000);
  sdbRelease(pSdb, pObj);

  pObj = (SStrObj *)sdbAcquire(pSdb, SDB_USER, "k200");
  ASSERT_EQ(pObj, nullptr);

  pIter = NULL;
  num = 0;
  do {
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pObj);
    if (pIter == NULL) break;
    ASSERT_NE(pObj, nullptr);
    num++;
    sdbRelease(pSdb, pObj);
  } while (1);
  EXPECT_EQ(num, 2);

  do {
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pObj);
    if (pIter == NULL) break;
    if (strcmp(pObj->key, "k1000") == 0) {
      sdbCancelFetch(pSdb, pIter);
      break;
    }
  } while (1);
  EXPECT_STREQ(pObj->key, "k1000");

  p1 = 0;
  p2 = 111;
  p3 = 222;
  sdbTraverse(pSdb, SDB_USER, (sdbTraverseFp)sdbTraverseSucc2, &p1, &p2, &p3);
  EXPECT_EQ(p1, 334);

  p1 = 0;
  p2 = 111;
  p3 = 222;
  sdbTraverse(pSdb, SDB_USER, (sdbTraverseFp)sdbTraverseSucc2, &p1, &p2, &p3);
  EXPECT_EQ(p1, 669);

  p1 = 0;
  p2 = 111;
  p3 = 222;
  sdbTraverse(pSdb, SDB_USER, (sdbTraverseFp)sdbTraverseFail, &p1, &p2, &p3);
  EXPECT_EQ(p1, 333);
S
Shengliang Guan 已提交
265

S
Shengliang Guan 已提交
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
  EXPECT_EQ(sdbGetSize(pSdb, SDB_USER), 2);
  EXPECT_EQ(sdbGetMaxId(pSdb, SDB_USER), -1);
  EXPECT_EQ(sdbGetTableVer(pSdb, SDB_USER), 2);
  EXPECT_EQ(sdbUpdateVer(pSdb, 0), 2);
  EXPECT_EQ(sdbUpdateVer(pSdb, 1), 3);
  EXPECT_EQ(sdbUpdateVer(pSdb, -1), 2);

  // insert, call func

  // update, call func

  // delete, call func 2

  // write version

  // sdb Write ver

  // sdbRead
#endif
  ASSERT_EQ(sdbWriteFile(pSdb), 0);
  sdbCleanup(pSdb);
}

TEST_F(MndTestSdb, 01_Read) {
  void    *pIter;
  int32_t  num;
  SStrObj *pObj;
  SMnode   mnode;
  SSdb    *pSdb;
  SSdbOpt  opt = {0};
  int32_t  p1 = 0;
  int32_t  p2 = 111;
  int32_t  p3 = 222;

  mnode.v100 = 100;
  mnode.v200 = 200;
  opt.pMnode = &mnode;
  opt.path = "/tmp/mnode_test_sdb";
  taosRemoveDir(opt.path);
S
Shengliang Guan 已提交
305

S
Shengliang Guan 已提交
306 307 308
  SSdbTable strTable = {
      .sdbType = SDB_USER,
      .keyType = SDB_KEY_BINARY,
S
Shengliang Guan 已提交
309
      .deployFp = (SdbDeployFp)strDefault,
S
Shengliang Guan 已提交
310 311 312 313 314
      .encodeFp = (SdbEncodeFp)strEncode,
      .decodeFp = (SdbDecodeFp)strDecode,
      .insertFp = (SdbInsertFp)strInsert,
      .updateFp = (SdbUpdateFp)strDelete,
      .deleteFp = (SdbDeleteFp)strUpdate,
S
Shengliang Guan 已提交
315
  };
S
Shengliang Guan 已提交
316

S
Shengliang Guan 已提交
317 318
  pSdb = sdbInit(&opt);
  mnode.pSdb = pSdb;
S
Shengliang Guan 已提交
319

S
Shengliang Guan 已提交
320
  ASSERT_EQ(sdbReadFile(pSdb), 0);
S
Shengliang Guan 已提交
321
  sdbCleanup(pSdb);
S
Shengliang Guan 已提交
322
}