| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** No Commercial Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file contains pre-release code and may not be distributed. | 
					
						
							|  |  |  | ** You may use this file in accordance with the terms and conditions | 
					
						
							|  |  |  | ** contained in the Technology Preview License Agreement accompanying | 
					
						
							|  |  |  | ** this package. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file LICENSE.LGPL included in the | 
					
						
							|  |  |  | ** packaging of this file.  Please review the following information to | 
					
						
							|  |  |  | ** ensure the GNU Lesser General Public License version 2.1 requirements | 
					
						
							|  |  |  | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							|  |  |  | ** rights.  These rights are described in the Nokia Qt LGPL Exception | 
					
						
							|  |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** If you have questions regarding the use of this file, please contact | 
					
						
							|  |  |  | ** Nokia at qt-info@nokia.com. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  | #include <coreplugin/ssh/sftpchannel.h>
 | 
					
						
							|  |  |  | #include <coreplugin/ssh/sshconnection.h>
 | 
					
						
							|  |  |  | #include <coreplugin/ssh/sshremoteprocess.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QtCore/QCoreApplication>
 | 
					
						
							|  |  |  | #include <QtCore/QList>
 | 
					
						
							|  |  |  | #include <QtCore/QObject>
 | 
					
						
							|  |  |  | #include <QtCore/QPair>
 | 
					
						
							|  |  |  | #include <QtCore/QTimer>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace Core; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Test : public QObject { | 
					
						
							|  |  |  |     Q_OBJECT | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     Test() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_timeoutTimer.setSingleShot(true); | 
					
						
							|  |  |  |         m_connection = SshConnection::create(); | 
					
						
							|  |  |  |         if (m_connection->state() != SshConnection::Unconnected) { | 
					
						
							|  |  |  |             qDebug("Error: Newly created SSH connection has state %d.", | 
					
						
							|  |  |  |                 m_connection->state()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_connection->createRemoteProcess("")) | 
					
						
							|  |  |  |             qDebug("Error: Unconnected SSH connection creates remote process."); | 
					
						
							|  |  |  |         if (m_connection->createSftpChannel()) | 
					
						
							|  |  |  |             qDebug("Error: Unconnected SSH connection creates SFTP channel."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 11:32:36 +10:00
										 |  |  |         SshConnectionParameters noHost=SshConnectionParameters(SshConnectionParameters::DefaultProxy); | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |         noHost.host = QLatin1String("hgdfxgfhgxfhxgfchxgcf"); | 
					
						
							|  |  |  |         noHost.port = 12345; | 
					
						
							|  |  |  |         noHost.timeout = 10; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 11:32:36 +10:00
										 |  |  |         SshConnectionParameters noUser=SshConnectionParameters(SshConnectionParameters::DefaultProxy); | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |         noUser.host = QLatin1String("localhost"); | 
					
						
							|  |  |  |         noUser.port = 22; | 
					
						
							|  |  |  |         noUser.timeout = 30; | 
					
						
							|  |  |  |         noUser.authType = SshConnectionParameters::AuthByPwd; | 
					
						
							|  |  |  |         noUser.uname = QLatin1String("dumdidumpuffpuff"); | 
					
						
							|  |  |  |         noUser.uname = QLatin1String("whatever"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 11:32:36 +10:00
										 |  |  |         SshConnectionParameters wrongPwd=SshConnectionParameters(SshConnectionParameters::DefaultProxy); | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |         wrongPwd.host = QLatin1String("localhost"); | 
					
						
							|  |  |  |         wrongPwd.port = 22; | 
					
						
							|  |  |  |         wrongPwd.timeout = 30; | 
					
						
							|  |  |  |         wrongPwd.authType = SshConnectionParameters::AuthByPwd; | 
					
						
							|  |  |  |         wrongPwd.uname = QLatin1String("root"); | 
					
						
							|  |  |  |         noUser.uname = QLatin1String("thiscantpossiblybeapasswordcanit"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 11:32:36 +10:00
										 |  |  |         SshConnectionParameters invalidKeyFile=SshConnectionParameters(SshConnectionParameters::DefaultProxy); | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |         invalidKeyFile.host = QLatin1String("localhost"); | 
					
						
							|  |  |  |         invalidKeyFile.port = 22; | 
					
						
							|  |  |  |         invalidKeyFile.timeout = 30; | 
					
						
							|  |  |  |         invalidKeyFile.authType = SshConnectionParameters::AuthByKey; | 
					
						
							|  |  |  |         invalidKeyFile.uname = QLatin1String("root"); | 
					
						
							|  |  |  |         invalidKeyFile.privateKeyFile | 
					
						
							|  |  |  |             = QLatin1String("somefilenamethatwedontexpecttocontainavalidkey"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // TODO: Create a valid key file and check for authentication error.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_testSet << TestItem("Behavior with non-existing host", | 
					
						
							|  |  |  |             noHost, ErrorList() << SshSocketError); | 
					
						
							|  |  |  |         m_testSet << TestItem("Behavior with non-existing user", noUser, | 
					
						
							|  |  |  |             ErrorList() << SshSocketError << SshTimeoutError | 
					
						
							|  |  |  |                 << SshAuthenticationError); | 
					
						
							|  |  |  |         m_testSet << TestItem("Behavior with wrong password", wrongPwd, | 
					
						
							|  |  |  |             ErrorList() << SshSocketError << SshTimeoutError | 
					
						
							|  |  |  |                 << SshAuthenticationError); | 
					
						
							|  |  |  |         m_testSet << TestItem("Behavior with invalid key file", invalidKeyFile, | 
					
						
							|  |  |  |             ErrorList() << SshSocketError << SshTimeoutError | 
					
						
							|  |  |  |                 << SshKeyFileError); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         runNextTest(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Test(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private slots: | 
					
						
							|  |  |  |     void handleConnected() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qDebug("Error: Received unexpected connected() signal."); | 
					
						
							|  |  |  |         qApp->quit(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void handleDisconnected() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qDebug("Error: Received unexpected disconnected() signal."); | 
					
						
							|  |  |  |         qApp->quit(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void handleDataAvailable(const QString &msg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qDebug("Error: Received unexpected dataAvailable() signal. " | 
					
						
							|  |  |  |             "Message was: '%s'.", qPrintable(msg)); | 
					
						
							|  |  |  |         qApp->quit(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-11 12:19:17 +02:00
										 |  |  |     void handleError(Core::SshError error) | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (m_testSet.isEmpty()) { | 
					
						
							|  |  |  |             qDebug("Error: Received error %d, but no test was running.", error); | 
					
						
							|  |  |  |             qApp->quit(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const TestItem testItem = m_testSet.takeFirst(); | 
					
						
							|  |  |  |         if (testItem.allowedErrors.contains(error)) { | 
					
						
							|  |  |  |             qDebug("Received error %d, as expected.", error); | 
					
						
							|  |  |  |             if (m_testSet.isEmpty()) { | 
					
						
							|  |  |  |                 qDebug("All tests finished successfully."); | 
					
						
							|  |  |  |                 qApp->quit(); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 runNextTest(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             qDebug("Received unexpected error %d.", error); | 
					
						
							|  |  |  |             qApp->quit(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void handleTimeout() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_testSet.isEmpty()) { | 
					
						
							|  |  |  |             qDebug("Error: timeout, but no test was running."); | 
					
						
							|  |  |  |             qApp->quit(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const TestItem testItem = m_testSet.takeFirst(); | 
					
						
							|  |  |  |         qDebug("Error: The following test timed out: %s", testItem.description); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     void runNextTest() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_connection) | 
					
						
							|  |  |  |             disconnect(m_connection.data(), 0, this, 0); | 
					
						
							|  |  |  |         m_connection = SshConnection::create(); | 
					
						
							|  |  |  |         connect(m_connection.data(), SIGNAL(connected()), this, | 
					
						
							|  |  |  |             SLOT(handleConnected())); | 
					
						
							|  |  |  |         connect(m_connection.data(), SIGNAL(disconnected()), this, | 
					
						
							|  |  |  |             SLOT(handleDisconnected())); | 
					
						
							|  |  |  |         connect(m_connection.data(), SIGNAL(dataAvailable(QString)), this, | 
					
						
							|  |  |  |             SLOT(handleDataAvailable(QString))); | 
					
						
							| 
									
										
										
										
											2010-10-11 12:19:17 +02:00
										 |  |  |         connect(m_connection.data(), SIGNAL(error(Core::SshError)), this, | 
					
						
							|  |  |  |             SLOT(handleError(Core::SshError))); | 
					
						
							| 
									
										
										
										
											2010-07-12 09:33:22 +02:00
										 |  |  |         const TestItem &nextItem = m_testSet.first(); | 
					
						
							|  |  |  |         m_timeoutTimer.stop(); | 
					
						
							|  |  |  |         m_timeoutTimer.setInterval(qMax(10000, nextItem.params.timeout * 1000)); | 
					
						
							|  |  |  |         qDebug("Testing: %s", nextItem.description); | 
					
						
							|  |  |  |         m_connection->connectToHost(m_testSet.first().params); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SshConnection::Ptr m_connection; | 
					
						
							|  |  |  |     typedef QList<SshError> ErrorList; | 
					
						
							|  |  |  |     struct TestItem { | 
					
						
							|  |  |  |         TestItem(const char *d, const SshConnectionParameters &p, | 
					
						
							|  |  |  |             const ErrorList &e) : description(d), params(p), allowedErrors(e) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const char *description; | 
					
						
							|  |  |  |         SshConnectionParameters params; | 
					
						
							|  |  |  |         ErrorList allowedErrors; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     QList<TestItem> m_testSet; | 
					
						
							|  |  |  |     QTimer m_timeoutTimer; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Test::~Test() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char *argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QCoreApplication a(argc, argv); | 
					
						
							|  |  |  |     Test t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return a.exec(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "main.moc"
 |