HeaderTest.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2006-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 */
00022 
00023 #include "Qt.h"
00024 #include "../Header.h"
00025 #include "cppunit/extensions/HelperMacros.h"
00026 #include <iostream>
00027 #include <memory>
00028 
00029 namespace Http {
00030 namespace Testing {
00031 
00032 class HeaderTest : public CppUnit::TestFixture
00033 {
00034     CPPUNIT_TEST_SUITE(HeaderTest);
00035     CPPUNIT_TEST(testDefaultCtor);
00036     CPPUNIT_TEST(testCtorQString);
00037     CPPUNIT_TEST(testCompareTwoEqualNonEmptyHeaders);
00038     CPPUNIT_TEST(testCompareTwoEqualEmptyHeaders);
00039     CPPUNIT_TEST(testCompareTwoDifferentNonEmptyHeaders);
00040     CPPUNIT_TEST(testCompareEmptyAndNonEmptyHeaders);
00041     CPPUNIT_TEST(testValidParse);
00042     CPPUNIT_TEST(testCaseInsensitiveParse);
00043     CPPUNIT_TEST(testInvalidElemsParse);
00044     CPPUNIT_TEST(testLeadTrailingLWS);
00045     CPPUNIT_TEST(testDuplicateFields);
00046     CPPUNIT_TEST(testQuotedStringInValue);
00047     CPPUNIT_TEST(testHeaderFieldOnMultipleLines);
00048     CPPUNIT_TEST(testCTLsInValue);
00049     //CPPUNIT_TEST(testContentLength); // \todo we don't want failing tests
00050     //CPPUNIT_TEST(testContentLocation); // \todo we don't want failing tests
00051     //CPPUNIT_TEST(testLanguageTags); // \todo we don't want failing tests
00052     //CPPUNIT_TEST(testLastModified); // \todo we don't want failing tests
00053     CPPUNIT_TEST(testToString);
00054     CPPUNIT_TEST_SUITE_END();
00055     std::auto_ptr<Header> m_p;
00056 
00057     std::auto_ptr<Header> makeNewHeader (const char* msg) const
00058     {
00059         std::auto_ptr<Header> p (new Header (msg));
00060         return p;
00061     }
00062 
00063     QString getFieldValues(const char* field) const
00064     {
00065         QStringList fieldValues = m_p->fieldValues (field);
00066         QString fieldValuesString = fieldValues.join(":");
00067         return fieldValuesString;
00068     }
00069 
00070     QString getFields() const
00071     {
00072         QStringList fields = m_p->fields();
00073         QString fieldsString = fields.join (":");
00074         return fieldsString;
00075     }
00076 
00077 public:
00078     HeaderTest() : m_p()
00079     {
00080     }
00081 
00082     void setUp()
00083     {
00084         m_p.reset (new Header);
00085     }
00086 
00087     void tearDown()
00088     {
00089     }
00090 
00091     void testDefaultCtor()
00092     {
00093         CPPUNIT_ASSERT (m_p->isValid());
00094     }
00095 
00096     void testCtorQString()
00097     {
00098         m_p = makeNewHeader ("http://this\nthat");
00099         CPPUNIT_ASSERT( m_p->isValid() == false );
00100     }
00101 
00102     void testCompareTwoEqualNonEmptyHeaders()
00103     {
00104         std::auto_ptr<Header> header1 = makeNewHeader ("http://this\nthat:1,2,3,4,5");
00105         std::auto_ptr<Header> header2 = makeNewHeader ("http://this\nthat:1,2,3,4,5");
00106 
00107         CPPUNIT_ASSERT (*header1 == *header2);
00108         CPPUNIT_ASSERT (!(*header1 != *header2));
00109     }
00110 
00111     void testCompareTwoEqualEmptyHeaders()
00112     {
00113         std::auto_ptr<Header> header1 = makeNewHeader ("");
00114         std::auto_ptr<Header> header2 = makeNewHeader ("");
00115 
00116         CPPUNIT_ASSERT (*header1 == *header2);
00117         CPPUNIT_ASSERT (!(*header1 != *header2));
00118     }
00119 
00120     void testCompareTwoDifferentNonEmptyHeaders()
00121     {
00122         std::auto_ptr<Header> header1 = makeNewHeader ("http://this\nthat:1,2,3,4,5");
00123         std::auto_ptr<Header> header2 = makeNewHeader ("http://five\nsix:7,8");
00124 
00125         CPPUNIT_ASSERT (*header1 != *header2);
00126         CPPUNIT_ASSERT (!(*header1 == *header2));
00127     }
00128 
00129     void testCompareEmptyAndNonEmptyHeaders()
00130     {
00131         std::auto_ptr<Header> header1 = makeNewHeader ("");
00132         std::auto_ptr<Header> header2 = makeNewHeader ("http://five\nsix:7,8");
00133 
00134         CPPUNIT_ASSERT (*header1 != *header2);
00135         CPPUNIT_ASSERT (!(*header1 == *header2));
00136     }
00137 
00138     void testValidParse()
00139     {
00140         m_p = makeNewHeader ("http://this\nthat:1,2,3,4,5");
00141         CPPUNIT_ASSERT (m_p->isValid() == true);
00142         CPPUNIT_ASSERT (getFields() == "http:that");
00143         CPPUNIT_ASSERT (getFieldValues("http") == "//this");
00144         CPPUNIT_ASSERT (getFieldValues("that") == "1:2:3:4:5");
00145     }
00146 
00147     void testInvalidElemsParse()
00148     {
00149         m_p = makeNewHeader ("http:1,2,3,4,5\nInvalid");
00150         CPPUNIT_ASSERT (m_p->isValid() == false);
00151         CPPUNIT_ASSERT (getFields() == "http");
00152         CPPUNIT_ASSERT (getFieldValues("http") == "1:2:3:4:5");
00153     }
00154 
00155     void testCaseInsensitiveParse()
00156     {
00157         m_p = makeNewHeader ("http:1,2,3,4,5");
00158         CPPUNIT_ASSERT (getFieldValues("HTtP") == "1:2:3:4:5");
00159     }
00160 
00161     void testCTLsInValue()
00162     {
00163         m_p = makeNewHeader ("http:1,2,3,4,),@,="); // shouldn't work?
00164         CPPUNIT_ASSERT (m_p->isValid() == true);
00165         CPPUNIT_ASSERT (getFieldValues("http") == "1:2:3:4:):@:=");
00166     }
00167 
00168     void testLeadTrailingLWS()
00169     {
00170         m_p = makeNewHeader("http:    p,q,  r,  s   ");
00171         CPPUNIT_ASSERT (m_p->isValid() == true);
00172         CPPUNIT_ASSERT (getFieldValues("http") == "p:q:r:s");
00173     }
00174 
00175     void testDuplicateFields()
00176     {
00177         m_p = makeNewHeader("http:1,2,3\nhttp:4,5,6");
00178         CPPUNIT_ASSERT (m_p->isValid() == true);
00179         CPPUNIT_ASSERT (getFieldValues("http") == "1:2:3:4:5:6");
00180     }
00181 
00182     void testQuotedStringInValue()
00183     {
00184         m_p = makeNewHeader("http:1,2, \"three and four\", 5");
00185         CPPUNIT_ASSERT (m_p->isValid() == true);
00186         CPPUNIT_ASSERT (getFieldValues("http") == "1:2:\"three and four\":5");
00187     }
00188 
00189     /* Header fields can be extended over multiple lines by
00190        preceding each extra line with at least one SP or HT. */
00191     /* Why does this fail? */
00192     void testHeaderFieldOnMultipleLines()
00193     {
00194         m_p = makeNewHeader("http:1,2\n ppp:3,4\n qqq:5,6");
00195         CPPUNIT_ASSERT (m_p->isValid() == true);
00196         CPPUNIT_ASSERT (getFieldValues("http") == "1:2 ppp:3:4 qqq:5:6");
00197     }
00198 
00199     /* check the content-length constraints HTTP RFC 14.14 */
00200     void testContentLength()
00201     {
00202         m_p = makeNewHeader("Content-Length : 3455");
00203         CPPUNIT_ASSERT (m_p->isValid());
00204         CPPUNIT_ASSERT (getFieldValues("Content-Length") == "3455");
00205         m_p = makeNewHeader("Content-Length : 0");
00206         CPPUNIT_ASSERT (m_p->isValid());
00207         CPPUNIT_ASSERT (getFieldValues("Content-Length") == "0");
00208         m_p = makeNewHeader("Content-Length : -44");
00209         CPPUNIT_ASSERT (m_p->isValid() == false ); /* Does not work */
00210         // CPPUNIT_ASSERT (getFieldValues("Content-Length") == "-44");
00211     }
00212 
00213     /* check the content-location constraints */
00214     void testContentLocation()
00215     {
00216         m_p = makeNewHeader("Content-Location : absoluteURI");
00217         CPPUNIT_ASSERT (m_p->isValid());
00218         CPPUNIT_ASSERT (getFieldValues("Content-Location") == "absoluteURI");
00219         m_p = makeNewHeader("Content-Location : relativeURI");
00220         CPPUNIT_ASSERT (m_p->isValid());
00221         CPPUNIT_ASSERT (getFieldValues("Content-Location") == "relativeURI");
00222         m_p = makeNewHeader("Content-Location : InvalidURI");
00223         CPPUNIT_ASSERT (m_p->isValid() == false);
00224         // CPPUNIT_ASSERT (getFieldValues("Content-Location") == "InvalidURI");
00225     }
00226 
00227     /* HTTP RFC 3.10 */
00228     void testLanguageTags()
00229     {
00230         m_p = makeNewHeader("Content-Language : da");
00231         CPPUNIT_ASSERT (m_p->isValid());
00232         CPPUNIT_ASSERT (getFieldValues("Content-Language") == "da");
00233         m_p = makeNewHeader("Content-Language : xxxxxxxxxxxx");
00234         CPPUNIT_ASSERT (m_p->isValid() == false);
00235     }
00236 
00237     /* HTTP RFC 14.29 */
00238     void testLastModified()
00239     {
00240         m_p = makeNewHeader("Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT");
00241         CPPUNIT_ASSERT (m_p->isValid());
00242         CPPUNIT_ASSERT (getFieldValues("Last-Modified") == "Tue, 15 Nov 1994 12:45:26 GMT");
00243         m_p = makeNewHeader("Last-Modified: XYZ");
00244         CPPUNIT_ASSERT (m_p->isValid() == false);
00245     }
00246 
00247     void testToString()
00248     {
00249         m_p = makeNewHeader ("Last-Modified: XYZ");
00250         CPPUNIT_ASSERT (m_p->isValid());
00251         CPPUNIT_ASSERT (m_p->toString() == "Last-Modified: XYZ\r\n");
00252         m_p = makeNewHeader ("http://this\nthat:1,2,3,4,5");
00253         CPPUNIT_ASSERT (m_p->isValid());
00254         QString expected = "http: //this\r\nthat: 1, 2, 3, 4, 5\r\n";
00255         CPPUNIT_ASSERT (m_p->toString() == expected);
00256         char given[] = "http:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
00257         m_p = makeNewHeader(given);
00258         QString got = m_p->toString();
00259         expected = "http:\r\n\txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n";
00260         CPPUNIT_ASSERT (m_p->isValid() == true);
00261         CPPUNIT_ASSERT (expected == got);
00262     }
00263 };
00264 CPPUNIT_TEST_SUITE_REGISTRATION(HeaderTest);
00265 
00266 } // namespace Testing
00267 } // namespace Http