summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp10
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h17
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h17
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h19
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceBrowser.cpp22
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceInfo.cpp65
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceInfo.h2
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp4
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp26
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp17
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp6
-rw-r--r--Swiften/QA/DNSSDTest/DNSSDTest.cpp8
-rw-r--r--Swiften/QA/DNSSDTest/SConscript2
13 files changed, 140 insertions, 75 deletions
diff --git a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
index c8e7700..b1a51c9 100644
--- a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
+++ b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <map>
#include <boost/bind.hpp>
#include <cppunit/extensions/HelperMacros.h>
@@ -219,35 +219,39 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
return testling;
}
void addService(const std::string& name, const std::string& nickName = std::string(), const std::string& firstName = std::string(), const std::string& lastName = std::string()) {
DNSSDServiceID service(name, "local.");
LinkLocalServiceInfo info;
info.setFirstName(firstName);
info.setLastName(lastName);
info.setNick(nickName);
- querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, *txtRecord));
querier->addService(service);
eventLoop->processEvents();
}
void removeService(const std::string& name) {
DNSSDServiceID service(name, "local.");
querier->removeService(DNSSDServiceID(name, "local."));
eventLoop->processEvents();
}
void updateServicePresence(const std::string& name, LinkLocalServiceInfo::Status status, const std::string& message) {
DNSSDServiceID service(name, "local.");
LinkLocalServiceInfo info;
info.setStatus(status);
info.setMessage(message);
- querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, *txtRecord));
eventLoop->processEvents();
}
void handleRosterChanged(std::shared_ptr<RosterPayload> payload) {
rosterChanges.push_back(payload);
}
void handlePresenceChanged(std::shared_ptr<Presence> presence) {
presenceChanges.push_back(presence);
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
index c049ed2..63f34db 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/EventLoop/EventLoop.h>
@@ -44,20 +44,25 @@ namespace Swift {
static_cast<BonjourBrowseQuery*>(context)->handleServiceDiscovered(flags, interfaceIndex, errorCode, name, type, domain);
}
void handleServiceDiscovered(DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *name, const char *type, const char *domain) {
if (errorCode != kDNSServiceErr_NoError) {
eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
}
else {
//std::cout << "Discovered service: name:" << name << " domain:" << domain << " type: " << type << std::endl;
- DNSSDServiceID service(name, domain, type, boost::numeric_cast<int>(interfaceIndex));
- if (flags & kDNSServiceFlagsAdd) {
- eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
+ try {
+ DNSSDServiceID service(name, domain, type, boost::numeric_cast<int>(interfaceIndex));
+ if (flags & kDNSServiceFlagsAdd) {
+ eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
+ }
+ else {
+ eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
+ }
}
- else {
- eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
+ catch (...) {
+ eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
}
}
}
};
}
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
index dbf3f0e..61f000e 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include <string>
@@ -17,23 +17,28 @@
#include <netinet/in.h>
namespace Swift {
class BonjourQuerier;
class BonjourResolveHostnameQuery : public DNSSDResolveHostnameQuery, public BonjourQuery {
public:
BonjourResolveHostnameQuery(const std::string& hostname, int interfaceIndex, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
- DNSServiceErrorType result = DNSServiceGetAddrInfo(
- &sdRef, 0, boost::numeric_cast<unsigned int>(interfaceIndex), kDNSServiceProtocol_IPv4,
- hostname.c_str(),
- &BonjourResolveHostnameQuery::handleHostnameResolvedStatic, this);
- if (result != kDNSServiceErr_NoError) {
+ try {
+ DNSServiceErrorType result = DNSServiceGetAddrInfo(
+ &sdRef, 0, boost::numeric_cast<unsigned int>(interfaceIndex), kDNSServiceProtocol_IPv4,
+ hostname.c_str(),
+ &BonjourResolveHostnameQuery::handleHostnameResolvedStatic, this);
+ if (result != kDNSServiceErr_NoError) {
+ sdRef = nullptr;
+ }
+ }
+ catch (...) {
sdRef = nullptr;
}
}
//void DNSSDResolveHostnameQuery::run() {
void run() {
if (sdRef) {
BonjourQuery::run();
}
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
index 7a5555e..4baf87b 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/Base/ByteArray.h>
@@ -14,24 +14,29 @@
#include <Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h>
#include <Swiften/LinkLocal/LinkLocalServiceInfo.h>
namespace Swift {
class BonjourQuerier;
class BonjourResolveServiceQuery : public DNSSDResolveServiceQuery, public BonjourQuery {
public:
BonjourResolveServiceQuery(const DNSSDServiceID& service, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
- DNSServiceErrorType result = DNSServiceResolve(
- &sdRef, 0, boost::numeric_cast<unsigned int>(service.getNetworkInterfaceID()),
- service.getName().c_str(), service.getType().c_str(),
- service.getDomain().c_str(),
- &BonjourResolveServiceQuery::handleServiceResolvedStatic, this);
- if (result != kDNSServiceErr_NoError) {
+ try {
+ DNSServiceErrorType result = DNSServiceResolve(
+ &sdRef, 0, boost::numeric_cast<unsigned int>(service.getNetworkInterfaceID()),
+ service.getName().c_str(), service.getType().c_str(),
+ service.getDomain().c_str(),
+ &BonjourResolveServiceQuery::handleServiceResolvedStatic, this);
+ if (result != kDNSServiceErr_NoError) {
+ sdRef = nullptr;
+ }
+ }
+ catch (...) {
sdRef = nullptr;
}
}
void start() {
if (sdRef) {
run();
}
else {
diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
index b3328cd..0498384 100644
--- a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
@@ -61,27 +61,39 @@ bool LinkLocalServiceBrowser::hasError() const {
return haveError;
}
bool LinkLocalServiceBrowser::isRegistered() const {
return !!registerQuery;
}
void LinkLocalServiceBrowser::registerService(const std::string& name, unsigned short port, const LinkLocalServiceInfo& info) {
assert(!registerQuery);
- registerQuery = querier->createRegisterQuery(name, port, info.toTXTRecord());
- registerQuery->onRegisterFinished.connect(
- boost::bind(&LinkLocalServiceBrowser::handleRegisterFinished, this, _1));
- registerQuery->registerService();
+ if (auto txtRecord = info.toTXTRecord()) {
+ registerQuery = querier->createRegisterQuery(name, port, *txtRecord);
+ registerQuery->onRegisterFinished.connect(
+ boost::bind(&LinkLocalServiceBrowser::handleRegisterFinished, this, _1));
+ registerQuery->registerService();
+ }
+ else {
+ haveError = true;
+ stop();
+ }
}
void LinkLocalServiceBrowser::updateService(const LinkLocalServiceInfo& info) {
assert(registerQuery);
- registerQuery->updateServiceInfo(info.toTXTRecord());
+ if (auto txtRecord = info.toTXTRecord()) {
+ registerQuery->updateServiceInfo(*txtRecord);
+ }
+ else {
+ haveError = true;
+ stop();
+ }
}
void LinkLocalServiceBrowser::unregisterService() {
assert(registerQuery);
registerQuery->unregisterService();
registerQuery.reset();
selfService.reset();
}
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
index 102b7f3..914fab4 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
@@ -5,52 +5,59 @@
*/
#include <Swiften/LinkLocal/LinkLocalServiceInfo.h>
#include <boost/lexical_cast.hpp>
#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/Base/Algorithm.h>
#include <Swiften/Base/Concat.h>
+#include <Swiften/Base/Log.h>
namespace Swift {
-ByteArray LinkLocalServiceInfo::toTXTRecord() const {
- ByteArray result(getEncoded("txtvers=1"));
- if (!firstName.empty()) {
- append(result, getEncoded("1st=" + firstName));
- }
- if (!lastName.empty()) {
- append(result, getEncoded("last=" + lastName));
- }
- if (!email.empty()) {
- append(result, getEncoded("email=" + email));
- }
- if (jid.isValid()) {
- append(result, getEncoded("jid=" + jid.toString()));
- }
- if (!message.empty()) {
- append(result, getEncoded("msg=" + message));
- }
- if (!nick.empty()) {
- append(result, getEncoded("nick=" + nick));
- }
- if (port) {
- append(result, getEncoded("port.p2pj=" + std::string(std::to_string(*port))));
- }
+boost::optional<ByteArray> LinkLocalServiceInfo::toTXTRecord() const {
+ try {
+ ByteArray result(getEncoded("txtvers=1"));
+ if (!firstName.empty()) {
+ append(result, getEncoded("1st=" + firstName));
+ }
+ if (!lastName.empty()) {
+ append(result, getEncoded("last=" + lastName));
+ }
+ if (!email.empty()) {
+ append(result, getEncoded("email=" + email));
+ }
+ if (jid.isValid()) {
+ append(result, getEncoded("jid=" + jid.toString()));
+ }
+ if (!message.empty()) {
+ append(result, getEncoded("msg=" + message));
+ }
+ if (!nick.empty()) {
+ append(result, getEncoded("nick=" + nick));
+ }
+ if (port) {
+ append(result, getEncoded("port.p2pj=" + std::string(std::to_string(*port))));
+ }
- switch (status) {
- case Available: append(result, getEncoded("status=avail")); break;
- case Away: append(result, getEncoded("status=away")); break;
- case DND: append(result, getEncoded("status=dnd")); break;
- }
+ switch (status) {
+ case Available: append(result, getEncoded("status=avail")); break;
+ case Away: append(result, getEncoded("status=away")); break;
+ case DND: append(result, getEncoded("status=dnd")); break;
+ }
- return result;
+ return result;
+ }
+ catch (const std::exception& e) {
+ SWIFT_LOG(warning) << "Failed to create TXT record for link local service info: " << e.what() << std::endl;
+ return boost::none;
+ }
}
ByteArray LinkLocalServiceInfo::getEncoded(const std::string& s) {
ByteArray sizeByte;
sizeByte.resize(1);
sizeByte[0] = boost::numeric_cast<unsigned char>(s.size());
return concat(sizeByte, createByteArray(s));
}
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.h b/Swiften/LinkLocal/LinkLocalServiceInfo.h
index eb65706..adfd062 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.h
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.h
@@ -40,19 +40,19 @@ namespace Swift {
const std::string& getNick() const { return nick; }
void setNick(const std::string& n) { nick = n; }
Status getStatus() const { return status; }
void setStatus(Status s) { status = s; }
boost::optional<unsigned short> getPort() const { return port; }
void setPort(unsigned short p) { port = p; }
- ByteArray toTXTRecord() const;
+ boost::optional<ByteArray> toTXTRecord() const;
static LinkLocalServiceInfo createFromTXTRecord(const ByteArray& record);
private:
static ByteArray getEncoded(const std::string&);
static std::pair<std::string,std::string> readEntry(const ByteArray&, size_t*);
private:
std::string firstName;
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
index ab1ee0c..59cf996 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
@@ -109,23 +109,25 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture {
testling->cancel();
eventLoop->processEvents();
CPPUNIT_ASSERT(FakeConnection::Disconnected == connection->state);
}
private:
std::shared_ptr<LinkLocalConnector> createConnector(const std::string& hostname, unsigned short port) {
+ auto txtRecord = LinkLocalServiceInfo().toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
LinkLocalService service(
DNSSDServiceID("myname", "local."),
DNSSDResolveServiceQuery::Result(
"myname._presence._tcp.local", hostname, port,
- LinkLocalServiceInfo().toTXTRecord()));
+ *txtRecord));
std::shared_ptr<LinkLocalConnector> result(
new LinkLocalConnector(service, querier, connection));
result->onConnectFinished.connect(
boost::bind(&LinkLocalConnectorTest::handleConnected, this, _1));
return result;
}
void handleConnected(bool e) {
connectFinished = true;
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
index a80d748..3491634 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <map>
#include <memory>
#include <boost/bind.hpp>
@@ -41,22 +41,24 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testRegisterService_Reregister);
CPPUNIT_TEST(testUpdateService);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
eventLoop = new DummyEventLoop();
querier = std::make_shared<FakeDNSSDQuerier>("wonderland.lit", eventLoop);
aliceServiceID = new DNSSDServiceID("alice", "wonderland.lit");
- aliceServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.wonderland.lit", "xmpp.wonderland.lit", 1234, LinkLocalServiceInfo().toTXTRecord());
+ auto txtRecord = LinkLocalServiceInfo().toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ aliceServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.wonderland.lit", "xmpp.wonderland.lit", 1234, *txtRecord);
testServiceID = new DNSSDServiceID("foo", "bar.local");
- testServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.bar.local", "xmpp.bar.local", 1234, LinkLocalServiceInfo().toTXTRecord());
- testServiceInfo2 = new DNSSDResolveServiceQuery::Result("_presence.tcp.bar.local", "xmpp.foo.local", 2345, LinkLocalServiceInfo().toTXTRecord());
+ testServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.bar.local", "xmpp.bar.local", 1234, *txtRecord);
+ testServiceInfo2 = new DNSSDResolveServiceQuery::Result("_presence.tcp.bar.local", "xmpp.foo.local", 2345, *txtRecord);
errorStopReceived = false;
normalStopReceived = false;
}
void tearDown() {
querier->clearAllQueriesEverRun();
addedServices.clear();
removedServices.clear();
changedServices.clear();
@@ -286,73 +288,81 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
std::shared_ptr<LinkLocalServiceBrowser> testling = createTestling();
testling->start();
eventLoop->processEvents();
LinkLocalServiceInfo info;
info.setFirstName("Foo");
testling->registerService("foo@bar", 1234, info);
eventLoop->processEvents();
- CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(registeredServices.size()));
CPPUNIT_ASSERT(registeredServices[0] == DNSSDServiceID("foo@bar", "wonderland.lit"));
testling->stop();
}
void testRegisterService_Error() {
std::shared_ptr<LinkLocalServiceBrowser> testling = createTestling();
testling->start();
LinkLocalServiceInfo info;
testling->registerService("foo@bar", 1234, info);
eventLoop->processEvents();
querier->setRegisterError();
eventLoop->processEvents();
CPPUNIT_ASSERT(!testling->isRunning());
CPPUNIT_ASSERT(testling->hasError());
CPPUNIT_ASSERT(errorStopReceived);
- CPPUNIT_ASSERT(!querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(!querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
}
void testRegisterService_Reregister() {
std::shared_ptr<LinkLocalServiceBrowser> testling = createTestling();
testling->start();
eventLoop->processEvents();
LinkLocalServiceInfo info;
info.setFirstName("Foo");
testling->registerService("foo@bar", 1234, info);
eventLoop->processEvents();
testling->unregisterService();
eventLoop->processEvents();
info.setFirstName("Bar");
testling->registerService("bar@baz", 3456, info);
eventLoop->processEvents();
- CPPUNIT_ASSERT(querier->isServiceRegistered("bar@baz", 3456, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("bar@baz", 3456, *txtRecord));
testling->stop();
}
void testUpdateService() {
std::shared_ptr<LinkLocalServiceBrowser> testling = createTestling();
testling->start();
eventLoop->processEvents();
LinkLocalServiceInfo info;
info.setFirstName("Foo");
testling->registerService("foo@bar", 1234, info);
eventLoop->processEvents();
info.setFirstName("Bar");
testling->updateService(info);
- CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
testling->stop();
}
private:
std::shared_ptr<LinkLocalServiceBrowser> createTestling() {
std::shared_ptr<LinkLocalServiceBrowser> testling(
new LinkLocalServiceBrowser(querier));
testling->onServiceAdded.connect(boost::bind(
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
index 0a94a98..35cb1b4 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <QA/Checker/IO.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
@@ -23,19 +23,21 @@ class LinkLocalServiceInfoTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE_END();
public:
void testGetTXTRecord() {
LinkLocalServiceInfo info;
info.setFirstName("Remko");
info.setLastName("Tron\xc3\xe7on");
info.setStatus(LinkLocalServiceInfo::Away);
- CPPUNIT_ASSERT_EQUAL(createByteArray("\x09txtvers=1\x09" + std::string("1st=Remko\x0dlast=Tron\xc3\xe7on\x0bstatus=away")), info.toTXTRecord());
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT_EQUAL(createByteArray("\x09txtvers=1\x09" + std::string("1st=Remko\x0dlast=Tron\xc3\xe7on\x0bstatus=away")), *txtRecord);
}
void testCreateFromTXTRecord() {
LinkLocalServiceInfo info = LinkLocalServiceInfo::createFromTXTRecord(createByteArray("\x09txtvers=1\x09" + std::string("1st=Remko\x0dlast=Tron\xc3\xe7on\x0bstatus=away")));
CPPUNIT_ASSERT_EQUAL(std::string("Remko"), info.getFirstName());
CPPUNIT_ASSERT_EQUAL(std::string("Tron\xc3\xe7on"), info.getLastName());
CPPUNIT_ASSERT_EQUAL(LinkLocalServiceInfo::Away, info.getStatus());
}
@@ -51,22 +53,31 @@ class LinkLocalServiceInfoTest : public CppUnit::TestFixture {
info.setFirstName("Remko");
info.setLastName("Tron\xc3\xe7on");
info.setEMail("remko-email@swift.im");
info.setJID(JID("remko-jid@swift.im"));
info.setMessage("I'm busy");
info.setNick("el-tramo");
info.setStatus(LinkLocalServiceInfo::DND);
info.setPort(1234);
- LinkLocalServiceInfo info2 = LinkLocalServiceInfo::createFromTXTRecord(info.toTXTRecord());
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ LinkLocalServiceInfo info2 = LinkLocalServiceInfo::createFromTXTRecord(*txtRecord);
CPPUNIT_ASSERT_EQUAL(info.getFirstName(), info2.getFirstName());
CPPUNIT_ASSERT_EQUAL(info.getLastName(), info2.getLastName());
CPPUNIT_ASSERT_EQUAL(info.getEMail(), info2.getEMail());
CPPUNIT_ASSERT_EQUAL(info.getJID(), info2.getJID());
CPPUNIT_ASSERT_EQUAL(info.getMessage(), info2.getMessage());
CPPUNIT_ASSERT_EQUAL(info.getNick(), info2.getNick());
CPPUNIT_ASSERT(info.getStatus() == info2.getStatus());
CPPUNIT_ASSERT(info.getPort() == info2.getPort());
}
+
+ void testToTXTRecordWithInvalidParameter() {
+ LinkLocalServiceInfo info;
+ info.setFirstName(std::string(256, 'x'));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(!txtRecord);
+ }
};
CPPUNIT_TEST_SUITE_REGISTRATION(LinkLocalServiceInfoTest);
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
index 206d824..cb5f40a 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <Swiften/LinkLocal/LinkLocalService.h>
@@ -52,17 +52,19 @@ class LinkLocalServiceTest : public CppUnit::TestFixture {
}
private:
LinkLocalService createService(const std::string& name, const std::string& nickName = std::string(), const std::string& firstName = std::string(), const std::string& lastName = std::string()) {
DNSSDServiceID service(name, "local.");
LinkLocalServiceInfo info;
info.setFirstName(firstName);
info.setLastName(lastName);
info.setNick(nickName);
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
return LinkLocalService(service,
DNSSDResolveServiceQuery::Result(
name + "._presence._tcp.local", "rabbithole.local", 1234,
- info.toTXTRecord()));
+ *txtRecord));
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(LinkLocalServiceTest);
diff --git a/Swiften/QA/DNSSDTest/DNSSDTest.cpp b/Swiften/QA/DNSSDTest/DNSSDTest.cpp
index ae2fafd..5a78d2f 100644
--- a/Swiften/QA/DNSSDTest/DNSSDTest.cpp
+++ b/Swiften/QA/DNSSDTest/DNSSDTest.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
// TODO: Test registering on different interfaces
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <boost/bind.hpp>
@@ -29,19 +29,19 @@ using namespace Swift;
template <typename DNSSDQuerierType>
class DNSSDTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(DNSSDTest);
CPPUNIT_TEST(testPublish);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
eventLoop = new DummyEventLoop();
- querier = std::make_shared<DNSSDQuerier>();
+ querier = std::make_shared<DNSSDQuerierType>(eventLoop);
querier->start();
}
void tearDown() {
querier->stop();
querier.reset();
delete eventLoop;
}
@@ -49,19 +49,19 @@ class DNSSDTest : public CppUnit::TestFixture {
std::shared_ptr<DNSSDBrowseQuery> browseQuery = querier->createBrowseQuery();
browseQuery->onServiceAdded.connect(boost::bind(&DNSSDTest::handleServiceAdded, this, _1));
browseQuery->onServiceRemoved.connect(boost::bind(&DNSSDTest::handleServiceRemoved, this, _1));
browseQuery->onError.connect(boost::bind(&DNSSDTest::handleBrowseError, this));
browseQuery->startBrowsing();
eventLoop->processEvents();
// Publish the service
LinkLocalServiceInfo info;
- std::shared_ptr<DNSSDRegisterQuery> registerQuery = querier->createRegisterQuery("DNSSDTest", 1234, info.toTXTRecord());
+ std::shared_ptr<DNSSDRegisterQuery> registerQuery = querier->createRegisterQuery("DNSSDTest", 1234, *info.toTXTRecord());
registerQuery->onRegisterFinished.connect(boost::bind(&DNSSDTest::handleRegisterFinished, this, _1));
registerQuery->registerService();
// Wait for a while
wait();
// Check that our registered queries are correct
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>((registered.size())));
CPPUNIT_ASSERT_EQUAL(std::string("DNSSDTest"), registered[0].getName());
@@ -131,19 +131,19 @@ class DNSSDTest : public CppUnit::TestFixture {
}
void handleResolveFinished(const boost::optional<DNSSDResolveServiceQuery::Result>& result) {
CPPUNIT_ASSERT(result);
resolvedServices.push_back(*result);
}
private:
DummyEventLoop* eventLoop;
- std::shared_ptr<DNSSDQuerier> querier;
+ std::shared_ptr<DNSSDQuerierType> querier;
std::vector<DNSSDServiceID> added;
std::vector<DNSSDServiceID> registered;
std::vector<DNSSDServiceID> toRemove;
std::vector<DNSSDResolveServiceQuery::Result> resolvedServices;
};
#ifdef HAVE_AVAHI
CPPUNIT_TEST_SUITE_REGISTRATION(DNSSDTest<AvahiQuerier>);
#endif
diff --git a/Swiften/QA/DNSSDTest/SConscript b/Swiften/QA/DNSSDTest/SConscript
index 275a314..d9c9b04 100644
--- a/Swiften/QA/DNSSDTest/SConscript
+++ b/Swiften/QA/DNSSDTest/SConscript
@@ -1,21 +1,23 @@
import os
Import("env")
if env["TEST"] :
myenv = env.Clone()
myenv.MergeFlags(myenv["CHECKER_FLAGS"])
myenv.MergeFlags(myenv["SWIFTEN_FLAGS"])
myenv.MergeFlags(myenv["CPPUNIT_FLAGS"])
+ myenv.MergeFlags(myenv["GOOGLETEST_FLAGS"])
myenv.MergeFlags(myenv["BOOST_FLAGS"])
myenv.MergeFlags(myenv["LIBIDN_FLAGS"])
if myenv.get("HAVE_BONJOUR", 0) :
myenv.Append(CPPDEFINES = "HAVE_BONJOUR")
elif myenv.get("HAVE_AVAHI", 0) :
myenv.Append(CPPDEFINES = ["HAVE_AVAHI"])
myenv.MergeFlags(myenv["AVAHI_FLAGS"])
+ myenv.MergeFlags(myenv["PLATFORM_FLAGS"])
tester = myenv.Program("DNSSDTest", [
"DNSSDTest.cpp",
])
myenv.Test(tester, "system")