From e10b53b87bb7ce87d1a31473e03a02ccafa78787 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 3 Feb 2015 10:11:47 +0100 Subject: [PATCH] Fix CIRCNetwork::FindChans() and FindQueries() to be case-insensitive The playback module failed to clear a buffer, because it tried to clear "NickServ" whereas ZNC had internally stored it has "nickserv". --- Makefile.in | 2 +- src/IRCNetwork.cpp | 6 ++-- test/NetworkTest.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 test/NetworkTest.cpp --- a/Makefile.in +++ b/Makefile.in @@ -48,7 +48,7 @@ LIB_SRCS := $(addprefix src/,$(LIB_SRCS BIN_SRCS := src/main.cpp LIB_OBJS := $(patsubst %cpp,%o,$(LIB_SRCS)) BIN_OBJS := $(patsubst %cpp,%o,$(BIN_SRCS)) -TESTS := StringTest ConfigTest UtilsTest ThreadTest NickTest ClientTest +TESTS := StringTest ConfigTest UtilsTest ThreadTest NickTest ClientTest NetworkTest TESTS := $(addprefix test/,$(addsuffix .o,$(TESTS))) CLEAN := znc src/*.o test/*.o core core.* .version_extra .depend modules/.depend unittest DISTCLEAN := Makefile config.log config.status znc-buildmod \ --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -787,8 +787,9 @@ CChan* CIRCNetwork::FindChan(CString sNa std::vector CIRCNetwork::FindChans(const CString& sWild) const { std::vector vChans; vChans.reserve(m_vChans.size()); + const CString sLower = sWild.AsLower(); for (std::vector::const_iterator it = m_vChans.begin(); it != m_vChans.end(); ++it) { - if ((*it)->GetName().WildCmp(sWild)) + if ((*it)->GetName().AsLower().WildCmp(sLower)) vChans.push_back(*it); } return vChans; @@ -946,8 +947,9 @@ CQuery* CIRCNetwork::FindQuery(const CSt std::vector CIRCNetwork::FindQueries(const CString& sWild) const { std::vector vQueries; vQueries.reserve(m_vQueries.size()); + const CString sLower = sWild.AsLower(); for (std::vector::const_iterator it = m_vQueries.begin(); it != m_vQueries.end(); ++it) { - if ((*it)->GetName().WildCmp(sWild)) + if ((*it)->GetName().AsLower().WildCmp(sLower)) vQueries.push_back(*it); } return vQueries; --- /dev/null +++ b/test/NetworkTest.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2004-2015 ZNC, see the NOTICE file for details. + * + * 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. + */ + +#include +#include +#include +#include + +class NetworkTest : public ::testing::Test { +protected: + void SetUp() { CZNC::CreateInstance(); } + void TearDown() { CZNC::DestroyInstance(); } +}; + +TEST_F(NetworkTest, FindChan) { + CUser user("user"); + CIRCNetwork network(&user, "network"); + + EXPECT_TRUE(network.AddChan("#foo", false)); + EXPECT_TRUE(network.AddChan("#Bar", false)); + EXPECT_TRUE(network.AddChan("#BAZ", false)); + + EXPECT_TRUE(network.FindChan("#foo")); + EXPECT_TRUE(network.FindChan("#Bar")); + EXPECT_TRUE(network.FindChan("#BAZ")); + + EXPECT_TRUE(network.FindChan("#Foo")); + EXPECT_TRUE(network.FindChan("#BAR")); + EXPECT_TRUE(network.FindChan("#baz")); + + EXPECT_FALSE(network.FindChan("#f")); + EXPECT_FALSE(network.FindChan("&foo")); + EXPECT_FALSE(network.FindChan("##foo")); +} + +TEST_F(NetworkTest, FindChans) { + CUser user("user"); + CIRCNetwork network(&user, "network"); + + EXPECT_TRUE(network.AddChan("#foo", false)); + EXPECT_TRUE(network.AddChan("#Bar", false)); + EXPECT_TRUE(network.AddChan("#BAZ", false)); + + EXPECT_EQ(network.FindChans("#f*").size(), 1); + EXPECT_EQ(network.FindChans("#b*").size(), 2); + EXPECT_EQ(network.FindChans("#?A*").size(), 2); + EXPECT_EQ(network.FindChans("*z").size(), 1); +} + +TEST_F(NetworkTest, FindQuery) { + CUser user("user"); + CIRCNetwork network(&user, "network"); + + EXPECT_TRUE(network.AddQuery("foo")); + EXPECT_TRUE(network.AddQuery("Bar")); + EXPECT_TRUE(network.AddQuery("BAZ")); + + EXPECT_TRUE(network.FindQuery("foo")); + EXPECT_TRUE(network.FindQuery("Bar")); + EXPECT_TRUE(network.FindQuery("BAZ")); + + EXPECT_TRUE(network.FindQuery("Foo")); + EXPECT_TRUE(network.FindQuery("BAR")); + EXPECT_TRUE(network.FindQuery("baz")); + + EXPECT_FALSE(network.FindQuery("f")); + EXPECT_FALSE(network.FindQuery("fo")); + EXPECT_FALSE(network.FindQuery("FF")); +} + +TEST_F(NetworkTest, FindQueries) { + CUser user("user"); + CIRCNetwork network(&user, "network"); + + EXPECT_TRUE(network.AddQuery("foo")); + EXPECT_TRUE(network.AddQuery("Bar")); + EXPECT_TRUE(network.AddQuery("BAZ")); + + EXPECT_EQ(network.FindQueries("f*").size(), 1); + EXPECT_EQ(network.FindQueries("b*").size(), 2); + EXPECT_EQ(network.FindQueries("?A*").size(), 2); + EXPECT_EQ(network.FindQueries("*z").size(), 1); +}