blob: 9b0c035f376ca08f9c3f2bcefcdce7ef2facb7d6 [file]
/*
*
* Licensed to the Apachef Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 "unit_test.h"
#include "BrokerFixture.h"
#include "qpid/sys/Monitor.h"
#include "qpid/sys/Thread.h"
#include "qpid/sys/Runnable.h"
#include "qpid/framing/TransferContent.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/client/Connection.h"
#include "qpid/client/Dispatcher.h"
#include "qpid/client/LocalQueue.h"
#include "qpid/client/Session.h"
#include "qpid/client/SubscriptionManager.h"
#include <boost/optional.hpp>
#include <boost/lexical_cast.hpp>
#include <vector>
QPID_AUTO_TEST_SUITE(XmlClientSessionTest)
using namespace qpid::client;
using namespace qpid::client::arg;
using namespace qpid::framing;
using namespace qpid;
using qpid::sys::Monitor;
using std::string;
using std::cout;
using std::endl;
struct DummyListener : public sys::Runnable, public MessageListener {
std::vector<Message> messages;
string name;
uint expected;
Dispatcher dispatcher;
DummyListener(Session& session, const string& n, uint ex) :
name(n), expected(ex), dispatcher(session) {}
void run()
{
dispatcher.listen(name, this);
dispatcher.run();
}
void received(Message& msg)
{
messages.push_back(msg);
if (--expected == 0)
dispatcher.stop();
}
};
class SubscribedLocalQueue : public LocalQueue {
private:
SubscriptionManager& subscriptions;
public:
SubscribedLocalQueue(SubscriptionManager& subs) : subscriptions(subs) {}
Message get () { return pop(); }
virtual ~SubscribedLocalQueue() {}
};
struct SimpleListener : public MessageListener
{
Monitor lock;
std::vector<Message> messages;
void received(Message& msg)
{
Monitor::ScopedLock l(lock);
messages.push_back(msg);
lock.notifyAll();
}
void waitFor(const uint n)
{
Monitor::ScopedLock l(lock);
while (messages.size() < n) {
lock.wait();
}
}
};
struct ClientSessionFixture : public ProxySessionFixture
{
void declareSubscribe(const string& q="odd_blue",
const string& dest="xml")
{
session.queueDeclare(queue=q);
session.messageSubscribe(queue=q, destination=dest, acquireMode=1);
session.messageFlow(destination=dest, unit=0, value=0xFFFFFFFF);//messages
session.messageFlow(destination=dest, unit=1, value=0xFFFFFFFF);//bytes
}
};
// ########### START HERE ####################################
QPID_AUTO_TEST_CASE(testXmlBinding) {
ClientSessionFixture f;
Session session = f.connection.newSession();
SubscriptionManager subscriptions(session);
SubscribedLocalQueue localQueue(subscriptions);
session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
session.queueDeclare(qpid::client::arg::queue="odd_blue");
subscriptions.subscribe(localQueue, "odd_blue");
FieldTable binding;
binding.setString("xquery", "declare variable $color external;"
"(./message/id mod 2 = 1) and ($color = 'blue')");
session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
Message message;
message.getDeliveryProperties().setRoutingKey("query_name");
message.getHeaders().setString("color", "blue");
string m = "<message><id>1</id></message>";
message.setData(m);
session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
Message m2 = localQueue.get();
BOOST_CHECK_EQUAL(m, m2.getData());
}
//### Test: Bad XML does not kill the server
//### Test: Bad XQuery does not kill the server
//### Test: Bindings persist, surviving broker restart
QPID_AUTO_TEST_SUITE_END()