diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-09-29 18:00:03 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-09-29 18:00:03 +0100 |
commit | d7fde715073a96dbcff7ecc69fe7b5ada3a1d045 (patch) | |
tree | d77d70891ab189c14eb7d983fcafde64689da13a /src/libmime/mime_string.cxx | |
parent | e3a6c03b42500262a4048dd32def12623cfb2619 (diff) | |
download | rspamd-d7fde715073a96dbcff7ecc69fe7b5ada3a1d045.tar.gz rspamd-d7fde715073a96dbcff7ecc69fe7b5ada3a1d045.zip |
[Project] Add helper library to handle mime strings in a more safe matter
Diffstat (limited to 'src/libmime/mime_string.cxx')
-rw-r--r-- | src/libmime/mime_string.cxx | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/libmime/mime_string.cxx b/src/libmime/mime_string.cxx new file mode 100644 index 000000000..1785e9188 --- /dev/null +++ b/src/libmime/mime_string.cxx @@ -0,0 +1,99 @@ +/*- + * Copyright 2021 Vsevolod Stakhov + * + * Licensed 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. + */ + +#define DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL +#include "doctest/doctest.h" +#include "mime_string.hxx" +#include "unicode/uchar.h" + +TEST_SUITE("mime_string") { +TEST_CASE("mime_string unfiltered ctors") +{ + SUBCASE("empty") { + rspamd::mime_string st; + CHECK(st.size() == 0); + CHECK(st == ""); + } + SUBCASE("unfiltered valid") { + rspamd::mime_string st{std::string_view("abcd")}; + CHECK(st == "abcd"); + } + SUBCASE("unfiltered zero character") { + rspamd::mime_string st{"abc\0d", 5}; + CHECK(st.has_zeroes()); + CHECK(st == "abcd"); + } + SUBCASE("unfiltered invalid character - middle") { + rspamd::mime_string st{std::string("abc\234d")}; + CHECK(st.has_invalid()); + CHECK(st == "abc\uFFFDd"); + } + SUBCASE("unfiltered invalid character - end") { + rspamd::mime_string st{std::string("abc\234")}; + CHECK(st.has_invalid()); + CHECK(st == "abc\uFFFD"); + } + SUBCASE("unfiltered invalid character - start") { + rspamd::mime_string st{std::string("\234abc")}; + CHECK(st.has_invalid()); + CHECK(st == "\uFFFDabc"); + } +} + +TEST_CASE("mime_string filtered ctors") +{ + auto print_filter = [](UChar32 inp) -> UChar32 { + if (!u_isprint(inp)) { + return 0; + } + + return inp; + }; + + auto tolower_filter = [](UChar32 inp) -> UChar32 { + return u_tolower(inp); + }; + + SUBCASE("empty") { + rspamd::mime_string st{std::string_view(""), tolower_filter}; + CHECK(st.size() == 0); + CHECK(st == ""); + } + SUBCASE("filtered valid") { + rspamd::mime_string st{std::string("AbCdУ"), tolower_filter}; + CHECK(st == "abcdу"); + } + SUBCASE("filtered invalid + filtered") { + rspamd::mime_string st{std::string("abcd\234\1"), print_filter}; + CHECK(st == "abcd\uFFFD"); + } +} +TEST_CASE("mime_string assign") +{ + SUBCASE("assign from valid") { + rspamd::mime_string st; + + CHECK(st.assign_if_valid(std::string("test"))); + CHECK(st == "test"); + } + SUBCASE("assign from invalid") { + rspamd::mime_string st; + + CHECK(!st.assign_if_valid(std::string("test\234t"))); + CHECK(st == ""); + } +} +}
\ No newline at end of file |