/* Copyright (c) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company Author: Kevin Ottens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "kimaptest/fakeserver.h" #include "kimap/session.h" #include "kimap/selectjob.h" #include "kimap/idlejob.h" #include #include #include Q_DECLARE_METATYPE( QList ) Q_DECLARE_METATYPE( QList ) Q_DECLARE_METATYPE( KIMAP::IdleJob* ) class IdleJobTest: public QObject { Q_OBJECT public: explicit IdleJobTest( QObject *parent = 0 ) : QObject( parent ) { qRegisterMetaType(); } private Q_SLOTS: void shouldReactToIdle_data() { QTest::addColumn >( "scenario" ); QTest::addColumn( "expectedMailBox" ); QTest::addColumn< QList >( "expectedMessageCounts" ); QTest::addColumn< QList >( "expectedRecentCounts" ); QTest::addColumn< QList >( "expectedFlagsNotifications" ); QList scenario; QString expectedMailBox; QList expectedMessageCounts; QList expectedRecentCounts; QList expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 0 RECENT" << "S: * 1 EXISTS" << "S: * 1 RECENT" << "S: * 2 EXISTS" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedMessageCounts << 1 << 2; expectedRecentCounts << 0 << 1; QTest::newRow( "normal" ) << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 0 RECENT" << "S: * 1 RECENT" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedMessageCounts << -1 << -1; expectedRecentCounts << 0 << 1; QTest::newRow( "only RECENT" ) << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 1 EXISTS" << "S: * 2 EXISTS" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedMessageCounts << 1 << 2; expectedRecentCounts << -1 << -1; QTest::newRow( "only EXISTS" ) << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 2 EXISTS" << "W: 150" << "S: * 1 RECENT" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedMessageCounts << 2; expectedRecentCounts << 1; QTest::newRow( "under 200ms, same notification" ) << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 2 EXISTS" << "W: 250" << "S: * 1 RECENT" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedMessageCounts << 2 << -1; expectedRecentCounts << -1 << 1; QTest::newRow( "above 200ms, two notifications" ) << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; scenario.clear(); scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX/Foo\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: * 1 FETCH (FLAGS ())" << "W: 200" << "S: * 2 FETCH (FLAGS (\\Seen))" << "S: A000002 OK done idling"; expectedMailBox = "INBOX/Foo"; expectedMessageCounts.clear(); expectedRecentCounts.clear(); expectedFlagsNotifications << 1 << 2; QTest::newRow("2 flags change notifications") << scenario << expectedMailBox << expectedMessageCounts << expectedRecentCounts << expectedFlagsNotifications; } void shouldReactToIdle() { QFETCH( QList, scenario ); QFETCH( QString, expectedMailBox ); QFETCH( QList, expectedMessageCounts ); QFETCH( QList, expectedRecentCounts ); QFETCH( QList, expectedFlagsNotifications ); QVERIFY( expectedMessageCounts.size() == expectedRecentCounts.size() ); FakeServer fakeServer; fakeServer.setScenario( scenario ); fakeServer.startAndWait(); KIMAP::Session session( "127.0.0.1", 5989 ); KIMAP::SelectJob *select = new KIMAP::SelectJob( &session ); select->setMailBox( expectedMailBox ); QVERIFY( select->exec() ); KIMAP::IdleJob *idle = new KIMAP::IdleJob( &session ); QSignalSpy statsSpy( idle, SIGNAL(mailBoxStats(KIMAP::IdleJob*,QString,int,int)) ); QSignalSpy flagsSpy( idle, SIGNAL(mailBoxMessageFlagsChanged(KIMAP::IdleJob*,qint64)) ); bool result = idle->exec(); if ( result ) { QCOMPARE( statsSpy.count(), expectedMessageCounts.size() ); QCOMPARE( flagsSpy.count(), expectedFlagsNotifications.size() ); for ( int i = 0 ; i < statsSpy.count(); i++ ) { const KIMAP::IdleJob *job = statsSpy.at( i ).at( 0 ).value(); const QString mailBox = statsSpy.at( i ).at( 1 ).toString(); const int messageCount = statsSpy.at( i ).at( 2 ).toInt(); const int recentCount = statsSpy.at( i ).at( 3 ).toInt(); QCOMPARE( job, idle ); QCOMPARE( mailBox, expectedMailBox ); QCOMPARE( messageCount, expectedMessageCounts.at( i ) ); QCOMPARE( recentCount, expectedRecentCounts.at( i ) ); } for ( int i = 0; i < flagsSpy.count(); i++ ) { const KIMAP::IdleJob *job = flagsSpy.at( i ).at( 0 ).value(); const qint64 uid = flagsSpy.at( i ).at( 1 ).toLongLong(); QCOMPARE( job, idle ); QCOMPARE( uid, expectedFlagsNotifications.at( i ) ); } } fakeServer.quit(); } void shouldResetTimeout_data() { QTest::addColumn >( "scenario" ); { QList scenario; scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "S: A000002 OK done idling"; QTest::newRow("good") << scenario; } { QList scenario; scenario << FakeServer::preauth() << "C: A000001 SELECT \"INBOX\"" << "S: A000001 OK SELECT done" << "C: A000002 IDLE" << "S: + OK" << "X"; QTest::newRow("bad") << scenario; } } void shouldResetTimeout() { QFETCH( QList, scenario ); FakeServer fakeServer; fakeServer.setScenario( scenario ); fakeServer.startAndWait(); KIMAP::Session session( "127.0.0.1", 5989 ); const int originalTimeout = session.timeout(); KIMAP::SelectJob *select = new KIMAP::SelectJob( &session ); select->setMailBox( "INBOX" ); QVERIFY( select->exec() ); KIMAP::IdleJob *idle = new KIMAP::IdleJob( &session ); idle->exec(); QCOMPARE( session.timeout(), originalTimeout ); fakeServer.quit(); } }; QTEST_KDEMAIN_CORE( IdleJobTest ) #include "idlejobtest.moc"