⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpclientsessiontest.cpp

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 CPP
字号:
//// FTPClientSessionTest.cpp//// $Id: //poco/1.2/Net/testsuite/src/FTPClientSessionTest.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 "FTPClientSessionTest.h"#include "CppUnit/TestCaller.h"#include "CppUnit/TestSuite.h"#include "DialogServer.h"#include "Poco/Net/FTPClientSession.h"#include "Poco/Net/DialogSocket.h"#include "Poco/Net/SocketAddress.h"#include "Poco/Net/NetException.h"#include "Poco/Thread.h"#include "Poco/ActiveMethod.h"#include "Poco/StreamCopier.h"#include <sstream>using Poco::Net::FTPClientSession;using Poco::Net::DialogSocket;using Poco::Net::SocketAddress;using Poco::Net::FTPException;using Poco::ActiveMethod;using Poco::ActiveResult;using Poco::StreamCopier;using Poco::Thread;namespace{	class ActiveDownloader	{	public:		ActiveDownloader(FTPClientSession& session):			download(this, &ActiveDownloader::downloadImp),			_session(session)		{		}				ActiveMethod<std::string, std::string, ActiveDownloader> download;			protected:		std::string downloadImp(const std::string& path)		{			std::istream& istr = _session.beginDownload(path);			std::ostringstream ostr;			StreamCopier::copyStream(istr, ostr);			_session.endDownload();			return ostr.str();		}			private:		FTPClientSession& _session;	};};FTPClientSessionTest::FTPClientSessionTest(const std::string& name): CppUnit::TestCase(name){}FTPClientSessionTest::~FTPClientSessionTest(){}void FTPClientSessionTest::testLogin(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	std::string cmd = server.popCommand();	assert (cmd == "USER user");	cmd = server.popCommand();	assert (cmd == "PASS password");	cmd = server.popCommand();	assert (cmd == "TYPE I");		assert (session.getFileType() == FTPClientSession::TYPE_BINARY);		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testLoginFailed1(){	DialogServer server;	server.addResponse("421 localhost FTP not ready");	FTPClientSession session("localhost", server.port());	try	{		session.login("user", "password");		fail("server not ready - must throw");	}	catch (FTPException&)	{	}	server.addResponse("221 Good Bye");		session.close();}void FTPClientSessionTest::testLoginFailed2(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("530 Login incorrect");	FTPClientSession session("localhost", server.port());	try	{		session.login("user", "password");		fail("login incorrect - must throw");	}	catch (FTPException&)	{	}	server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testCommands(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	std::string cmd = server.popCommand();	assert (cmd == "USER user");	cmd = server.popCommand();	assert (cmd == "PASS password");	cmd = server.popCommand();	assert (cmd == "TYPE I");		// systemType	server.clearCommands();	server.addResponse("215 UNIX Type: L8 Version: dummyFTP 1.0");	std::string type = session.systemType();	cmd = server.popCommand();	assert (cmd == "SYST");	assert (type == "UNIX Type: L8 Version: dummyFTP 1.0");		// getWorkingDirectory	server.addResponse("257 \"/usr/test\" is current directory");	std::string cwd = session.getWorkingDirectory();	cmd = server.popCommand();	assert (cmd == "PWD");	assert (cwd == "/usr/test");	// getWorkingDirectory (quotes in filename)	server.addResponse("257 \"\"\"quote\"\"\" is current directory");	cwd = session.getWorkingDirectory();	cmd = server.popCommand();	assert (cmd == "PWD");	assert (cwd == "\"quote\"");		// setWorkingDirectory	server.addResponse("250 CWD OK");	session.setWorkingDirectory("test");	cmd = server.popCommand();	assert (cmd == "CWD test");		server.addResponse("250 CDUP OK");	session.cdup();	cmd = server.popCommand();	assert (cmd == "CDUP");		// rename	server.addResponse("350 File exists, send destination name");	server.addResponse("250 Rename OK");	session.rename("old.txt", "new.txt");	cmd = server.popCommand();	assert (cmd == "RNFR old.txt");	cmd = server.popCommand();	assert (cmd == "RNTO new.txt");		// rename (failing)	server.addResponse("550 not found");	try	{		session.rename("old.txt", "new.txt");		fail("not found - must throw");	}	catch (FTPException&)	{	}	server.clearCommands();		// remove	server.addResponse("250 delete ok");	session.remove("test.txt");	cmd = server.popCommand();	assert (cmd == "DELE test.txt");	// remove (failing)	server.addResponse("550 not found");	try	{		session.remove("test.txt");		fail("not found - must throw");	}	catch (FTPException&)	{	}	server.clearCommands();	// createDirectory	server.addResponse("257 dir created");	session.createDirectory("foo");	cmd = server.popCommand();	assert (cmd == "MKD foo");	// createDirectory (failing)	server.addResponse("550 exists");	try	{		session.createDirectory("foo");		fail("not found - must throw");	}	catch (FTPException&)	{	}	server.clearCommands();	// removeDirectory	server.addResponse("250 RMD OK");	session.removeDirectory("foo");	cmd = server.popCommand();	assert (cmd == "RMD foo");	// removeDirectory (failing)	server.addResponse("550 not found");	try	{		session.removeDirectory("foo");		fail("not found - must throw");	}	catch (FTPException&)	{	}	server.clearCommands();			server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testDownloadPORT(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.setPassive(false);	session.login("user", "password");	server.clearCommands();		server.addResponse("500 EPRT not understood");	server.addResponse("200 PORT OK");	server.addResponse("150 Sending data\r\n226 Transfer complete");	ActiveDownloader dl(session);	ActiveResult<std::string> result = dl.download("test.txt");			std::string cmd = server.popCommandWait();	assert (cmd.substr(0, 4) == "EPRT");		cmd = server.popCommandWait();	assert (cmd.substr(0, 4) == "PORT");	std::string dummy;	int x, lo, hi;	for (std::string::iterator it = cmd.begin(); it != cmd.end(); ++it)	{		if (*it == ',') *it = ' ';	}	std::istringstream istr(cmd);	istr >> dummy >> x >> x >> x >> x >> hi >> lo;	int port = hi*256 + lo;	cmd = server.popCommandWait();	assert (cmd == "RETR test.txt");	SocketAddress sa("localhost", (Poco::UInt16) port);	DialogSocket dataSock;	dataSock.connect(sa);	std::string data("This is some data");	dataSock.sendString(data);	dataSock.close();	result.wait();	std::string received = result.data();	assert (received == data);		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testDownloadEPRT(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.setPassive(false);	session.login("user", "password");	server.clearCommands();		server.addResponse("200 EPRT OK");	server.addResponse("150 Sending data\r\n226 Transfer complete");	ActiveDownloader dl(session);	ActiveResult<std::string> result = dl.download("test.txt");			std::string cmd = server.popCommandWait();	assert (cmd.substr(0, 4) == "EPRT");		std::string dummy;	char c;	int d;	int port;	std::istringstream istr(cmd);	istr >> dummy >> c >> d >> c >> d >> c >> d >> c >> d >> c >> d >> c >> port >> c;		cmd = server.popCommandWait();	assert (cmd == "RETR test.txt");		SocketAddress sa("localhost", (Poco::UInt16) port);	DialogSocket dataSock;	dataSock.connect(sa);	std::string data("This is some data");	dataSock.sendString(data);	dataSock.close();	result.wait();	std::string received = result.data();	assert (received == data);		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testDownloadPASV(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	server.clearCommands();	server.addResponse("500 EPSV not understood");	DialogServer dataServer(false);	dataServer.addResponse("This is some data");	std::ostringstream pasv;	pasv << "227 Entering Passive Mode (127,0,0,1," << (dataServer.port()/256) << "," << (dataServer.port() % 256) << ")";	server.addResponse(pasv.str());	server.addResponse("150 sending data\r\n226 Transfer complete");	std::istream& istr = session.beginDownload("test.txt");	std::ostringstream dataStr;	StreamCopier::copyStream(istr, dataStr);	session.endDownload();	std::string s(dataStr.str());	assert (s == "This is some data\r\n");		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testDownloadEPSV(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	server.clearCommands();	DialogServer dataServer(false);	dataServer.addResponse("This is some data");	std::ostringstream epsv;	epsv << "229 Entering Extended Passive Mode (|||" << dataServer.port() << "|)";	server.addResponse(epsv.str());	server.addResponse("150 sending data\r\n226 Transfer complete");	std::istream& istr = session.beginDownload("test.txt");	std::ostringstream dataStr;	StreamCopier::copyStream(istr, dataStr);	session.endDownload();	std::string s(dataStr.str());	assert (s == "This is some data\r\n");		std::string cmd = server.popCommand();	assert (cmd.substr(0, 4) == "EPSV");	cmd = server.popCommand();	assert (cmd == "RETR test.txt");		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testUpload(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	server.clearCommands();	DialogServer dataServer;	std::ostringstream epsv;	epsv << "229 Entering Extended Passive Mode (|||" << dataServer.port() << "|)";	server.addResponse(epsv.str());	server.addResponse("150 send data\r\n226 Transfer complete");	std::ostream& ostr = session.beginUpload("test.txt");	ostr << "This is some data\r\n";	session.endUpload();	std::string s(dataServer.popCommandWait());	assert (s == "This is some data");	std::string cmd = server.popCommand();	assert (cmd.substr(0, 4) == "EPSV");	cmd = server.popCommand();	assert (cmd == "STOR test.txt");	server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::testList(){	DialogServer server;	server.addResponse("220 localhost FTP ready");	server.addResponse("331 Password required");	server.addResponse("230 Welcome");	server.addResponse("200 Type set to I");	FTPClientSession session("localhost", server.port());	session.login("user", "password");	server.clearCommands();	DialogServer dataServer(false);	dataServer.addResponse("file1\r\nfile2");	std::ostringstream epsv;	epsv << "229 Entering Extended Passive Mode (|||" << dataServer.port() << "|)";	server.addResponse(epsv.str());	server.addResponse("150 sending data\r\n226 Transfer complete");	std::istream& istr = session.beginList();	std::ostringstream dataStr;	StreamCopier::copyStream(istr, dataStr);	session.endList();	std::string s(dataStr.str());	assert (s == "file1\r\nfile2\r\n");		std::string cmd = server.popCommand();	assert (cmd.substr(0, 4) == "EPSV");	cmd = server.popCommand();	assert (cmd == "NLST");		server.addResponse("221 Good Bye");	session.close();}void FTPClientSessionTest::setUp(){}void FTPClientSessionTest::tearDown(){}CppUnit::Test* FTPClientSessionTest::suite(){	CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("FTPClientSessionTest");	CppUnit_addTest(pSuite, FTPClientSessionTest, testLogin);	CppUnit_addTest(pSuite, FTPClientSessionTest, testLoginFailed1);	CppUnit_addTest(pSuite, FTPClientSessionTest, testLoginFailed2);	CppUnit_addTest(pSuite, FTPClientSessionTest, testCommands);	CppUnit_addTest(pSuite, FTPClientSessionTest, testDownloadPORT);	CppUnit_addTest(pSuite, FTPClientSessionTest, testDownloadEPRT);	CppUnit_addTest(pSuite, FTPClientSessionTest, testDownloadPASV);	CppUnit_addTest(pSuite, FTPClientSessionTest, testDownloadEPSV);	CppUnit_addTest(pSuite, FTPClientSessionTest, testUpload);	CppUnit_addTest(pSuite, FTPClientSessionTest, testList);	return pSuite;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -