// // 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 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; }