aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/http/io/headers_ut.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/http/io/headers_ut.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/http/io/headers_ut.cpp')
-rw-r--r--library/cpp/http/io/headers_ut.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/library/cpp/http/io/headers_ut.cpp b/library/cpp/http/io/headers_ut.cpp
new file mode 100644
index 0000000000..1d23ef8fdc
--- /dev/null
+++ b/library/cpp/http/io/headers_ut.cpp
@@ -0,0 +1,176 @@
+#include <util/generic/set.h>
+#include <util/generic/string.h>
+#include <util/generic/strbuf.h>
+#include <utility>
+
+#include <library/cpp/http/io/headers.h>
+#include <library/cpp/testing/unittest/registar.h>
+
+namespace {
+ class THeadersExistence {
+ public:
+ THeadersExistence() = default;
+
+ THeadersExistence(const THttpHeaders& headers) {
+ for (THttpHeaders::TConstIterator it = headers.Begin();
+ it != headers.End();
+ ++it) {
+ Add(it->Name(), it->Value());
+ }
+ }
+
+ public:
+ void Add(TStringBuf name, TStringBuf value) {
+ Impl.emplace(TString(name), TString(value));
+ }
+
+ bool operator==(const THeadersExistence& rhs) const {
+ return Impl == rhs.Impl;
+ }
+
+ private:
+ typedef TMultiSet<std::pair<TString, TString>> TImpl;
+ TImpl Impl;
+ };
+}
+
+bool operator==(const THeadersExistence& lhs, const THttpHeaders& rhs) {
+ return lhs == THeadersExistence(rhs);
+}
+
+bool operator==(const THttpHeaders& lhs, const THeadersExistence& rhs) {
+ return THeadersExistence(lhs) == rhs;
+}
+
+class THttpHeadersTest: public TTestBase {
+ UNIT_TEST_SUITE(THttpHeadersTest);
+ UNIT_TEST(TestAddOperation1Arg);
+ UNIT_TEST(TestAddOperation2Args);
+ UNIT_TEST(TestAddOrReplaceOperation1Arg);
+ UNIT_TEST(TestAddOrReplaceOperation2Args);
+ UNIT_TEST(TestAddHeaderTemplateness);
+ UNIT_TEST(TestFindHeader);
+ UNIT_TEST_SUITE_END();
+
+private:
+ typedef void (*TAddHeaderFunction)(THttpHeaders&, TStringBuf name, TStringBuf value);
+ typedef void (*TAddOrReplaceHeaderFunction)(THttpHeaders&, TStringBuf name, TStringBuf value);
+
+public:
+ void TestAddOperation1Arg();
+ void TestAddOperation2Args();
+ void TestAddOrReplaceOperation1Arg();
+ void TestAddOrReplaceOperation2Args();
+ void TestAddHeaderTemplateness();
+ void TestFindHeader();
+
+private:
+ static void AddHeaderImpl1Arg(THttpHeaders& headers, TStringBuf name, TStringBuf value) {
+ headers.AddHeader(THttpInputHeader(TString(name), TString(value)));
+ }
+
+ static void AddHeaderImpl2Args(THttpHeaders& headers, TStringBuf name, TStringBuf value) {
+ headers.AddHeader(TString(name), TString(value));
+ }
+
+ static void AddOrReplaceHeaderImpl1Arg(THttpHeaders& headers, TStringBuf name, TStringBuf value) {
+ headers.AddOrReplaceHeader(THttpInputHeader(TString(name), TString(value)));
+ }
+
+ static void AddOrReplaceHeaderImpl2Args(THttpHeaders& headers, TStringBuf name, TStringBuf value) {
+ headers.AddOrReplaceHeader(TString(name), TString(value));
+ }
+
+ void DoTestAddOperation(TAddHeaderFunction);
+ void DoTestAddOrReplaceOperation(TAddHeaderFunction, TAddOrReplaceHeaderFunction);
+};
+
+UNIT_TEST_SUITE_REGISTRATION(THttpHeadersTest);
+
+void THttpHeadersTest::TestAddOperation1Arg() {
+ DoTestAddOperation(AddHeaderImpl1Arg);
+}
+void THttpHeadersTest::TestAddOperation2Args() {
+ DoTestAddOperation(AddHeaderImpl2Args);
+}
+
+void THttpHeadersTest::TestAddOrReplaceOperation1Arg() {
+ DoTestAddOrReplaceOperation(AddHeaderImpl1Arg, AddOrReplaceHeaderImpl1Arg);
+}
+void THttpHeadersTest::TestAddOrReplaceOperation2Args() {
+ DoTestAddOrReplaceOperation(AddHeaderImpl2Args, AddOrReplaceHeaderImpl2Args);
+}
+
+void THttpHeadersTest::DoTestAddOperation(TAddHeaderFunction addHeader) {
+ THttpHeaders h1;
+
+ addHeader(h1, "h1", "v1");
+ addHeader(h1, "h2", "v1");
+
+ addHeader(h1, "h3", "v1");
+ addHeader(h1, "h3", "v2");
+ addHeader(h1, "h3", "v2");
+
+ THeadersExistence h2;
+
+ h2.Add("h1", "v1");
+ h2.Add("h2", "v1");
+
+ h2.Add("h3", "v1");
+ h2.Add("h3", "v2");
+ h2.Add("h3", "v2");
+
+ UNIT_ASSERT(h2 == h1);
+}
+
+// Sorry, but AddOrReplaceHeader replaces only first occurence
+void THttpHeadersTest::DoTestAddOrReplaceOperation(TAddHeaderFunction addHeader, TAddOrReplaceHeaderFunction addOrReplaceHeader) {
+ THttpHeaders h1;
+
+ addHeader(h1, "h1", "v1");
+
+ addOrReplaceHeader(h1, "h2", "v1");
+ addOrReplaceHeader(h1, "h2", "v2");
+ addOrReplaceHeader(h1, "h2", "v3");
+ addHeader(h1, "h2", "v4");
+
+ addHeader(h1, "h3", "v1");
+ addHeader(h1, "h3", "v2");
+ addOrReplaceHeader(h1, "h3", "v3");
+
+ THeadersExistence h2;
+
+ h2.Add("h1", "v1");
+
+ h2.Add("h2", "v3");
+ h2.Add("h2", "v4");
+
+ h2.Add("h3", "v2");
+ h2.Add("h3", "v3");
+
+ UNIT_ASSERT(h2 == h1);
+}
+
+void THttpHeadersTest::TestAddHeaderTemplateness() {
+ THttpHeaders h1;
+ h1.AddHeader("h1", "v1");
+ h1.AddHeader("h2", TString("v2"));
+ h1.AddHeader("h3", TStringBuf("v3"));
+ h1.AddHeader("h4", TStringBuf("v4"));
+
+ THeadersExistence h2;
+ h2.Add("h1", "v1");
+ h2.Add("h2", "v2");
+ h2.Add("h3", "v3");
+ h2.Add("h4", "v4");
+
+ UNIT_ASSERT(h1 == h2);
+}
+
+void THttpHeadersTest::TestFindHeader() {
+ THttpHeaders sut;
+ sut.AddHeader("NaMe", "Value");
+
+ UNIT_ASSERT(sut.FindHeader("name"));
+ UNIT_ASSERT(sut.FindHeader("name")->Value() == "Value");
+}