From ee88045383626abd452ba66dec64b3d6bd3e447e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 27 Mar 2018 16:10:17 +0200 Subject: [PATCH] Renamed content_manager_tester + improved header parsing + new tests --- src/content/content-type.cpp | 1 - src/content/content.cpp | 9 ++++ src/content/content.h | 1 + src/content/header/header.cpp | 41 ++++++++++++++----- src/content/header/header.h | 1 + tester/CMakeLists.txt | 2 +- ...manager-tester.cpp => contents-tester.cpp} | 33 ++++++++++++--- tester/liblinphone_tester.h | 2 +- tester/tester.c | 2 +- 9 files changed, 73 insertions(+), 19 deletions(-) rename tester/{content-manager-tester.cpp => contents-tester.cpp} (92%) diff --git a/src/content/content-type.cpp b/src/content/content-type.cpp index 3d6b4689f..7aee05247 100644 --- a/src/content/content-type.cpp +++ b/src/content/content-type.cpp @@ -82,7 +82,6 @@ ContentType::ContentType (const string &contentType) : Header(*new ContentTypePr params.erase(0, posParam + 1); } while (posParam != std::string::npos); } - setValue(d->type + "/" + d->subType); } ContentType::ContentType (const string &type, const string &subType) : Header(*new ContentTypePrivate) { diff --git a/src/content/content.cpp b/src/content/content.cpp index 91761e268..ad74de27f 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -213,6 +213,15 @@ const list
&Content::getHeaders () const { return d->headers; } +const Header &Content::getHeader (const string &headerName) const { + L_D(); + list
::const_iterator it = findHeader(headerName); + if (it != d->headers.cend()) { + return *it; + } + return Utils::getEmptyConstRefObject
(); +} + void Content::removeHeader (const string &headerName) { L_D(); auto it = findHeader(headerName); diff --git a/src/content/content.h b/src/content/content.h index 50066133f..3c29d3a1a 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -78,6 +78,7 @@ public: virtual bool isFileTransfer () const; const std::list
&getHeaders () const; + const Header &getHeader (const std::string &headerName) const; void addHeader (const std::string &headerName, const std::string &headerValue); void addHeader (const Header &header); void removeHeader (const std::string &headerName); diff --git a/src/content/header/header.cpp b/src/content/header/header.cpp index 92920e024..5924cdf5b 100644 --- a/src/content/header/header.cpp +++ b/src/content/header/header.cpp @@ -33,13 +33,34 @@ LINPHONE_BEGIN_NAMESPACE // ----------------------------------------------------------------------------- -Header::Header(HeaderPrivate &p) : ClonableObject(p) { +Header::Header(HeaderPrivate &p) : ClonableObject(p) {} -} +Header::Header() : ClonableObject(*new HeaderPrivate) {} Header::Header (const string &name, const string &value) : ClonableObject(*new HeaderPrivate) { setName(name); - setValue(value); + + size_t posParam = value.find(";"); + if (posParam == string::npos) { + setValue(value); + return; + } + + string parsedValue = value.substr(0, posParam); + string params = value.substr(posParam + 1); + string token; + do { + posParam = params.find(";"); + if (posParam == string::npos) { + token = params; + } else { + token = params.substr(0, posParam); + } + addParameter(HeaderParam(token)); + params.erase(0, posParam + 1); + } while (posParam != std::string::npos); + + setValue(parsedValue); } Header::Header (const string &name, const string &value, const list ¶ms) : Header(name, value) { @@ -93,12 +114,12 @@ void Header::cleanParameters () { d->parameters.clear(); } -const std::list &Header::getParameters () const { +const list &Header::getParameters () const { L_D(); return d->parameters; } -void Header::addParameter (const std::string ¶mName, const std::string ¶mValue) { +void Header::addParameter (const string ¶mName, const string ¶mValue) { addParameter(HeaderParam(paramName, paramValue)); } @@ -108,14 +129,14 @@ void Header::addParameter (const HeaderParam ¶m) { d->parameters.push_back(param); } -void Header::addParameters(const std::list ¶ms) { +void Header::addParameters(const list ¶ms) { for (auto it = std::begin(params); it!=std::end(params); ++it) { HeaderParam param = *it; addParameter(param.getName(), param.getValue()); } } -void Header::removeParameter (const std::string ¶mName) { +void Header::removeParameter (const string ¶mName) { L_D(); auto it = findParameter(paramName); if (it != d->parameters.cend()) @@ -126,16 +147,16 @@ void Header::removeParameter (const HeaderParam ¶m) { removeParameter(param.getName()); } -std::list::const_iterator Header::findParameter (const std::string ¶mName) const { +list::const_iterator Header::findParameter (const string ¶mName) const { L_D(); return findIf(d->parameters, [¶mName](const HeaderParam ¶m) { return param.getName() == paramName; }); } -const HeaderParam &Header::getParameter (const std::string ¶mName) const { +const HeaderParam &Header::getParameter (const string ¶mName) const { L_D(); - std::list::const_iterator it = findParameter(paramName); + list::const_iterator it = findParameter(paramName); if (it != d->parameters.cend()) { return *it; } diff --git a/src/content/header/header.h b/src/content/header/header.h index 5d111900d..583572523 100644 --- a/src/content/header/header.h +++ b/src/content/header/header.h @@ -33,6 +33,7 @@ class HeaderParam; class LINPHONE_PUBLIC Header : public ClonableObject { public: + Header (); Header (const std::string &name, const std::string &value); Header (const std::string &name, const std::string &value, const std::list ¶ms); Header (const Header &other); diff --git a/tester/CMakeLists.txt b/tester/CMakeLists.txt index b14e28572..e07217934 100644 --- a/tester/CMakeLists.txt +++ b/tester/CMakeLists.txt @@ -199,7 +199,7 @@ set(SOURCE_FILES_C set(SOURCE_FILES_CXX clonable-object-tester.cpp conference-event-tester.cpp - content-manager-tester.cpp + contents-tester.cpp cpim-tester.cpp main-db-tester.cpp multipart-tester.cpp diff --git a/tester/content-manager-tester.cpp b/tester/contents-tester.cpp similarity index 92% rename from tester/content-manager-tester.cpp rename to tester/contents-tester.cpp index 52d461ef9..99ecee08d 100644 --- a/tester/content-manager-tester.cpp +++ b/tester/contents-tester.cpp @@ -298,6 +298,7 @@ void multipart_to_list () { ms_message("\n\n----- Original part 3 -----"); ms_message("%s", originalStr3.c_str()); BC_ASSERT_TRUE(originalStr3 == generatedStr3); + BC_ASSERT_TRUE(content3.getHeader("Content-Encoding").getValue() == "b64"); Content content4 = contents.front(); contents.pop_front(); @@ -316,6 +317,10 @@ void multipart_to_list () { ms_message("\n\n----- Original part 4 -----"); ms_message("%s", originalStr4.c_str()); BC_ASSERT_TRUE(originalStr4 == generatedStr4); + BC_ASSERT_TRUE(content4.getHeader("Content-Id").getValue() == "toto"); + BC_ASSERT_TRUE(content4.getHeader("Content-Id").getParameter("param1").getValue() == "value1"); + BC_ASSERT_TRUE(content4.getHeader("Content-Id").getParameter("param2").getValue().empty()); + BC_ASSERT_TRUE(content4.getHeader("Content-Id").getParameter("param3").getValue() == "value3"); } void list_to_multipart () { @@ -396,17 +401,35 @@ static void content_type_parsing(void) { BC_ASSERT_TRUE(type == contentType.asString()); } -test_t content_manager_tests[] = { +static void content_header_parsing(void) { + string value = "toto;param1=value1;param2;param3=value3"; + Header header = Header("Content-Id", value); + BC_ASSERT_TRUE(header.getValue() == "toto"); + BC_ASSERT_TRUE(header.getParameter("param1").getValue() == "value1"); + BC_ASSERT_TRUE(header.getParameter("param2").getValue().empty()); + BC_ASSERT_TRUE(header.getParameter("param3").getValue() == "value3"); + BC_ASSERT_EQUAL(3, header.getParameters().size(), int, "%d"); + BC_ASSERT_STRING_EQUAL("", header.getParameter("encoding").getValue().c_str()); + + value = "b64"; + header = Header("Content-Encoding", value); + BC_ASSERT_TRUE(header.getValue() == value); + BC_ASSERT_EQUAL(0, header.getParameters().size(), int, "%d"); + BC_ASSERT_STRING_EQUAL("", header.getParameter("access-type").getValue().c_str()); +} + +test_t contents_tests[] = { TEST_NO_TAG("Multipart to list", multipart_to_list), TEST_NO_TAG("List to multipart", list_to_multipart), - TEST_NO_TAG("Content type parsing", content_type_parsing) + TEST_NO_TAG("Content type parsing", content_type_parsing), + TEST_NO_TAG("Content header parsing", content_header_parsing) }; -test_suite_t content_manager_test_suite = { - "Content manager", +test_suite_t contents_test_suite = { + "Contents", nullptr, nullptr, liblinphone_tester_before_each, liblinphone_tester_after_each, - sizeof(content_manager_tests) / sizeof(content_manager_tests[0]), content_manager_tests + sizeof(contents_tests) / sizeof(contents_tests[0]), contents_tests }; diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 9824c2084..c96be9ed4 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -45,7 +45,7 @@ extern test_suite_t call_video_test_suite; extern test_suite_t clonable_object_test_suite; extern test_suite_t conference_event_test_suite; extern test_suite_t conference_test_suite; -extern test_suite_t content_manager_test_suite; +extern test_suite_t contents_test_suite; extern test_suite_t cpim_test_suite; extern test_suite_t dtmf_test_suite; extern test_suite_t event_test_suite; diff --git a/tester/tester.c b/tester/tester.c index c47cff87f..95e3a9fe5 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -604,7 +604,7 @@ void liblinphone_tester_add_suites() { bc_tester_add_suite(&stun_test_suite); bc_tester_add_suite(&event_test_suite); bc_tester_add_suite(&conference_event_test_suite); - bc_tester_add_suite(&content_manager_test_suite); + bc_tester_add_suite(&contents_test_suite); bc_tester_add_suite(&flexisip_test_suite); bc_tester_add_suite(&remote_provisioning_test_suite); bc_tester_add_suite(&quality_reporting_test_suite);