util_test.cpp 11.2 KB
Newer Older
G
groot 已提交
1 2 3 4 5 6
////////////////////////////////////////////////////////////////////////////////
// Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
// Unauthorized copying of this file, via any medium is strictly prohibited.
// Proprietary and confidential.
////////////////////////////////////////////////////////////////////////////////
#include <gtest/gtest.h>
G
groot 已提交
7
#include <thread>
G
groot 已提交
8
#include <easylogging++.h>
H
Heisenberg 已提交
9 10 11
#include <sys/types.h>
#include <sys/stat.h>
#include <boost/filesystem.hpp>
G
groot 已提交
12

G
groot 已提交
13 14
#include "utils/CommonUtil.h"
#include "utils/Error.h"
G
groot 已提交
15
#include "utils/StringHelpFunctions.h"
G
groot 已提交
16 17
#include "utils/TimeRecorder.h"
#include "utils/BlockingQueue.h"
G
groot 已提交
18
#include "utils/LogUtil.h"
G
groot 已提交
19 20
#include "utils/ValidationUtil.h"
#include "db/engine/ExecutionEngine.h"
G
groot 已提交
21

J
jinhai 已提交
22
using namespace zilliz::milvus;
G
groot 已提交
23

G
groot 已提交
24
namespace {
G
groot 已提交
25

J
jinhai 已提交
26
static const char* LOG_FILE_PATH = "./milvus/conf/log_config.conf";
G
groot 已提交
27

G
groot 已提交
28 29
}

G
groot 已提交
30 31
TEST(UtilTest, EXCEPTION_TEST) {
    std::string err_msg = "failed";
G
groot 已提交
32 33
    server::ServerException ex(SERVER_UNEXPECTED_ERROR, err_msg);
    ASSERT_EQ(ex.error_code(), SERVER_UNEXPECTED_ERROR);
G
groot 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47
    std::string msg = ex.what();
    ASSERT_EQ(msg, err_msg);
}

TEST(UtilTest, COMMON_TEST) {
    unsigned long total_mem = 0, free_mem = 0;
    server::CommonUtil::GetSystemMemInfo(total_mem, free_mem);
    ASSERT_GT(total_mem, 0);
    ASSERT_GT(free_mem, 0);

    unsigned int thread_cnt = 0;
    server::CommonUtil::GetSystemAvailableThreads(thread_cnt);
    ASSERT_GT(thread_cnt, 0);

G
groot 已提交
48 49 50
    std::string path1 = "/tmp/milvus_test/";
    std::string path2 = path1 + "common_test_12345/";
    std::string path3 = path2 + "abcdef";
G
groot 已提交
51 52
    ErrorCode err = server::CommonUtil::CreateDirectory(path3);
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
53 54
    //test again
    err = server::CommonUtil::CreateDirectory(path3);
G
groot 已提交
55
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
56

G
groot 已提交
57
    ASSERT_TRUE(server::CommonUtil::IsDirectoryExist(path3));
G
groot 已提交
58

G
groot 已提交
59
    err = server::CommonUtil::DeleteDirectory(path1);
G
groot 已提交
60
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
61
    //test again
G
groot 已提交
62
    err = server::CommonUtil::DeleteDirectory(path1);
G
groot 已提交
63
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
64

G
groot 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
    ASSERT_FALSE(server::CommonUtil::IsDirectoryExist(path1));
    ASSERT_FALSE(server::CommonUtil::IsFileExist(path1));

    std::string exe_path = server::CommonUtil::GetExePath();
    ASSERT_FALSE(exe_path.empty());

    time_t tt;
    time( &tt );
    tm time_struct;
    memset(&time_struct, 0, sizeof(tm));
    server::CommonUtil::ConvertTime(tt, time_struct);
    ASSERT_GT(time_struct.tm_year, 0);
    ASSERT_GT(time_struct.tm_mon, 0);
    ASSERT_GT(time_struct.tm_mday, 0);
    server::CommonUtil::ConvertTime(time_struct, tt);
    ASSERT_GT(tt, 0);

    bool res = server::CommonUtil::TimeStrToTime("2019-03-23", tt, time_struct);
    ASSERT_EQ(time_struct.tm_year, 119);
    ASSERT_EQ(time_struct.tm_mon, 2);
    ASSERT_EQ(time_struct.tm_mday, 23);
    ASSERT_GT(tt, 0);
    ASSERT_TRUE(res);
G
groot 已提交
88 89 90 91 92 93 94
}

