diff --git a/src/tools/otherTools.cpp b/src/tools/otherTools.cpp index 7d61f7a83..2cbf2c6c4 100644 --- a/src/tools/otherTools.cpp +++ b/src/tools/otherTools.cpp @@ -284,18 +284,19 @@ bool kiwix::convertStrToBool(const std::string& value) kiwix::MimeCounterType kiwix::parseMimetypeCounter(const std::string& counterData) { kiwix::MimeCounterType counters; - std::string mimeType, item, counterString; + std::string item; unsigned int counter; std::stringstream ssContent(counterData); while (getline(ssContent, item, ';')) { + std::string mimeType, counterString; std::stringstream ssItem(item); getline(ssItem, mimeType, '='); getline(ssItem, counterString, '='); if (!counterString.empty() && !mimeType.empty()) { - sscanf(counterString.c_str(), "%u", &counter); - counters.insert(std::pair(mimeType, counter)); + if (sscanf(counterString.c_str(), "%u", &counter)) + counters.insert(std::pair(mimeType, counter)); } } diff --git a/test/counterParsing.cpp b/test/counterParsing.cpp new file mode 100644 index 000000000..bb17b3b32 --- /dev/null +++ b/test/counterParsing.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2019 Matthieu Gautier + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and + * NON-INFRINGEMENT. See the GNU General Public License 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 +#include +#include +#include + +namespace kiwix { +using CounterType = std::map; +CounterType parseMimetypeCounter(const std::string& counterData); +}; + +using namespace kiwix; +#define parse parseMimetypeCounter + +namespace +{ +TEST(ParseCounterTest, simpleMimeType) +{ + { + std::string counterStr = ""; + CounterType counterMap = {}; + ASSERT_EQ(parse(counterStr), counterMap) << counterStr; + } + { + std::string counterStr = "foo=1"; + CounterType counterMap = {{"foo", 1}}; + ASSERT_EQ(parse(counterStr), counterMap) << counterStr; + } + { + std::string counterStr = "foo=1;text/html=50;"; + CounterType counterMap = {{"foo", 1}, {"text/html", 50}}; + ASSERT_EQ(parse(counterStr), counterMap) << counterStr; + } +} +/* +TEST(ParseCounterTest, paramMimeType) +{ + { + std::string counterStr = "text/html;raw=true=1"; + CounterType counterMap = {{"foo", 1}}; + ASSERT_EQ(parse(counterStr), counterMap); + } + { + std::string counterStr = "foo=1;text/html;raw=true=50;bar=2"; + CounterType counterMap = {{"foo", 1}, {"text/html;raw=true", 50}, {"bar", 2}}; + ASSERT_EQ(parse(counterStr), counterMap); + } + { + std::string counterStr = "foo=1;text/html;raw=true;param=value=50;bar=2"; + CounterType counterMap = {{"foo", 1}, {"text/html;raw=true;param=value", 50}, {"bar", 2}}; + ASSERT_EQ(parse(counterStr), counterMap); + } + { + std::string counterStr = "foo=1;text/html;raw=true=50;bar=2"; + CounterType counterMap = {{"foo", 1}, {"text/html;raw=true", 50}, {"bar", 2}}; + ASSERT_EQ(parse(counterStr), counterMap); + } +}*/ + +TEST(ParseCounterTest, wrongType) +{ + CounterType empty = {}; + { + std::string counterStr = "text/html"; + ASSERT_EQ(parse(counterStr), empty) << counterStr; + } + { + std::string counterStr = "text/html="; + ASSERT_EQ(parse(counterStr), empty) << counterStr; + } + { + std::string counterStr = "text/html=foo"; + ASSERT_EQ(parse(counterStr), empty) << counterStr; + } + { + std::string counterStr = "text/html=50;foo"; + CounterType counterMap = {{"text/html", 50}}; + ASSERT_EQ(parse(counterStr), counterMap) << counterStr; + } + /*{ + std::string counterStr = "text/html;foo=20"; + ASSERT_EQ(parse(counterStr), empty) << counterStr; + } + { + std::string counterStr = "text/html;foo=20;"; + ASSERT_EQ(parse(counterStr), empty) << counterStr; + }*/ + { + std::string counterStr = "text/html=50;;foo"; + CounterType counterMap = {{"text/html", 50}}; + ASSERT_EQ(parse(counterStr), counterMap) << counterStr; + } +} + +}; diff --git a/test/meson.build b/test/meson.build index e203bc74d..79849fe51 100644 --- a/test/meson.build +++ b/test/meson.build @@ -3,6 +3,7 @@ tests = [ 'library', 'regex', 'tagParsing', + 'counterParsing', 'stringTools', 'pathTools', 'kiwixserve',