main-acceptance.cpp

Go to the documentation of this file.
00001 #include "Qt.h"
00002 #include "Utils/CalitkoMocks/TesterApplication.h"
00003 #include "3rdParty/cppunit/extensions/TestFactoryRegistry.h"
00004 #include "3rdParty/cppunit/ui/text/TestRunner.h"
00005 
00030 #include "Utils/CalitkoMocks/CoCppUnit.h"
00031 #include "Utils/CalitkoMocks/Mocks.h"
00032 #include "Protocols/Http/ClientHttpSession.h"
00033 #include "Protocols/Http/ClientHttpSessionFactory.h"
00034 #include "Protocols/Http/ClientHttpSessionStatus.h"
00035 #include "Protocols/Http/HeaderBase.h"
00036 #include "Protocols/Http/ResponseHeader.h"
00037 #include "Protocols/Generics/IpResolvingTransportFactory.h"
00038 #include "Protocols/Generics/TcpTransportFactory.h"
00039 #include "Protocols/Generics/QtNameResolver.h"
00040 
00041 #include <iostream>
00042 
00043 class MemoryFile : public Protocols::Http::File
00044 {
00045 public:
00046     bool write (const QByteArray &bytes, bool = true)
00047     {
00048         bytes_ += bytes;
00049         return true;
00050     }
00051 
00052     QByteArray bytes_;
00053 };
00054 
00055 using Protocols::Generics::Data;
00056 using Protocols::Generics::IpResolvingTransportFactory;
00057 using Protocols::Generics::TcpTransportFactory;
00058 using Protocols::Generics::TransportFactory;
00059 using Protocols::Generics::QtNameResolver;
00060 using Protocols::Http::ClientHttpSession;
00061 using Protocols::Http::ClientHttpSessionFactory;
00062 using Protocols::Http::HeaderBase;
00063 using Protocols::Http::ResponseHeader;
00064 using namespace Utils::CalitkoMocks;
00065 using Utils::Uri;
00066 
00067 class HttpDownloader : public Protocols::Http::ClientHttpSessionFactoryStatus,
00068                        public Protocols::Http::ClientHttpSessionStatus
00069 {
00070     ClientHttpSessionFactory    clientHttpSessionFactory_;
00071     ClientHttpSession           *session_;
00072     MemoryFile                  memoryFile;
00073 
00074 public:
00075     HttpDownloader (TransportFactory *transportFactory)
00076      :  clientHttpSessionFactory_ (transportFactory),
00077         session_ (0),
00078         memoryFile()
00079     {
00080     }
00081 
00082     ~HttpDownloader()
00083     {
00084     }
00085 
00086     void download (const QByteArray &url)
00087     {
00088         qDebug() << "starting" << url;
00089         clientHttpSessionFactory_.createSession (Uri::fromUnencoded (url), this, this);
00090     }
00091 
00092     // Interface  ClientHttpSessionFactoryStatus:
00093     void clientHttpSessionFactorySucceeded (const Uri &uri,
00094                                             ClientHttpSession *session)
00095     {
00096         session_ = session;
00097         session_->open(); // Enables reading and writing.
00098         session_->get (uri, &memoryFile);
00099     }
00100 
00101     void clientHttpSessionFactoryFailed (const Uri &)
00102     {
00103         qDebug() << "FAILED to open session!";
00104         done();
00105     }
00106 
00107     // Interface  ClientHttpSessionStatus:
00108     void clientHttpSessionResponseStarted (const ResponseHeader &header)
00109     {
00110         qDebug() << "Response Header:";
00111         qDebug() << header.toRawBytes();
00112     }
00113 
00114     void clientHttpSessionResponseFinished (const HeaderBase &header)
00115     {
00116         qDebug() << "FINISHED";
00117         qDebug() << header.toRawBytes();
00118         qDebug() << "Response DATA:";
00119         std::cout.write (memoryFile.bytes_.constData(), memoryFile.bytes_.size());
00120         session_->close();
00121     }
00122 
00123     void clientHttpSessionInvaidResponse (const Data &)
00124     {
00125         qDebug() << "INVALID RESPONSE";
00126         done();
00127     }
00128 
00129     void clientHttpSessionClosing()
00130     {
00131         qDebug() << "Closing session...";
00132     }
00133 
00134     void clientHttpSessionClosed()
00135     {
00136         qDebug() << "Session closed.";
00137         done();
00138     }
00139 
00140 private:
00141     void done()
00142     {
00143         if (session_ != 0)
00144             clientHttpSessionFactory_.destroySession (session_);
00145         QCoreApplication::exit(0);
00146     }
00147 };
00148 
00149 class AcceptanceEnvironment
00150 {
00151 public:
00152     QtNameResolver                  qtNameResolver;
00153     TcpTransportFactory             tcpTransportFactory;
00154 };
00155 
00156 class CalitkoApplication
00157 {
00158     IpResolvingTransportFactory     ipResolvingTransportFactory_;
00159 
00160 public:
00161     // Services:
00162     HttpDownloader      downloader;
00163 
00164     CalitkoApplication (AcceptanceEnvironment *);
00165     ~CalitkoApplication();
00166 };
00167 
00168 CalitkoApplication::CalitkoApplication (AcceptanceEnvironment *environment)
00169  :  ipResolvingTransportFactory_ (&environment->tcpTransportFactory,
00170                                   &environment->qtNameResolver),
00171     downloader (&ipResolvingTransportFactory_)
00172 {
00173 }
00174 
00175 CalitkoApplication::~CalitkoApplication()
00176 {
00177 }
00178 
00179 class HttpDownloadAcceptance : public CppUnit::TestFixture
00180 {
00181     CPPUNIT_TEST_SUITE (HttpDownloadAcceptance);
00182     CPPUNIT_TEST (testDownloadHttpResourceAtOnce);
00183     CPPUNIT_TEST_SUITE_END();
00184 
00185     auto_ptr <AcceptanceEnvironment>    environment;
00186     auto_ptr <CalitkoApplication>       calitko;
00187 
00188 public:
00189     void setUp()
00190     {
00191         environment.reset (new AcceptanceEnvironment);
00192         calitko.reset (new CalitkoApplication (environment.get()));
00193     }
00194 
00195     void tearDown()
00196     {
00197         calitko.reset();
00198         environment.reset();
00199     }
00200 
00231     void testDownloadHttpResourceAtOnce()
00232     {
00233         //QByteArray tcpScript = "TODO";
00234         //environment->nameResolver->addMapping ("bzr.calitko.org",
00235         //                                     "123.123.123.123");
00236         //environment->socketFactory->addMapping ("123.123.123.123", 80,
00237         //                                      tcpScript);
00238         // \todo DownloadingService???
00239         HttpDownloader *downloader = &calitko->downloader;
00240         downloader->download ("http://bzr.calitko.org/developers/peter/");
00241         //downloader->download ("http://123.123.123.123/developers/peter/");
00242         CPPUNIT_ASSERT (TesterApplication::exec(10000) == 0);
00243     }
00244 };
00245 
00246 CPPUNIT_TEST_SUITE_REGISTRATION (HttpDownloadAcceptance);
00247 
00248 using namespace CppUnit;
00249 
00250 int main(int argc, char** argv)
00251 {
00252     TesterApplication app (argc, argv);
00253     TextUi::TestRunner runner;
00254     TestFactoryRegistry &registry = TestFactoryRegistry::getRegistry();
00255     runner.addTest (registry.makeTest());
00256     bool wasSuccessful = runner.run ("", false);
00257     return !wasSuccessful;
00258 }