polardbxengine/unittest/gunit/xplugin/xpl/document_id_generator_t.cc

166 lines
7.5 KiB
C++

/*
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2.0,
* as published by the Free Software Foundation.
*
* This program is also distributed with certain software (including
* but not limited to OpenSSL) that is licensed under separate terms,
* as designated in a particular file or component or in included license
* documentation. The authors of MySQL hereby grant you an additional
* permission to link the program and your derivative works with the
* separately licensed software that they have included with MySQL.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License, version 2.0, for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <gtest/gtest.h>
#include <limits>
#include <memory>
#include "plugin/x/ngs/include/ngs/document_id_generator.h"
namespace ngs {
namespace test {
class Document_id_generator_test : public ::testing::Test {
public:
Document_id_generator &generator(const uint64_t timestamp,
const uint64_t serial) {
gen.reset(new Document_id_generator(timestamp, serial));
return *gen;
}
std::unique_ptr<Document_id_generator> gen;
};
TEST_F(Document_id_generator_test, generate_id_sequence_1) {
Document_id_generator::Variables vars{0, 1, 1};
generator(0, 0);
EXPECT_STREQ("0000000000000000000000000001", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000002", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000003", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000004", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000005", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000006", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000007", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000008", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000009", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000a", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000b", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000c", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000d", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000e", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000f", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000010", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_5) {
Document_id_generator::Variables vars{0, 1, 5};
generator(0, 0);
EXPECT_STREQ("0000000000000000000000000001", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000006", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000000000000000000b", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000010", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000015", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_16) {
Document_id_generator::Variables vars{0, 1, 16};
generator(0, 0);
EXPECT_STREQ("0000000000000000000000000001", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000011", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000021", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000000000000000000031", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_1_1_serial_limit) {
Document_id_generator::Variables vars{0, 1, 1};
generator(0, std::numeric_limits<uint64_t>::max() - 2);
EXPECT_STREQ("000000000000fffffffffffffffe", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000ffffffffffffffff", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000001", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000002", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_0_1_serial_limit) {
Document_id_generator::Variables vars{0, 0, 1};
generator(0, std::numeric_limits<uint64_t>::max() - 2);
EXPECT_STREQ("000000000000fffffffffffffffe", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000ffffffffffffffff", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000000", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000001", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_1_5_serial_limit) {
Document_id_generator::Variables vars{0, 1, 5};
generator(0, std::numeric_limits<uint64_t>::max() - 2 * 5);
EXPECT_STREQ("000000000000fffffffffffffff6", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000fffffffffffffffb", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000001", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000006", gen->generate(vars).c_str());
}
TEST_F(Document_id_generator_test, generate_id_sequence_0_5_serial_limit) {
Document_id_generator::Variables vars{0, 0, 5};
generator(0, std::numeric_limits<uint64_t>::max() - 2 * 5);
EXPECT_STREQ("000000000000fffffffffffffffa", gen->generate(vars).c_str());
EXPECT_STREQ("000000000000ffffffffffffffff", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000000", gen->generate(vars).c_str());
EXPECT_STREQ("0000000000010000000000000005", gen->generate(vars).c_str());
}
struct Param_document_id {
std::string expect_id;
uint64_t timestamp, serial;
uint16_t prefix, offset, increment;
};
class Document_id_generator_param_test
: public Document_id_generator_test,
public ::testing::WithParamInterface<Param_document_id> {};
TEST_P(Document_id_generator_param_test, generate_id) {
using Variables = Document_id_generator_interface::Variables;
const Param_document_id &param = GetParam();
std::string result;
ASSERT_NO_THROW(result = generator(param.timestamp, param.serial)
.generate(Variables{param.prefix, param.offset,
param.increment}));
EXPECT_EQ(param.expect_id, result);
}
Param_document_id document_id_param[] = {
{"0000000000000000000000000001", 0, 0, 0, 0, 0},
{"0001000000000000000000000001", 0, 0, 1, 0, 0},
{"0000000000010000000000000001", 1, 0, 0, 0, 0},
{"0000000000000000000000000002", 0, 1, 0, 0, 0},
{"0000000000000000000000000002", 0, 1, 0, 0, 1},
{"0000000000000000000000000001", 0, 0, 0, 1, 1},
{"0000000000000000000000000002", 0, 1, 0, 1, 1},
{"0001000000010000000000000002", 1, 1, 1, 1, 1},
{"0000000000000000000000000001", 0, 0, 0, 1, 10},
{"000000000000000000000000000b", 0, 1, 0, 1, 10},
{"000000000000000000000000000b", 0, 2, 0, 1, 10},
{"0000000000000000000000000001", 0, 0, 0, 5, 1}, // offset to big: ignored
{"0000000000000000000000000005", 0, 1, 0, 5, 10},
{"000000000000000000000000000f", 0, 5, 0, 5, 10}};
INSTANTIATE_TEST_CASE_P(document_id_generation,
Document_id_generator_param_test,
testing::ValuesIn(document_id_param));
} // namespace test
} // namespace ngs