Skip to content

Commit

Permalink
extended field validator id test cases
Browse files Browse the repository at this point in the history
Signed-off-by: Mikhail Boldyrev <miboldyrev@gmail.com>
  • Loading branch information
MBoldyrev committed Oct 29, 2019
1 parent 4f99200 commit 94ffdd6
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 94 deletions.
34 changes: 0 additions & 34 deletions test/integration/acceptance/acceptance_fixture.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,40 +186,6 @@ class AcceptanceFixture : public ::testing::Test {
*/
iroha::time::time_t getUniqueTime();

const std::vector<shared_model::interface::types::AssetNameType>
kIllegalAssetNames = {"",
" ",
" ",
"A",
"assetV",
"asSet",
"asset%",
"^123",
"verylongassetname_thenameislonger",
"verylongassetname_thenameislongerthanitshouldbe",
"assset-01"};

const std::vector<shared_model::interface::types::DomainIdType>
kIllegalDomainNames = {
"",
" ",
" ",
"9start.with.digit",
"-startWithDash",
"@.is.not.allowed",
"no space is allowed",
"endWith-",
"label.endedWith-.is.not.allowed",
"aLabelMustNotExceeds63charactersALabelMustNotExceeds63characters",
"maxLabelLengthIs63paddingPaddingPaddingPaddingPaddingPaddingPad."
"maxLabelLengthIs63paddingPaddingPaddingPaddingPaddingPaddingPad."
"maxLabelLengthIs63paddingPaddingPaddingPaddingPaddingPaddingPad."
"maxLabelLengthIs63paddingPaddingPaddingPaddingPaddingPaddingPadP",
"257.257.257.257",
"domain#domain",
"asd@asd",
"ab..cd"};

private:
iroha::time::time_t initial_time;
/// number of created transactions, used to provide unique time
Expand Down
43 changes: 0 additions & 43 deletions test/integration/acceptance/create_asset_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,29 +65,6 @@ TEST_F(CreateAssetFixture, Basic) {
[](auto &block) { ASSERT_EQ(block->transactions().size(), 1); });
}

/**
* TODO mboldyrev 18.01.2019 IR-206 convert to a SLV unit test (this one has
* more test cases than its duplicate field validator test)
*
* C235 Create asset with an empty name
* C236 Create asset with boundary values per name validation
* @given some user with can_create_asset permission
* @when the user tries to create an asset with invalid or empty name
* @then no asset is created
*/
TEST_F(CreateAssetFixture, IllegalCharactersInName) {
IntegrationTestFramework itf(1);
itf.setInitialState(kAdminKeypair)
.sendTx(makeUserWithPerms())
.skipProposal()
.checkBlock(
[](auto &block) { ASSERT_EQ(block->transactions().size(), 1); });
for (const auto &name : kIllegalAssetNames) {
itf.sendTx(complete(baseTx().createAsset(name, kDomain, kPrecision)),
CHECK_STATELESS_INVALID);
}
}

