Add test for znc-buildmod

This commit is contained in:
Alexey Sokolov
2016-01-09 22:01:33 +00:00
parent cfa178f75e
commit d13742b132
3 changed files with 74 additions and 10 deletions
+1 -1
View File
@@ -157,7 +157,7 @@ test/gmock-main.o: $(GMOCK_DIR)/src/gmock_main.cc Makefile
test/Integration.o: test/Integration.cpp Makefile
@mkdir -p .depend test
$(E) Building test object Integration...
$(Q)g++ $(qt_CFLAGS) $(GTEST_FLAGS) -c -o $@ $< -MD -MF .depend/Integration.test.dep -MT $@ '-DZNC_BIN_DIR="$(bindir)"'
$(Q)g++ $(qt_CFLAGS) $(GTEST_FLAGS) -c -o $@ $< -MD -MF .depend/Integration.test.dep -MT $@ '-DZNC_BIN_DIR="$(bindir)"' '-DZNC_SRC_DIR="$(realpath $(srcdir))"'
test/Int-gtest-all.o: $(GTEST_DIR)/src/gtest-all.cc Makefile
@mkdir -p .depend test
$(E) Building test object Int-gtest-all...
+46 -9
View File
@@ -45,6 +45,10 @@
#define ZNC_BIN_DIR ""
#endif
#ifndef ZNC_SRC_DIR
#define ZNC_SRC_DIR ""
#endif
using testing::AnyOf;
using testing::Eq;
using testing::HasSubstr;
@@ -126,11 +130,9 @@ using Socket = IO<QTcpSocket>;
class Process : public IO<QProcess> {
public:
Process(QString cmd, QStringList args, bool interactive)
Process(QString cmd, QStringList args,
std::function<void(QProcess*)> setup = [](QProcess*) {})
: IO(&m_proc, true) {
if (!interactive) {
m_proc.setProcessChannelMode(QProcess::ForwardedChannels);
}
auto env = QProcessEnvironment::systemEnvironment();
// Default exit codes of sanitizers upon error:
// ASAN - 1
@@ -142,6 +144,7 @@ class Process : public IO<QProcess> {
// error.
env.insert("ASAN_OPTIONS", "exitcode=57");
m_proc.setProcessEnvironment(env);
setup(&m_proc);
m_proc.start(cmd, args);
}
~Process() override {
@@ -179,8 +182,7 @@ void WriteConfig(QString path) {
// clang-format off
Process p(ZNC_BIN_DIR "/znc", QStringList() << "--debug"
<< "--datadir" << path
<< "--makeconf",
true);
<< "--makeconf");
p.ReadUntil("Listen on port");Z; p.Write("12345");
p.ReadUntil("Listen using SSL");Z; p.Write();
p.ReadUntil("IPv6");Z; p.Write();
@@ -210,8 +212,7 @@ TEST(Config, AlreadyExists) {
Z;
Process p(ZNC_BIN_DIR "/znc", QStringList() << "--debug"
<< "--datadir" << dir.path()
<< "--makeconf",
true);
<< "--makeconf");
p.ReadUntil("already exists");
Z;
p.CanDie();
@@ -261,7 +262,9 @@ class ZNCTest : public testing::Test {
return std::unique_ptr<Process>(
new Process("./znc", QStringList() << "--debug"
<< "--datadir" << m_dir.path(),
false));
[](QProcess* proc) {
proc->setProcessChannelMode(QProcess::ForwardedChannels);
}));
}
Socket LoginClient() {
@@ -1810,4 +1813,38 @@ TEST_F(ZNCTest, Encoding) {
Z;
}
TEST_F(ZNCTest, BuildMod) {
auto znc = Run();
Z;
auto ircd = ConnectIRCd();
Z;
auto client = LoginClient();
Z;
QDir dir(m_dir.path());
EXPECT_TRUE(dir.mkdir("modules"));
EXPECT_TRUE(dir.cd("modules"));
{
Process p(ZNC_BIN_DIR "/znc-buildmod",
QStringList() << ZNC_SRC_DIR "/test/file-not-found.cpp",
[&](QProcess* proc) {
proc->setWorkingDirectory(dir.absolutePath());
proc->setProcessChannelMode(QProcess::ForwardedChannels);
});
p.ShouldFinishItself(1);
}
{
Process p(ZNC_BIN_DIR "/znc-buildmod",
QStringList() << ZNC_SRC_DIR "/test/testmod.cpp",
[&](QProcess* proc) {
proc->setWorkingDirectory(dir.absolutePath());
proc->setProcessChannelMode(QProcess::ForwardedChannels);
});
p.ShouldFinishItself();
}
client.Write("znc loadmod testmod");
client.Write("PRIVMSG *testmod :hi");
client.ReadUntil("Lorem ipsum");
Z;
}
} // namespace
+27
View File
@@ -0,0 +1,27 @@
/*
* Copyright (C) 2004-2016 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 <znc/Modules.h>
class TestModule : public CModule {
public:
MODCONSTRUCTOR(TestModule) {}
void OnModCommand(const CString& sLine) override {
PutModule("Lorem ipsum");
}
};
MODULEDEFS(TestModule, "Test")