util_test.cpp 13.4 KB
Newer Older
J
jinhai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

18
#include "utils/SignalUtil.h"
G
groot 已提交
19 20
#include "utils/CommonUtil.h"
#include "utils/Error.h"
G
groot 已提交
21
#include "utils/StringHelpFunctions.h"
G
groot 已提交
22 23
#include "utils/TimeRecorder.h"
#include "utils/BlockingQueue.h"
G
groot 已提交
24
#include "utils/LogUtil.h"
G
groot 已提交
25 26
#include "utils/ValidationUtil.h"
#include "db/engine/ExecutionEngine.h"
G
groot 已提交
27

28 29 30 31 32 33
#include <thread>
#include <sys/types.h>
#include <sys/stat.h>
#include <boost/filesystem.hpp>
#include <gtest/gtest.h>

J
jinhai 已提交
34
using namespace zilliz::milvus;
G
groot 已提交
35

G
groot 已提交
36
namespace {
G
groot 已提交
37

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

G
groot 已提交
40 41 42 43
void CopyStatus(Status& st1, Status& st2) {
    st1 = st2;
}

G
groot 已提交
44 45
}

G
groot 已提交
46 47
TEST(UtilTest, EXCEPTION_TEST) {
    std::string err_msg = "failed";
G
groot 已提交
48 49
    server::ServerException ex(SERVER_UNEXPECTED_ERROR, err_msg);
    ASSERT_EQ(ex.error_code(), SERVER_UNEXPECTED_ERROR);
G
groot 已提交
50 51 52 53
    std::string msg = ex.what();
    ASSERT_EQ(msg, err_msg);
}

G
groot 已提交
54 55 56 57
TEST(UtilTest, SIGNAL_TEST) {
    server::SignalUtil::PrintStacktrace();
}

G
groot 已提交
58 59 60 61 62 63 64 65 66 67
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 已提交
68 69 70
    std::string path1 = "/tmp/milvus_test/";
    std::string path2 = path1 + "common_test_12345/";
    std::string path3 = path2 + "abcdef";
G
groot 已提交
71 72
    Status status = server::CommonUtil::CreateDirectory(path3);
    ASSERT_TRUE(status.ok());
G
groot 已提交
73
    //test again
G
groot 已提交
74 75
    status = server::CommonUtil::CreateDirectory(path3);
    ASSERT_TRUE(status.ok());
G
groot 已提交
76

G
groot 已提交
77
    ASSERT_TRUE(server::CommonUtil::IsDirectoryExist(path3));
G
groot 已提交
78

G
groot 已提交
79 80
    status = server::CommonUtil::DeleteDirectory(path1);
    ASSERT_TRUE(status.ok());
G
groot 已提交
81
    //test again
G
groot 已提交
82 83
    status = server::CommonUtil::DeleteDirectory(path1);
    ASSERT_TRUE(status.ok());
G
groot 已提交
84

G
groot 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
    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 已提交
108 109 110 111 112 113 114
}

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

G
groot 已提交
115 116 117 118
    str = "\"test zilliz\"";
    server::StringHelpFunctions::TrimStringQuote(str, "\"");
    ASSERT_EQ(str, "test zilliz");

G
groot 已提交
119 120
    str = "a,b,c";
    std::vector<std::string> result;
G
groot 已提交
121 122
    auto status = server::StringHelpFunctions::SplitStringByDelimeter(str , ",", result);
    ASSERT_TRUE(status.ok());
G
groot 已提交
123 124 125
    ASSERT_EQ(result.size(), 3UL);

    result.clear();
G
groot 已提交
126 127
    status = server::StringHelpFunctions::SplitStringByQuote(str , ",", "\"", result);
    ASSERT_TRUE(status.ok());
G
groot 已提交
128 129 130
    ASSERT_EQ(result.size(), 3UL);

    result.clear();
G
groot 已提交
131 132
    status = server::StringHelpFunctions::SplitStringByQuote(str , ",", "", result);
    ASSERT_TRUE(status.ok());
G
groot 已提交
133 134 135 136
    ASSERT_EQ(result.size(), 3UL);

    str = "55,\"aa,gg,yy\",b";
    result.clear();
G
groot 已提交
137 138
    status = server::StringHelpFunctions::SplitStringByQuote(str , ",", "\"", result);
    ASSERT_TRUE(status.ok());
G
groot 已提交
139
    ASSERT_EQ(result.size(), 3UL);
G
groot 已提交
140 141


G
groot 已提交
142 143 144 145 146 147 148 149 150 151 152
}

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 已提交
153 154
    }

G
groot 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167 168
    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 已提交
169 170

    ASSERT_EQ(bq.Size(), 0);
G
groot 已提交
171 172
}

G
groot 已提交
173
TEST(UtilTest, LOG_TEST) {
G
groot 已提交
174 175
    auto status = server::InitLog(LOG_FILE_PATH);
    ASSERT_TRUE(status.ok());
G
groot 已提交
176

G
groot 已提交
177 178 179
    EXPECT_FALSE(el::Loggers::hasFlag(el::LoggingFlag::NewLineForContainer));
    EXPECT_FALSE(el::Loggers::hasFlag(el::LoggingFlag::LogDetailedCrashReason));

G
groot 已提交
180
    std::string fname = server::CommonUtil::GetFileName(LOG_FILE_PATH);
G
groot 已提交
181 182
    ASSERT_EQ(fname, "log_config.conf");
}
G
groot 已提交
183

G
groot 已提交
184 185 186 187 188
TEST(UtilTest, TIMERECORDER_TEST) {
    for(int64_t log_level = 0; log_level <= 6; log_level++) {
        if(log_level == 5) {
            continue; //skip fatal
        }
G
groot 已提交
189
        TimeRecorder rc("time", log_level);
G
groot 已提交
190 191 192 193
        rc.RecordSection("end");
    }
}

G
groot 已提交
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
TEST(UtilTest, STATUS_TEST) {
    auto status = Status::OK();
    std::string str = status.ToString();
    ASSERT_FALSE(str.empty());

    status = Status(DB_ERROR, "mistake");
    ASSERT_EQ(status.code(), DB_ERROR);
    str = status.ToString();
    ASSERT_FALSE(str.empty());

    status = Status(DB_NOT_FOUND, "mistake");
    ASSERT_EQ(status.code(), DB_NOT_FOUND);
    str = status.ToString();
    ASSERT_FALSE(str.empty());

    status = Status(DB_ALREADY_EXIST, "mistake");
    ASSERT_EQ(status.code(), DB_ALREADY_EXIST);
    str = status.ToString();
    ASSERT_FALSE(str.empty());

    status = Status(DB_META_TRANSACTION_FAILED, "mistake");
    ASSERT_EQ(status.code(), DB_META_TRANSACTION_FAILED);
    str = status.ToString();
    ASSERT_FALSE(str.empty());

    auto status_copy = Status::OK();
    CopyStatus(status_copy, status);
    ASSERT_EQ(status.code(), DB_META_TRANSACTION_FAILED);

    auto status_ref(status);
    ASSERT_EQ(status_ref.code(), status.code());
    ASSERT_EQ(status_ref.ToString(), status.ToString());

    auto status_move = std::move(status);
    ASSERT_EQ(status_move.code(), status_ref.code());
    ASSERT_EQ(status_move.ToString(), status_ref.ToString());
}

G
groot 已提交
232
TEST(ValidationUtilTest, VALIDATE_TABLENAME_TEST) {
G
groot 已提交
233
    std::string table_name = "Normal123_";
G
groot 已提交
234 235
    auto status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_TRUE(status.ok());
G
groot 已提交
236 237

    table_name = "12sds";
G
groot 已提交
238 239
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
240 241

    table_name = "";
G
groot 已提交
242 243
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
244 245

    table_name = "_asdasd";
G
groot 已提交
246 247
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_SUCCESS);
G
groot 已提交
248 249

    table_name = "!@#!@";
G
groot 已提交
250 251
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
252

G
groot 已提交
253
    table_name = "_!@#!@";
G
groot 已提交
254 255
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
256

G
groot 已提交
257
    table_name = "中文";
G
groot 已提交
258 259
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
260

G
groot 已提交
261
    table_name = std::string(10000, 'a');
G
groot 已提交
262 263
    status = server::ValidationUtil::ValidateTableName(table_name);
    ASSERT_EQ(status.code(), SERVER_INVALID_TABLE_NAME);
G
groot 已提交
264 265
}

G
groot 已提交
266
TEST(ValidationUtilTest, VALIDATE_DIMENSION_TEST) {
G
groot 已提交
267 268 269 270 271
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(-1).code(), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(0).code(), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(16385).code(), SERVER_INVALID_VECTOR_DIMENSION);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(16384).code(), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateTableDimension(1).code(), SERVER_SUCCESS);
G
groot 已提交
272 273
}

G
groot 已提交
274
TEST(ValidationUtilTest, VALIDATE_INDEX_TEST) {
G
groot 已提交
275
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType((int)engine::EngineType::INVALID).code(), SERVER_INVALID_INDEX_TYPE);
G
groot 已提交
276
    for(int i = 1; i <= (int)engine::EngineType::MAX_VALUE; i++) {
G
groot 已提交
277
        ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType(i).code(), SERVER_SUCCESS);
G
groot 已提交
278
    }
G
groot 已提交
279
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexType((int)engine::EngineType::MAX_VALUE + 1).code(), SERVER_INVALID_INDEX_TYPE);
G
groot 已提交
280

G
groot 已提交
281 282
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexNlist(0).code(), SERVER_INVALID_INDEX_NLIST);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexNlist(100).code(), SERVER_SUCCESS);
G
groot 已提交
283

G
groot 已提交
284 285
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexFileSize(0).code(), SERVER_INVALID_INDEX_FILE_SIZE);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexFileSize(100).code(), SERVER_SUCCESS);
G
groot 已提交
286

G
groot 已提交
287 288 289
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(0).code(), SERVER_INVALID_INDEX_METRIC_TYPE);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(1).code(), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateTableIndexMetricType(2).code(), SERVER_SUCCESS);
G
groot 已提交
290 291
}

G
groot 已提交
292
TEST(ValidationUtilTest, VALIDATE_TOPK_TEST) {
293
    engine::meta::TableSchema schema;
G
groot 已提交
294 295 296
    ASSERT_EQ(server::ValidationUtil::ValidateSearchTopk(10, schema).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchTopk(65536, schema).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchTopk(0, schema).code(), SERVER_SUCCESS);
297 298
}

G
groot 已提交
299
TEST(ValidationUtilTest, VALIDATE_NPROBE_TEST) {
300 301
    engine::meta::TableSchema schema;
    schema.nlist_ = 100;
G
groot 已提交
302 303 304
    ASSERT_EQ(server::ValidationUtil::ValidateSearchNprobe(10, schema).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchNprobe(0, schema).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateSearchNprobe(101, schema).code(), SERVER_SUCCESS);
305 306
}

G
groot 已提交
307
TEST(ValidationUtilTest, VALIDATE_GPU_TEST) {
G
groot 已提交
308 309
    ASSERT_EQ(server::ValidationUtil::ValidateGpuIndex(0).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateGpuIndex(100).code(), SERVER_SUCCESS);
G
groot 已提交
310 311

    size_t memory = 0;
G
groot 已提交
312 313
    ASSERT_EQ(server::ValidationUtil::GetGpuMemory(0, memory).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::GetGpuMemory(100, memory).code(), SERVER_SUCCESS);
G
groot 已提交
314 315
}

G
groot 已提交
316
TEST(ValidationUtilTest, VALIDATE_IPADDRESS_TEST) {
G
groot 已提交
317 318
    ASSERT_EQ(server::ValidationUtil::ValidateIpAddress("127.0.0.1").code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateIpAddress("not ip").code(), SERVER_SUCCESS);
G
groot 已提交
319 320 321
}

TEST(ValidationUtilTest, VALIDATE_NUMBER_TEST) {
G
groot 已提交
322 323
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsNumber("1234").code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateStringIsNumber("not number").code(), SERVER_SUCCESS);
G
groot 已提交
324 325 326 327
}

TEST(ValidationUtilTest, VALIDATE_BOOL_TEST) {
    std::string str = "true";
G
groot 已提交
328
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsBool(str).code(), SERVER_SUCCESS);
G
groot 已提交
329
    str = "not bool";
G
groot 已提交
330
    ASSERT_NE(server::ValidationUtil::ValidateStringIsBool(str).code(), SERVER_SUCCESS);
G
groot 已提交
331 332 333 334
}

TEST(ValidationUtilTest, VALIDATE_DOUBLE_TEST) {
    double ret = 0.0;
G
groot 已提交
335 336
    ASSERT_EQ(server::ValidationUtil::ValidateStringIsDouble("2.5", ret).code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateStringIsDouble("not double", ret).code(), SERVER_SUCCESS);
G
groot 已提交
337 338 339
}

TEST(ValidationUtilTest, VALIDATE_DBURI_TEST) {
G
groot 已提交
340 341 342 343 344
    ASSERT_EQ(server::ValidationUtil::ValidateDbURI("sqlite://:@:/").code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("xxx://:@:/").code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("not uri").code(), SERVER_SUCCESS);
    ASSERT_EQ(server::ValidationUtil::ValidateDbURI("mysql://root:123456@127.0.0.1:3303/milvus").code(), SERVER_SUCCESS);
    ASSERT_NE(server::ValidationUtil::ValidateDbURI("mysql://root:123456@127.0.0.1:port/milvus").code(), SERVER_SUCCESS);
G
groot 已提交
345
}
H
Heisenberg 已提交
346 347 348 349 350

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"};
351
    el::Level list[6] = {el::Level::Global, el::Level::Debug, el::Level::Warning, el::Level::Trace, el::Level::Error, el::Level::Fatal};
H
Heisenberg 已提交
352 353 354 355 356 357 358 359 360 361

    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;

362
        server::RolloutHandler(tmp.c_str(), 0, list[i]);
H
Heisenberg 已提交
363 364 365 366 367 368 369 370 371 372 373

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

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