HeaderBaseTest.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 "../HeaderBase.h"
00025 #include "Imports.cpp"
00026 
00027 namespace Protocols {
00028 namespace Http {
00029 namespace Testing {
00030 
00032 
00034 class HeaderBaseTest : public CppUnit::TestFixture
00035 {
00036     CPPUNIT_TEST_SUITE (HeaderBaseTest);
00037     CPPUNIT_TEST (testParseInvalidOneLineHeader);
00038     CPPUNIT_TEST (testParseInvalidOneLineHeader);
00039     CPPUNIT_TEST (testParseWriteEmptyHeader);
00040     CPPUNIT_TEST (testParseWriteOneHeaderFieldNoValue);
00041     CPPUNIT_TEST (testParseWriteOneHeaderFieldOneValue);
00042     CPPUNIT_TEST (testParseWriteOneHeaderFieldTwoValues);
00043     CPPUNIT_TEST (testParseTwoHeaderFieldsWithSameName);
00044     CPPUNIT_TEST (testParseOneHeaderFieldBrokenOnMultipleLines);
00045     CPPUNIT_TEST (testParseOneHeaderFieldLfTerminated);
00046     CPPUNIT_TEST (testParseHeaderNotCrLfTerminated);
00047     CPPUNIT_TEST (testParseWriteTwoHeaderFields);
00048     CPPUNIT_TEST (testSetFieldValueClearsOldFieldValues);
00049     CPPUNIT_TEST (testRemoveHeaderField);
00050     CPPUNIT_TEST (testFieldValueGetters);
00051     CPPUNIT_TEST (testFieldNameGetters);
00052     CPPUNIT_TEST (testVirtualCtor);
00053     CPPUNIT_TEST_SUITE_END();
00054 
00055     HeaderBase          header;
00056     HeaderBase          header2;
00057 
00058 public:
00059     HeaderBaseTest() : header()
00060     {}
00061 
00062     void setUp()
00063     {
00064         header = HeaderBase();
00065         header2 = HeaderBase();
00066     }
00067 
00068     void testParseInvalidOneLineHeader()
00069     {
00070         bool parsed = header.parse ("non header line\r\n");
00071         CPPUNIT_ASSERT (parsed == false);
00072     }
00073 
00074     void testParseInvalidTwoLineHeader()
00075     {
00076         bool parsed = header.parse ("header-field: value\r\n"
00077                                     "non header line\r\n");
00078         CPPUNIT_ASSERT (parsed == false);
00079     }
00080 
00081     void scenarioWriteHeader (const QByteArray &rawHeader,
00082                               const HeaderBase &header)
00083     {
00084         QByteArray writtenRawHeader = header.toRawBytes();
00085         CPPUNIT_ASSERT (writtenRawHeader == rawHeader);
00086     }
00087 
00088     void scenarioParseHeader (const QByteArray &rawHeader,
00089                               const HeaderBase &header,
00090                               bool parses = true)
00091     {
00092         HeaderBase parsedHeader;
00093         bool parsed = parsedHeader.parse (rawHeader);
00094         CPPUNIT_ASSERT (parsed == parses);
00095         CPPUNIT_ASSERT (header == parsedHeader);
00096     }
00097 
00098     void scenarioParseAndWriteHeader (const QByteArray &rawHeader,
00099                                       const HeaderBase &header)
00100     {
00101         scenarioWriteHeader (rawHeader, header);
00102         scenarioParseHeader (rawHeader, header);
00103     }
00104 
00105     void testParseWriteEmptyHeader()
00106     {
00107         scenarioParseAndWriteHeader ("\r\n", header);
00108     }
00109 
00110     void testParseWriteOneHeaderFieldNoValue()
00111     {
00112         header.setFieldValue ("Header-Field", "");
00113         scenarioParseAndWriteHeader ("Header-Field:\r\n\r\n", header);
00114     }
00115 
00116     void testParseWriteOneHeaderFieldOneValue()
00117     {
00118         header.setFieldValue ("Header-Field", "value");
00119         scenarioParseAndWriteHeader ("Header-Field: value\r\n\r\n", header);
00120     }
00121 
00122     void testParseWriteOneHeaderFieldTwoValues()
00123     {
00124         header.setFieldValue ("Header-Field", "value1, value2");
00125         scenarioParseAndWriteHeader ("Header-Field: value1, value2\r\n\r\n",
00126                                      header);
00127     }
00128 
00129     void testParseTwoHeaderFieldsWithSameName()
00130     {
00131         header.setFieldValue ("Header-Field", "value1, value2");
00132         scenarioParseHeader ("Header-Field: value1\r\n"
00133                              "Header-Field: value2\r\n",
00134                              header);
00135     }
00136 
00137     void testParseOneHeaderFieldBrokenOnMultipleLines()
00138     {
00139         header.setFieldValue ("Header-Field", "value1, value2");
00140         scenarioParseHeader ("Header-Field: value1,\r\n\tvalue2\r\n", header);
00141     }
00142 
00143     void testParseOneHeaderFieldLfTerminated()
00144     {
00145         header.setFieldValue ("Header-Field", "value");
00146         scenarioParseHeader ("Header-Field: value\n", header);
00147     }
00148 
00149     void testParseHeaderNotCrLfTerminated()
00150     {
00151         header.setFieldValue ("Header-Field", "value");
00152         scenarioParseHeader ("Header-Field: value", header);
00153     }
00154 
00155     void testParseWriteTwoHeaderFields()
00156     {
00157         header.setFieldValue ("Header-Field1", "value1");
00158         header.setFieldValue ("Header-Field2", "value2");
00159         scenarioParseAndWriteHeader ("Header-Field1: value1\r\n"
00160                                      "Header-Field2: value2\r\n"
00161                                      "\r\n",
00162                                      header);
00163     }
00164 
00165     void testSetFieldValueClearsOldFieldValues()
00166     {
00167         header.setFieldValue ("Header-Field", "value1");
00168         header.setFieldValue ("Header-Field", "value2");
00169         header2.setFieldValue ("Header-Field", "value2");
00170         CPPUNIT_ASSERT (header == header2);
00171     }
00172 
00173     void testAddFieldValueAppendsValues()
00174     {
00175         header.addFieldValue ("Header-Field", "value1");
00176         header.addFieldValue ("Header-Field", "value2");
00177         header2.setFieldValue ("Header-Field", "value1, value2");
00178         CPPUNIT_ASSERT (header == header2);
00179     }
00180 
00181     void testRemoveHeaderField()
00182     {
00183         header.setFieldValue ("Header-Field", "value");
00184         header.removeField ("Header-Field");
00185         CPPUNIT_ASSERT (header == HeaderBase());
00186     }
00187 
00188     void testFieldValueGetters()
00189     {
00190         header.setFieldValue ("Header-Field", "value1, value2");
00191         CPPUNIT_ASSERT (header.fieldValue ("Header-Field") == "value1, value2");
00192         QList <QByteArray> values;
00193         values.append ("value1");
00194         values.append ("value2");
00195         CPPUNIT_ASSERT (header.fieldValues ("Header-Field") == values);
00196     }
00197 
00198     void testFieldNameGetters()
00199     {
00200         header.setFieldValue ("Header-Field1", "");
00201         header.setFieldValue ("Header-Field2", "value2");
00202         CPPUNIT_ASSERT (header.hasField ("Header-Field1"));
00203         CPPUNIT_ASSERT (header.hasField ("Header-Field2"));
00204         CPPUNIT_ASSERT (!header.hasField ("Not-Set-Field"));
00205         QList <QByteArray> names;
00206         // Note that the field names are returned in lower case:
00207         names.append ("header-field1");
00208         names.append ("header-field2");
00209         CPPUNIT_ASSERT (header.fields() == names);
00210     }
00211 
00212     void testVirtualCtor()
00213     {
00214         header.setFieldValue ("Header-Field1", "");
00215         auto_ptr <DataBase> copy = header.copy();
00216         CPPUNIT_ASSERT (typeid (*copy) == typeid (header));
00217         CPPUNIT_ASSERT (dynamic_cast <HeaderBase &> (*copy) == header);
00218     }
00219 };
00220 
00221 CPPUNIT_TEST_SUITE_REGISTRATION(HeaderBaseTest);
00222 
00223 } // namespace Testing
00224 } // namespace Http
00225 } // namespace Protocols