TEST(UtilTest, STRINGFUNCTIONS_TEST) {
    std::string str = " test zilliz";
    server::StringHelpFunctions::TrimStringBlank(str);
    ASSERT_EQ(str, "test zilliz");

G
groot 已提交
95 96 97 98
    str = "\"test zilliz\"";
    server::StringHelpFunctions::TrimStringQuote(str, "\"");
    ASSERT_EQ(str, "test zilliz");

G
groot 已提交
99 100
    str = "a,b,c";
    std::vector<std::string> result;
G
groot 已提交
101 102
    ErrorCode err = server::StringHelpFunctions::SplitStringByDelimeter(str , ",", result);
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
103 104 105 106
    ASSERT_EQ(result.size(), 3UL);

    result.clear();
    err = server::StringHelpFunctions::SplitStringByQuote(str , ",", "\"", result);
G
groot 已提交
107
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
108 109 110 111
    ASSERT_EQ(result.size(), 3UL);

    result.clear();
    err = server::StringHelpFunctions::SplitStringByQuote(str , ",", "", result);
G
groot 已提交
112
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
113 114 115 116
    ASSERT_EQ(result.size(), 3UL);

    str = "55,\"aa,gg,yy\",b";
    result.clear();
G
groot 已提交
117
    err = server::StringHelpFunctions::SplitStringByQuote(str , ",", "\"", result);
G
groot 已提交
118
    ASSERT_EQ(err, SERVER_SUCCESS);
G
groot 已提交
119
    ASSERT_EQ(result.size(), 3UL);
G
groot 已提交
120 121


G
groot 已提交
122 123 124 125 126 127 128 129 130 131 132
}

TEST(UtilTest, BLOCKINGQUEUE_TEST) {
    server::BlockingQueue<std::string> bq;

    static const size_t count = 10;
    bq.SetCapacity(count);

    for(size_t i = 1; i <= count; i++) {
        std::string id = "No." + std::to_string(i);
        bq.Put(id);
G
groot 已提交
133 134
    }

G
groot 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148
    ASSERT_EQ(bq.Size(), count);
    ASSERT_FALSE(bq.Empty());

    std::string str = bq.Front();
    ASSERT_EQ(str, "No.1");

    str = bq.Back();
    ASSERT_EQ(str, "No." + std::to_string(count));

    for(size_t i = 1; i <= count; i++) {
        std::string id = "No." + std::to_string(i);
        str = bq.Take();
        ASSERT_EQ(id, str);
    }
G
groot 已提交
149 150

    ASSERT_EQ(bq.Size(), 0);
G
groot 已提交
151 152
}

G
groot 已提交
153 154 155 156
TEST(UtilTest, LOG_TEST) {
    int32_t res = server::InitLog(LOG_FILE_PATH);
    ASSERT_EQ(res, 0);

G
groot 已提交
157 158 159
    EXPECT_FALSE(el::Loggers::hasFlag(el::LoggingFlag::NewLineForContainer));
    EXPECT_FALSE(el::Loggers::hasFlag(el::LoggingFlag::LogDetailedCrashReason));

G
groot 已提交
160 161 162
    std::string fname = server::GetFileName(LOG_FILE_PATH);
    ASSERT_EQ(fname, "log_config.conf");
}
G
groot 已提交
163

G
groot 已提交
164 165 166 167 168 169 170 171 172 173 174
TEST(UtilTest, TIMERECORDER_TEST) {
    for(int64_t log_level = 0; log_level <= 6; log_level++) {
        if(log_level == 5) {
            continue; //skip fatal
        }
        server::TimeRecorder rc("time", log_level);
        rc.RecordSection("end");
    }
}

TEST(ValidationUtilTest, VALIDATE_TABLENAME_TEST) {
G
groot 已提交
175
    std::string table_name = "Normal123_";
G
groot 已提交
176 177
    ErrorCode res = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(res, SERVER_SUCCESS);
G
groot 已提交
178 179 180

    table_name = "12sds";
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
181
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
182 183 184

    table_name = "";
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
185
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
186 187 188

    table_name = "_asdasd";
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
189
    ASSERT_EQ(res, SERVER_SUCCESS);
G
groot 已提交
190 191 192

    table_name = "!@#!@";
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
193
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
194

G
groot 已提交
195
    table_name = "_!@#!@";
G
groot 已提交
196
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
197
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
198

G
groot 已提交
199 200
    table_name = "中文";
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
201
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
202

G
groot 已提交
203
    table_name = std::string(10000, 'a');
G
groot 已提交
204
    res = server::ValidationUtil::ValidateTableName(table_name);
G
groot 已提交
205
    ASSERT_EQ(res, SERVER_INVALID_TABLE_NAME);
G
groot 已提交
206 207
}

G
groot 已提交
208
TEST(ValidationUtilTest, VALIDATE_DIMENSION_TEST) {
G
groot 已提交
209 210 211 212 213
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(-1), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(0), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(16385), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(16384), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(1), SERVER_SUCCESS);
G
groot 已提交
214 215
}

G
groot 已提交
216
TEST(ValidationUtilTest, VALIDATE_INDEX_TEST) {
G
groot 已提交
217
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType((int)engine::EngineType::INVALID), SERVER_INVALID_INDEX_TYPE);
G
groot 已提交
218
    for(int i = 1; i <= (int)engine::EngineType::MAX_VALUE; i++) {
G
groot 已提交
219
        ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType(i), SERVER_SUCCESS);
