Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

201 lines (162 sloc) 6.753 kb
#include <boost/test/unit_test.hpp>
#include <boost/test/test_tools.hpp>
#include "darner/queue/queue.h"
#include "darner/queue/iqstream.h"
#include "darner/queue/oqstream.h"
#include "fixtures/basic_queue.hpp"
using namespace std;
using namespace boost;
using namespace boost::asio;
using namespace darner;
BOOST_AUTO_TEST_SUITE( queue_tests )
// test that we can push and pop
BOOST_FIXTURE_TEST_CASE( test_push_pop, fixtures::basic_queue )
{
string value = "I hate when I'm on a flight and I wake up with a water bottle next to me like oh great now I gotta "
"be responsible for this water bottle";
oqs_.open(queue_, 1);
oqs_.write(value);
BOOST_REQUIRE(iqs_.open(queue_));
iqs_.read(pop_value_);
BOOST_REQUIRE_EQUAL(value, pop_value_);
}
// test having nothing to pop
BOOST_FIXTURE_TEST_CASE( test_pop_empty, fixtures::basic_queue )
{
BOOST_REQUIRE(!iqs_.open(queue_));
}
// test a pop wait
BOOST_FIXTURE_TEST_CASE( test_pop_wait, fixtures::basic_queue )
{
string value = "sometimes I push the door close button on people running towards the elevator. I just need my own "
"elevator sometimes, my 7 floor sanctuary";
posix_time::ptime beg = boost::posix_time::microsec_clock::local_time();
deadline_timer timer(ios_, posix_time::milliseconds(10));
timer.async_wait(bind(&fixtures::basic_queue::delayed_push, this, ref(value), _1));
queue_->wait(100, wait_cb_);
ios_.run();
boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
BOOST_REQUIRE(!error_);
BOOST_REQUIRE_LT((end - beg).total_milliseconds(), 50); // should come back sooner than the timeout
}
// test multiple waiters
BOOST_FIXTURE_TEST_CASE( test_multiple_pop_wait, fixtures::basic_queue )
{
string value1 = "I’m just tryna keep it symmetrical";
string value2 = "Hotel robe got me feeling like a Sheik";
posix_time::ptime beg = boost::posix_time::microsec_clock::local_time();
deadline_timer timer1(ios_, posix_time::milliseconds(10));
timer1.async_wait(bind(&fixtures::basic_queue::delayed_push, this, ref(value1), _1));
deadline_timer timer2(ios_, posix_time::milliseconds(20));
timer2.async_wait(bind(&fixtures::basic_queue::delayed_push, this, ref(value2), _1));
queue_->wait(100, wait_cb_);
queue_->wait(100, wait_cb_);
ios_.run();
boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
BOOST_REQUIRE(!error_);
BOOST_REQUIRE_EQUAL(cb_count_, 2);
BOOST_REQUIRE_LT((end - beg).total_milliseconds(), 50); // should come back sooner than the timeout
}
// test the race condition where a wait callback does work that crosses it over the wait timeout
BOOST_FIXTURE_TEST_CASE( test_pop_wait_race, fixtures::basic_queue )
{
string value = "Fur pillows are hard to actually sleep on";
deadline_timer timer(ios_, posix_time::milliseconds(80));
timer.async_wait(bind(&fixtures::basic_queue::delayed_push_block, this, ref(value), _1));
queue_->wait(100, wait_cb_);
ios_.run();
BOOST_REQUIRE(!error_);
}
// now the opposite, test a pop wait timeout
BOOST_FIXTURE_TEST_CASE( test_pop_wait_timeout, fixtures::basic_queue )
{
string value = "Classical music is tight yo";
deadline_timer timer(ios_, posix_time::milliseconds(50));
timer.async_wait(bind(&fixtures::basic_queue::delayed_push, this, ref(value), _1));
queue_->wait(10, wait_cb_);
ios_.run();
BOOST_REQUIRE(error_);
}
// test that we can close and reopen a queue
BOOST_FIXTURE_TEST_CASE( test_queue_close_reopen, fixtures::basic_queue )
{
string value = "Do you know where to find marble conference tables? I’m looking to have a conference…not until I "
"get the table though";
oqs_.open(queue_, 1);
oqs_.write(value);
queue_.reset(new darner::queue(ios_, (tmp_ / "queue").string()));
BOOST_REQUIRE_EQUAL(queue_->count(), 1);
iqs_.open(queue_);
iqs_.read(pop_value_);
BOOST_REQUIRE_EQUAL(pop_value_, value);
}
// test we report count correctly
BOOST_FIXTURE_TEST_CASE( test_queue_count, fixtures::basic_queue )
{
string value = "NO ALCOHOL BEFORE TATTOOS";
oqs_.open(queue_, 1);
oqs_.write(value);
BOOST_REQUIRE_EQUAL(queue_->count(), 1);
// even beginning a pop lowers the count...
iqs_.open(queue_);
BOOST_REQUIRE_EQUAL(queue_->count(), 0);
// but returning it raises it back up
iqs_.close(false);
BOOST_REQUIRE_EQUAL(queue_->count(), 1);
}
// test overruning an oqstream raises
BOOST_FIXTURE_TEST_CASE( test_oqstream_overflow, fixtures::basic_queue )
{
string value = "I would like to thank Julius Caesar for originating my hairstyle";
oqs_.open(queue_, 1);
oqs_.write(value);
BOOST_REQUIRE_THROW(oqs_.write(value), system::system_error);
}
// test that we can push/pop multi-chunked
BOOST_FIXTURE_TEST_CASE( test_multi_chunked, fixtures::basic_queue )
{
string value1 = "I don’t ever watch dramas on a plane... I don’t be wanting to reflect";
string value2 = "I make awesome decisions in bike stores!!!";
oqs_.open(queue_, 2);
oqs_.write(value1);
BOOST_REQUIRE_EQUAL(queue_->count(), 0); // not ready yet...
BOOST_REQUIRE_EQUAL(oqs_.tell(), value1.size());
oqs_.write(value2);
BOOST_REQUIRE_EQUAL(queue_->count(), 1); // okay it's done
BOOST_REQUIRE_EQUAL(oqs_.tell(), value1.size() + value2.size());
iqs_.open(queue_);
iqs_.read(pop_value_);
BOOST_REQUIRE_EQUAL(queue_->count(), 0); // even beginning a pop lowers the count...
BOOST_REQUIRE_EQUAL(iqs_.tell(), value1.size());
BOOST_REQUIRE_EQUAL(iqs_.size(), value1.size() + value2.size());
BOOST_REQUIRE_EQUAL(pop_value_, value1);
iqs_.read(pop_value_);
BOOST_REQUIRE_EQUAL(iqs_.tell(), value1.size() + value2.size());
BOOST_REQUIRE_EQUAL(pop_value_, value2);
// finally, the delete
iqs_.close(true);
// should be nothing left to pop
BOOST_REQUIRE(!iqs_.open(queue_));
}
// test that we can cancel a multi-chunked push
BOOST_FIXTURE_TEST_CASE( test_push_cancel, fixtures::basic_queue )
{
string value = "I ordered the salmon medium instead of medium well I didn’t want to ruin the magic";
oqs_.open(queue_, 2);
oqs_.write(value);
BOOST_REQUIRE_EQUAL(oqs_.tell(), value.size());
oqs_.cancel();
// shouldn't be able to finish the push now
BOOST_REQUIRE_THROW(oqs_.write(value), system::system_error);
}
// test that we can push a value that ends in a null-zero
BOOST_FIXTURE_TEST_CASE( test_push_zero, fixtures::basic_queue )
{
string value = string("I'm sorry Taylor.") + '\0';
oqs_.open(queue_, 1);
oqs_.write(value);
iqs_.open(queue_);
iqs_.read(pop_value_);
BOOST_REQUIRE_EQUAL(value, pop_value_);
}
BOOST_AUTO_TEST_SUITE_END()
Jump to Line
Something went wrong with that request. Please try again.