/**
* TODO mboldyrev 18.01.2019 IR-206 remove, covered by
* postgres_executor_test CreateAccount.NameNotUnique
Expand Down Expand Up @@ -200,23 +177,3 @@ TEST_F(CreateAssetFixture, ValidNonExistingDomain) {
.checkBlock(
[](auto block) { ASSERT_EQ(block->transactions().size(), 0); });
}

/**
* TODO mboldyrev 18.01.2019 IR-206 convert to a SLV unit test (this one has
* more test cases than its duplicate field validator test)
*
* @given a user with can_create_asset permission
* @when the user tries to create an asset in a domain with illegal characters
* @then stateless validation failed
*/
TEST_F(CreateAssetFixture, InvalidDomain) {
IntegrationTestFramework itf(1);
itf.setInitialState(kAdminKeypair)
.sendTxAwait(makeUserWithPerms(), [](auto &block) {
ASSERT_EQ(block->transactions().size(), 1);
});
for (const auto &domain : kIllegalDomainNames) {
itf.sendTx(complete(baseTx().createAsset(kAssetName, domain, kPrecision)),
CHECK_STATELESS_INVALID);
}
}
79 changes: 62 additions & 17 deletions test/module/shared_model/validators/field_validator_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,30 +250,75 @@ class FieldValidatorTest : public ValidatorsTest {

/// Generate test cases for id types with name, separator, and domain
template <typename F>
std::vector<FieldTestCase> idTestCases(const std::string &field_name,
F field,
char separator) {
auto f = [&](const auto &s) {
return (boost::format(s) % separator).str();
std::vector<FieldTestCase> idTestCases(
const std::string &field_name,
F field,
char separator,
std::initializer_list<char> illegal_name_chars,
size_t max_name_length) {
auto fc = [](const auto &s, char c) {
return (boost::format(s) % c).str();
};

auto f = [&](const auto &s) { return fc(s, separator); };

std::vector<FieldTestCase> test_cases;

auto add_valid = [&](auto c) {
test_cases.emplace_back(makeValidCase(field, std::move(c)));
};

auto c = [&](const auto &n, const auto &v) {
return this->makeInvalidCase(n, field_name, field, v);
auto add_invalid = [&](const auto &name, auto c) {
test_cases.emplace_back(
this->makeInvalidCase(name, field_name, field, c));
};

return {makeValidCase(field, f("name%cdomain")),
c("domain_start_with_digit", f("abs%c3domain")),
c("empty_string", ""),
c("illegal_char", f("ab--s%cdo--main")),
c(f("missing_%c"), "absdomain"),
c("missing_name", f("%cdomain"))};
// general cases
add_valid(f("name%cdomain"));
add_invalid("empty_string", "");
add_invalid(f("missing_%c"), "absdomain");
add_invalid(f("double_%c"), f("abs%1$cwhoops%1$cdomain"));

// name cases
add_invalid("missing_name", f("%cdomain"));
for (char i : illegal_name_chars) {
add_invalid(fc("illegal_char_%c_in_name", i),
fc("ab%cs", i) + f("%cdomain"));
}
add_valid(std::string(max_name_length, 'a') + f("%cdomain"));
add_invalid("name_too_long",
std::string(max_name_length + 1, 'a') + f("%cdomain"));
add_invalid("name_way_too_long",
std::string(max_name_length * 2, 'a') + f("%cdomain"));

// domain cases
static const std::vector<char> kIllegalAssetNameChars{{'_', '@', ' ', '#'}};
static const size_t kMaxDomainLabelLength = 63;
add_invalid("missing_domain", f("name%c"));
for (char i : kIllegalAssetNameChars) {
add_invalid(fc("illegal_char_%c_in_domain", i),
f("name%c") + fc("do%cmain", i));
}
add_valid(f("name%c") + std::string(kMaxDomainLabelLength, 'a'));
add_invalid("domain_label_too_long",
f("name%c") + std::string(kMaxDomainLabelLength + 1, 'a'));
add_invalid("domain_label_way_too_long",
f("name%c") + std::string(kMaxDomainLabelLength * 2, 'a'));
add_invalid("domain_starts_with_digit", f("abs%c3domain"));
add_invalid("domain_starts_with_dash", f("abs%c-domain"));
add_invalid("domain_ends_with_dash", f("abs%cdomain-"));
add_invalid("domain_label_starts_with_dash", f("abs%caa.-domain"));
add_invalid("domain_label_ends_with_dash", f("abs%cdomain-.aa"));
add_invalid("domain_double_dot", f("abs%cdomain..aa"));

return test_cases;
}

std::vector<FieldTestCase> account_id_test_cases =
idTestCases("account_id", &FieldValidatorTest::account_id, '@');
std::vector<FieldTestCase> account_id_test_cases = idTestCases(
"account_id", &FieldValidatorTest::account_id, '@', {'A', '-', ' '}, 32);

std::vector<FieldTestCase> asset_id_test_cases =
idTestCases("asset_id", &FieldValidatorTest::asset_id, '#');
std::vector<FieldTestCase> asset_id_test_cases = idTestCases(
"asset_id", &FieldValidatorTest::asset_id, '#', {'A', '-', ' '}, 32);

std::vector<FieldTestCase> amount_test_cases{
{"valid_amount", [&] { amount = "100"; }, true, ""},
Expand Down

0 comments on commit 94ffdd6

Please sign in to comment.