Files
poco/Net/testsuite/src/HTTPCookieTest.cpp
Aleksandar Fabijanic 0c50f6241c code tidy-up
2013-06-17 21:56:53 -05:00

215 lines
6.6 KiB
C++

//
// HTTPCookieTest.cpp
//
// $Id: //poco/1.4/Net/testsuite/src/HTTPCookieTest.cpp#1 $
//
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
#include "HTTPCookieTest.h"
#include "CppUnit/TestCaller.h"
#include "CppUnit/TestSuite.h"
#include "Poco/Net/HTTPCookie.h"
#include "Poco/Timestamp.h"
#include "Poco/Timespan.h"
#include "Poco/DateTime.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include "Poco/Net/NameValueCollection.h"
#include <cstdlib>
using Poco::Timestamp;
using Poco::Timespan;
using Poco::DateTimeFormatter;
using Poco::DateTimeFormat;
using Poco::DateTime;
using Poco::Net::NameValueCollection;
using Poco::Net::HTTPCookie;
HTTPCookieTest::HTTPCookieTest(const std::string& name): CppUnit::TestCase(name)
{
}
HTTPCookieTest::~HTTPCookieTest()
{
}
void HTTPCookieTest::testCookie()
{
HTTPCookie cookie("name", "value");
assert (cookie.getName() == "name");
assert (cookie.getValue() == "value");
assert (cookie.toString() == "name=value");
cookie.setPath("/");
assert (cookie.toString() == "name=value; path=/");
cookie.setComment("comment");
assert (cookie.toString() == "name=value; path=/");
cookie.setDomain("appinf.com");
assert (cookie.toString() == "name=value; domain=appinf.com; path=/");
cookie.setSecure(true);
assert (cookie.toString() == "name=value; domain=appinf.com; path=/; secure");
cookie.setHttpOnly(true);
assert (cookie.toString() == "name=value; domain=appinf.com; path=/; secure; HttpOnly");
cookie.setHttpOnly(false);
cookie.setVersion(1);
assert (cookie.toString() == "name=\"value\"; Comment=\"comment\"; Domain=\"appinf.com\"; Path=\"/\"; secure; Version=\"1\"");
cookie.setSecure(false);
cookie.setMaxAge(100);
assert (cookie.toString() == "name=\"value\"; Comment=\"comment\"; Domain=\"appinf.com\"; Path=\"/\"; Max-Age=\"100\"; Version=\"1\"");
cookie.setHttpOnly(true);
assert (cookie.toString() == "name=\"value\"; Comment=\"comment\"; Domain=\"appinf.com\"; Path=\"/\"; Max-Age=\"100\"; HttpOnly; Version=\"1\"");
}
void HTTPCookieTest::testEscape()
{
std::string escaped = HTTPCookie::escape("this is a test!");
assert (escaped == "this%20is%20a%20test!");
escaped = HTTPCookie::escape("\n\t@,;\"'");
assert (escaped == "%0A%09@%2C%3B%22%27");
}
void HTTPCookieTest::testUnescape()
{
std::string unescaped = HTTPCookie::unescape("this%20is%20a%20test!");
assert (unescaped == "this is a test!");
unescaped = HTTPCookie::unescape("%0a%09@%2c%3b%22%27");
assert (unescaped == "\n\t@,;\"'");
}
void HTTPCookieTest::testExpiryFuture()
{
NameValueCollection nvc;
nvc.add("name", "value");
Timestamp before;
DateTime future;
//now + 1 year
future.assign(future.year() + 1,
future.month(),
future.day(),
future.hour(),
future.minute(),
future.second(),
future.millisecond(),
future.microsecond());
std::string futureExpiryString = DateTimeFormatter::format(future.timestamp(), DateTimeFormat::HTTP_FORMAT);
nvc.add("expires", futureExpiryString);
HTTPCookie cookie(nvc);
// one second off to account for expiry of time (this test is not reliable)
future.assign(future.year(),
future.month(),
future.day(),
future.hour(),
future.minute(),
future.second() - 1,
future.millisecond(),
future.microsecond());
futureExpiryString = "name=value; expires=";
DateTimeFormatter::append(futureExpiryString, future.timestamp(), DateTimeFormat::HTTP_FORMAT);
assert (cookie.toString() == futureExpiryString);
cookie.setVersion(1);
Timestamp now;
int futureAge = (int) ((future.timestamp() - now) / Timestamp::resolution());
Timestamp after;
Timespan diff = after - before; //time taken between creation of 'future' and 'now'
int margin = diff.seconds() + 1;
// assert that the cookie's max age is the number of seconds between now
// and the time indicated in the 'expires' value passed to its constructor, within a margin of error
assert (abs(cookie.getMaxAge() - futureAge) <= margin);
}
void HTTPCookieTest::testExpiryPast()
{
NameValueCollection nvc;
nvc.add("name", "value");
Timestamp before = Timestamp();
DateTime past;
// 1 year ago
past.assign(past.year() - 1,
past.month(),
past.day(),
past.hour(),
past.minute(),
past.second(),
past.millisecond(),
past.microsecond());
std::string pastExpiryString = DateTimeFormatter::format(past.timestamp(), DateTimeFormat::HTTP_FORMAT);
nvc.erase("expires");
nvc.add("expires", pastExpiryString);
HTTPCookie cookie = HTTPCookie(nvc);
assert (cookie.toString() == "name=value; expires=" + pastExpiryString);
cookie.setVersion(1);
Timestamp now = Timestamp();
int pastAge = (int) ((past.timestamp() - now) / Timestamp::resolution());
Timestamp after = Timestamp();
Timespan diff = after - before;
int margin = diff.seconds();
assert (abs(cookie.getMaxAge() - pastAge) <= margin);
}
void HTTPCookieTest::setUp()
{
}
void HTTPCookieTest::tearDown()
{
}
CppUnit::Test* HTTPCookieTest::suite()
{
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("HTTPCookieTest");
CppUnit_addTest(pSuite, HTTPCookieTest, testCookie);
CppUnit_addTest(pSuite, HTTPCookieTest, testEscape);
CppUnit_addTest(pSuite, HTTPCookieTest, testUnescape);
CppUnit_addTest(pSuite, HTTPCookieTest, testExpiryFuture);
CppUnit_addTest(pSuite, HTTPCookieTest, testExpiryPast);
return pSuite;
}