G
groot 已提交
220
    }
G
groot 已提交
221
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType((int)engine::EngineType::MAX_VALUE + 1), SERVER_INVALID_INDEX_TYPE);
G
groot 已提交
222

G
groot 已提交
223 224
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexNlist(0), SERVER_INVALID_INDEX_NLIST);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexNlist(100), SERVER_SUCCESS);
G
groot 已提交
225

G
groot 已提交
226 227
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexFileSize(0), SERVER_INVALID_INDEX_FILE_SIZE);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexFileSize(100), SERVER_SUCCESS);
G
groot 已提交
228

G
groot 已提交
229 230 231
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(0), SERVER_INVALID_INDEX_METRIC_TYPE);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(1), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(2), SERVER_SUCCESS);
G
groot 已提交
232 233
}

G
groot 已提交
234
TEST(ValidationUtilTest, VALIDATE_TOPK_TEST) {
235
    engine::meta::TableSchema schema;
G
groot 已提交
236 237 238
    ASSERT_EQ(server::ValidationUtil::ValidateSearchTopk(10, schema), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchTopk(65536, schema), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchTopk(0, schema), SERVER_SUCCESS);
239 240
}

G
groot 已提交
241
TEST(ValidationUtilTest, VALIDATE_NPROBE_TEST) {
242 243
    engine::meta::TableSchema schema;
    schema.nlist_ = 100;
G
groot 已提交
244 245 246
    ASSERT_EQ(server::ValidationUtil::ValidateSearchNprobe(10, schema), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchNprobe(0, schema), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchNprobe(101, schema), SERVER_SUCCESS);
247 248
}

G
groot 已提交
249
TEST(ValidationUtilTest, VALIDATE_GPU_TEST) {
G
groot 已提交
250 251
    ASSERT_EQ(server::ValidationUtil::ValidateGpuIndex(0), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateGpuIndex(100), SERVER_SUCCESS);
G
groot 已提交
252 253

    size_t memory = 0;
G
groot 已提交
254 255
    ASSERT_EQ(server::ValidationUtil::GetGpuMemory(0, memory), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::GetGpuMemory(100, memory), SERVER_SUCCESS);
G
groot 已提交
256 257
}

G
groot 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
TEST(ValidationUtilTest, VALIDATE_IPADDRESS_TEST) {
    ASSERT_EQ(server::ValidationUtil::ValidateIpAddress("127.0.0.1"), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateIpAddress("not ip"), SERVER_SUCCESS);
}

TEST(ValidationUtilTest, VALIDATE_NUMBER_TEST) {
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsNumber("1234"), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateStringIsNumber("not number"), SERVER_SUCCESS);
}

TEST(ValidationUtilTest, VALIDATE_BOOL_TEST) {
    std::string str = "true";
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsBool(str), SERVER_SUCCESS);
    str = "not bool";
    ASSERT_NE(server::ValidationUtil::ValidateStringIsBool(str), SERVER_SUCCESS);
}

TEST(ValidationUtilTest, VALIDATE_DOUBLE_TEST) {
    double ret = 0.0;
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsDouble("2.5", ret), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateStringIsDouble("not double", ret), SERVER_SUCCESS);
}

TEST(ValidationUtilTest, VALIDATE_DBURI_TEST) {
    ASSERT_EQ(server::ValidationUtil::ValidateDbURI("sqlite://:@:/"), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("xxx://:@:/"), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("not uri"), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateDbURI("mysql://root:123456@127.0.0.1:3303/milvus"), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("mysql://root:123456@127.0.0.1:port/milvus"), SERVER_SUCCESS);
G
groot 已提交
287
}
H
Heisenberg 已提交
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314

TEST(UtilTest, ROLLOUTHANDLER_TEST){
    std::string dir1 = "/tmp/milvus_test";
    std::string dir2 = "/tmp/milvus_test/log_test";
    std::string filename[6] = {"log_global.log", "log_debug.log", "log_warning.log", "log_trace.log", "log_error.log", "log_fatal.log"};

    mkdir(dir1.c_str(), S_IRWXU);
    mkdir(dir2.c_str(), S_IRWXU);
    for (int i = 0; i < 6; ++i) {
        std::string tmp = dir2 + "/" + filename[i];

        std::ofstream file;
        file.open(tmp.c_str());
        file << "zilliz" << std::endl;

        server::RolloutHandler(tmp.c_str(), 0);

        tmp.append(".1");
        std::ifstream file2;
        file2.open(tmp);

        std::string tmp2;
        file2 >> tmp2;
        ASSERT_EQ(tmp2, "zilliz");
    }
    boost::filesystem::remove_all(dir2);
}