commit
9d444ace45
|
@ -29,6 +29,12 @@ TARGET_LINK_LIBRARIES(
|
||||||
# PUBLIC os util common transport monitor parser catalog scheduler function gtest taos_static qcom executor
|
# PUBLIC os util common transport monitor parser catalog scheduler function gtest taos_static qcom executor
|
||||||
#)
|
#)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(userOperTest ../../../tests/script/api/passwdTest.c)
|
||||||
|
TARGET_LINK_LIBRARIES(
|
||||||
|
userOperTest
|
||||||
|
PUBLIC taos
|
||||||
|
)
|
||||||
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(
|
TARGET_INCLUDE_DIRECTORIES(
|
||||||
clientTest
|
clientTest
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/client/"
|
PUBLIC "${TD_SOURCE_DIR}/include/client/"
|
||||||
|
@ -69,3 +75,8 @@ add_test(
|
||||||
# NAME clientMonitorTest
|
# NAME clientMonitorTest
|
||||||
# COMMAND clientMonitorTest
|
# COMMAND clientMonitorTest
|
||||||
# )
|
# )
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME userOperTest
|
||||||
|
COMMAND userOperTest
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import subprocess
|
||||||
|
from frame.log import *
|
||||||
|
from frame.cases import *
|
||||||
|
from frame.sql import *
|
||||||
|
from frame.caseBase import *
|
||||||
|
from frame.epath import *
|
||||||
|
from frame import *
|
||||||
|
|
||||||
|
class TDTestCase(TBase):
|
||||||
|
def apiPath(self):
|
||||||
|
apiPath = None
|
||||||
|
currentFilePath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
if (os.sep.join(["community", "tests"]) in currentFilePath):
|
||||||
|
testFilePath = currentFilePath[:currentFilePath.find(os.sep.join(["community", "tests"]))]
|
||||||
|
else:
|
||||||
|
testFilePath = currentFilePath[:currentFilePath.find(os.sep.join(["TDengine", "tests"]))]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(testFilePath):
|
||||||
|
if ("passwdTest.c" in files):
|
||||||
|
apiPath = root
|
||||||
|
break
|
||||||
|
return apiPath
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
apiPath = self.apiPath()
|
||||||
|
tdLog.info(f"api path: {apiPath}")
|
||||||
|
if platform.system().lower() == 'linux':
|
||||||
|
p = subprocess.Popen(f"cd {apiPath} && make", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
out, err = p.communicate()
|
||||||
|
if 0 != p.returncode:
|
||||||
|
tdLog.exit("Test script passwdTest.c make failed")
|
||||||
|
|
||||||
|
p = subprocess.Popen(f"ls {apiPath}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
out, err = p.communicate()
|
||||||
|
tdLog.info(f"test files: {out}")
|
||||||
|
if apiPath:
|
||||||
|
test_file_cmd = os.sep.join([apiPath, "passwdTest localhost"])
|
||||||
|
try:
|
||||||
|
p = subprocess.Popen(test_file_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
out, err = p.communicate()
|
||||||
|
if 0 != p.returncode:
|
||||||
|
tdLog.exit("Failed to run passwd test with output: %s \n error: %s" % (out, err))
|
||||||
|
else:
|
||||||
|
tdLog.info(out)
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
except Exception as e:
|
||||||
|
tdLog.exit(f"Failed to execute {__file__} with error: {e}")
|
||||||
|
else:
|
||||||
|
tdLog.exit("passwdTest.c not found")
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -44,6 +44,7 @@
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f storage/compressBasic.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f storage/compressBasic.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f grant/grantBugs.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f grant/grantBugs.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f query/queryBugs.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f query/queryBugs.py -N 3
|
||||||
|
,,n,army,python3 ./test.py -f user/test_passwd.py
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f tmq/tmqBugs.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f tmq/tmqBugs.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_compare_asc_desc.py
|
,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_compare_asc_desc.py
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f query/last/test_last.py
|
,,y,army,./pytest.sh python3 ./test.py -f query/last/test_last.py
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f query/sys/tb_perf_queries_exist_test.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f query/sys/tb_perf_queries_exist_test.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f query/test_having.py
|
,,y,army,./pytest.sh python3 ./test.py -f query/test_having.py
|
||||||
,,n,army,python3 ./test.py -f tmq/drop_lost_comsumers.py
|
,,n,army,python3 ./test.py -f tmq/drop_lost_comsumers.py
|
||||||
|
|
||||||
#
|
#
|
||||||
# system test
|
# system test
|
||||||
#
|
#
|
||||||
|
|
|
@ -13,7 +13,7 @@ all: $(TARGET)
|
||||||
|
|
||||||
exe:
|
exe:
|
||||||
gcc $(CFLAGS) ./batchprepare.c -o $(ROOT)batchprepare $(LFLAGS)
|
gcc $(CFLAGS) ./batchprepare.c -o $(ROOT)batchprepare $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt2-test.c -o $(ROOT)stmt2-test $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt2-test.c -o $(ROOT)stmt2-test $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stopquery.c -o $(ROOT)stopquery $(LFLAGS)
|
gcc $(CFLAGS) ./stopquery.c -o $(ROOT)stopquery $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./dbTableRoute.c -o $(ROOT)dbTableRoute $(LFLAGS)
|
gcc $(CFLAGS) ./dbTableRoute.c -o $(ROOT)dbTableRoute $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./insertSameTs.c -o $(ROOT)insertSameTs $(LFLAGS)
|
gcc $(CFLAGS) ./insertSameTs.c -o $(ROOT)insertSameTs $(LFLAGS)
|
||||||
|
@ -22,11 +22,11 @@ exe:
|
||||||
gcc $(CFLAGS) ./insert_stb.c -o $(ROOT)insert_stb $(LFLAGS)
|
gcc $(CFLAGS) ./insert_stb.c -o $(ROOT)insert_stb $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./tmqViewTest.c -o $(ROOT)tmqViewTest $(LFLAGS)
|
gcc $(CFLAGS) ./tmqViewTest.c -o $(ROOT)tmqViewTest $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmtQuery.c -o $(ROOT)stmtQuery $(LFLAGS)
|
gcc $(CFLAGS) ./stmtQuery.c -o $(ROOT)stmtQuery $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt.c -o $(ROOT)stmt $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt.c -o $(ROOT)stmt $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt2.c -o $(ROOT)stmt2 $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt2.c -o $(ROOT)stmt2 $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt2-example.c -o $(ROOT)stmt2-example $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt2-example.c -o $(ROOT)stmt2-example $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt2-get-fields.c -o $(ROOT)stmt2-get-fields $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt2-get-fields.c -o $(ROOT)stmt2-get-fields $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt2-nohole.c -o $(ROOT)stmt2-nohole $(LFLAGS)
|
# gcc $(CFLAGS) ./stmt2-nohole.c -o $(ROOT)stmt2-nohole $(LFLAGS)
|
||||||
gcc $(CFLAGS) ./stmt-crash.c -o $(ROOT)stmt-crash $(LFLAGS)
|
gcc $(CFLAGS) ./stmt-crash.c -o $(ROOT)stmt-crash $(LFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Makefile.mak for win64
|
||||||
|
|
||||||
|
TARGET = passwdTest.exe
|
||||||
|
CC = cl
|
||||||
|
CFLAGS = /W4 /EHsc /I"C:\TDengine\include" /DWINDOWS
|
||||||
|
LDFLAGS = /link /LIBPATH:"C:\TDengine\driver" taos.lib
|
||||||
|
|
||||||
|
SRCS = passwdTest.c
|
||||||
|
OBJS = $(SRCS:.c=.obj)
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
$(CC) $(OBJS) $(LDFLAGS)
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
$(CC) $(CFLAGS) /c $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
del $(OBJS) $(TARGET)
|
|
@ -20,12 +20,27 @@
|
||||||
* passwdTest.c
|
* passwdTest.c
|
||||||
* - Run the test case in clear TDengine environment with default root passwd 'taosdata'
|
* - Run the test case in clear TDengine environment with default root passwd 'taosdata'
|
||||||
*/
|
*/
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef PRId64
|
||||||
|
#define PRId64 "I64d"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PRIu64
|
||||||
|
#define PRIu64 "I64u"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include "taos.h" // TAOS header file
|
#include "taos.h" // TAOS header file
|
||||||
|
|
||||||
#define nDup 1
|
#define nDup 1
|
||||||
|
@ -50,6 +65,16 @@ void sysInfoTest(TAOS *taos, const char *host, char *qstr);
|
||||||
void userDroppedTest(TAOS *taos, const char *host, char *qstr);
|
void userDroppedTest(TAOS *taos, const char *host, char *qstr);
|
||||||
void clearTestEnv(TAOS *taos, const char *host, char *qstr);
|
void clearTestEnv(TAOS *taos, const char *host, char *qstr);
|
||||||
|
|
||||||
|
void taosMsleep(int64_t ms) {
|
||||||
|
if (ms < 0) return;
|
||||||
|
#ifdef WINDOWS
|
||||||
|
Sleep(ms);
|
||||||
|
#else
|
||||||
|
usleep(ms * 1000);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nPassVerNotified = 0;
|
int nPassVerNotified = 0;
|
||||||
int nUserDropped = 0;
|
int nUserDropped = 0;
|
||||||
TAOS *taosu[nRoot] = {0};
|
TAOS *taosu[nRoot] = {0};
|
||||||
|
@ -59,7 +84,8 @@ void __taos_notify_cb(void *param, void *ext, int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TAOS_NOTIFY_PASSVER: {
|
case TAOS_NOTIFY_PASSVER: {
|
||||||
++nPassVerNotified;
|
++nPassVerNotified;
|
||||||
printf("%s:%d type:%d user:%s passVer:%d\n", __func__, __LINE__, type, param ? (char *)param : "NULL", *(int *)ext);
|
printf("%s:%d type:%d user:%s passVer:%d\n", __func__, __LINE__, type, param ? (char *)param : "NULL",
|
||||||
|
*(int *)ext);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TAOS_NOTIFY_USER_DROPPED: {
|
case TAOS_NOTIFY_USER_DROPPED: {
|
||||||
|
@ -191,11 +217,11 @@ static int printResult(TAOS_RES *res, char *output) {
|
||||||
printRow(temp, row, fields, numFields);
|
printRow(temp, row, fields, numFields);
|
||||||
puts(temp);
|
puts(temp);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
char qstr[1024];
|
char qstr[1024];
|
||||||
|
|
||||||
// connect to server
|
// connect to server
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("please input server-ip \n");
|
printf("please input server-ip \n");
|
||||||
|
@ -215,6 +241,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
taos_cleanup();
|
taos_cleanup();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void createUsers(TAOS *taos, const char *host, char *qstr) {
|
void createUsers(TAOS *taos, const char *host, char *qstr) {
|
||||||
|
@ -234,6 +261,7 @@ void createUsers(TAOS *taos, const char *host, char *qstr) {
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
fprintf(stderr, "failed to run: taos_set_notify_cb(TAOS_NOTIFY_PASSVER) for user:%s since %d\n", users[i], code);
|
fprintf(stderr, "failed to run: taos_set_notify_cb(TAOS_NOTIFY_PASSVER) for user:%s since %d\n", users[i], code);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "success to run: taos_set_notify_cb(TAOS_NOTIFY_PASSVER) for user:%s\n", users[i]);
|
fprintf(stderr, "success to run: taos_set_notify_cb(TAOS_NOTIFY_PASSVER) for user:%s\n", users[i]);
|
||||||
}
|
}
|
||||||
|
@ -260,6 +288,7 @@ void passVerTestMulti(const char *host, char *qstr) {
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
fprintf(stderr, "failed to run: taos_set_notify_cb since %d\n", code);
|
fprintf(stderr, "failed to run: taos_set_notify_cb since %d\n", code);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "success to run: taos_set_notify_cb\n");
|
fprintf(stderr, "success to run: taos_set_notify_cb\n");
|
||||||
}
|
}
|
||||||
|
@ -283,26 +312,25 @@ void passVerTestMulti(const char *host, char *qstr) {
|
||||||
printf("%s:%d [%d] second(s) elasped, passVer notification received:%d, total:%d\n", __func__, __LINE__, i,
|
printf("%s:%d [%d] second(s) elasped, passVer notification received:%d, total:%d\n", __func__, __LINE__, i,
|
||||||
nPassVerNotified, nConn);
|
nPassVerNotified, nConn);
|
||||||
if (nPassVerNotified >= nConn) break;
|
if (nPassVerNotified >= nConn) break;
|
||||||
sleep(1);
|
taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// close the taos_conn
|
// close the taos_conn
|
||||||
for (int i = 0; i < nRoot; ++i) {
|
for (int i = 0; i < nRoot; ++i) {
|
||||||
taos_close(taos[i]);
|
taos_close(taos[i]);
|
||||||
printf("%s:%d close taos[%d]\n", __func__, __LINE__, i);
|
printf("%s:%d close taos[%d]\n", __func__, __LINE__, i);
|
||||||
// sleep(1);
|
// taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nUser; ++i) {
|
for (int i = 0; i < nUser; ++i) {
|
||||||
taos_close(taosu[i]);
|
taos_close(taosu[i]);
|
||||||
printf("%s:%d close taosu[%d]\n", __func__, __LINE__, i);
|
printf("%s:%d close taosu[%d]\n", __func__, __LINE__, i);
|
||||||
// sleep(1);
|
// taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "######## %s #########\n", __func__);
|
fprintf(stderr, "######## %s #########\n", __func__);
|
||||||
if (nPassVerNotified == nConn) {
|
if (nPassVerNotified == nConn) {
|
||||||
fprintf(stderr, ">>> succeed to get passVer notification since nNotify %d == nConn %d\n", nPassVerNotified,
|
fprintf(stderr, ">>> succeed to get passVer notification since nNotify %d == nConn %d\n", nPassVerNotified, nConn);
|
||||||
nConn);
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, ">>> failed to get passVer notification since nNotify %d != nConn %d\n", nPassVerNotified, nConn);
|
fprintf(stderr, ">>> failed to get passVer notification since nNotify %d != nConn %d\n", nPassVerNotified, nConn);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -337,7 +365,7 @@ void sysInfoTest(TAOS *taosRoot, const char *host, char *qstr) {
|
||||||
TAOS_RES *res = NULL;
|
TAOS_RES *res = NULL;
|
||||||
int32_t nRep = 0;
|
int32_t nRep = 0;
|
||||||
|
|
||||||
_REP:
|
_REP:
|
||||||
fprintf(stderr, "######## %s loop:%d #########\n", __func__, nRep);
|
fprintf(stderr, "######## %s loop:%d #########\n", __func__, nRep);
|
||||||
res = taos_query(taos[0], qstr);
|
res = taos_query(taos[0], qstr);
|
||||||
if (taos_errno(res) != 0) {
|
if (taos_errno(res) != 0) {
|
||||||
|
@ -356,7 +384,7 @@ _REP:
|
||||||
|
|
||||||
fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__);
|
fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__);
|
||||||
for (int i = 1; i <= 2; ++i) {
|
for (int i = 1; i <= 2; ++i) {
|
||||||
sleep(1);
|
taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = taos_query(taos[0], qstr);
|
res = taos_query(taos[0], qstr);
|
||||||
|
@ -372,10 +400,10 @@ _REP:
|
||||||
queryDB(taosRoot, "alter user user0 sysinfo 1");
|
queryDB(taosRoot, "alter user user0 sysinfo 1");
|
||||||
fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__);
|
fprintf(stderr, "%s:%d sleep 2 seconds to wait HB take effect\n", __func__, __LINE__);
|
||||||
for (int i = 1; i <= 2; ++i) {
|
for (int i = 1; i <= 2; ++i) {
|
||||||
sleep(1);
|
taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(++nRep < 5) {
|
if (++nRep < 5) {
|
||||||
goto _REP;
|
goto _REP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,7 +418,7 @@ _REP:
|
||||||
fprintf(stderr, "######## %s #########\n", __func__);
|
fprintf(stderr, "######## %s #########\n", __func__);
|
||||||
}
|
}
|
||||||
static bool isDropUser = true;
|
static bool isDropUser = true;
|
||||||
void userDroppedTest(TAOS *taos, const char *host, char *qstr) {
|
void userDroppedTest(TAOS *taos, const char *host, char *qstr) {
|
||||||
// users
|
// users
|
||||||
int nTestUsers = nUser;
|
int nTestUsers = nUser;
|
||||||
int nLoop = 0;
|
int nLoop = 0;
|
||||||
|
@ -408,6 +436,7 @@ _loop:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
fprintf(stderr, "failed to run: taos_set_notify_cb:%d for user:%s since %d\n", TAOS_NOTIFY_USER_DROPPED, users[i],
|
fprintf(stderr, "failed to run: taos_set_notify_cb:%d for user:%s since %d\n", TAOS_NOTIFY_USER_DROPPED, users[i],
|
||||||
code);
|
code);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "success to run: taos_set_notify_cb:%d for user:%s\n", TAOS_NOTIFY_USER_DROPPED, users[i]);
|
fprintf(stderr, "success to run: taos_set_notify_cb:%d for user:%s\n", TAOS_NOTIFY_USER_DROPPED, users[i]);
|
||||||
}
|
}
|
||||||
|
@ -426,7 +455,7 @@ _loop:
|
||||||
printf("%s:%d [%d] second(s) elasped, user dropped notification received:%d, total:%d\n", __func__, __LINE__, i,
|
printf("%s:%d [%d] second(s) elasped, user dropped notification received:%d, total:%d\n", __func__, __LINE__, i,
|
||||||
nUserDropped, nConn);
|
nUserDropped, nConn);
|
||||||
if (nUserDropped >= nConn) break;
|
if (nUserDropped >= nConn) break;
|
||||||
sleep(1);
|
taosMsleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nTestUsers; ++i) {
|
for (int i = 0; i < nTestUsers; ++i) {
|
||||||
|
|
Loading…
Reference in New Issue