static bool waitForSignal(QObject *obj, const char *signal, int timeout = 0) { QEventLoop loop; QObject::connect(obj, signal, &loop, SLOT(quit())); QTimer timer; QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); if (timeout > 0) { QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); timer.setSingleShot(true); timer.start(timeout); } loop.exec(); return timeoutSpy.isEmpty(); }
/* void VDomKit::start() { connect(m_page, SIGNAL(loadFinished(bool)), this, SLOT(load())); } */ const QByteArray& VDomKit::dump(const QByteArray &url) { QUrl qurl; qurl.setEncodedUrl(url, QUrl::StrictMode); //qDebug() << qurl << endl; if (qurl.isValid()) { #ifdef ENABLE_TIMER QTime t; t.start(); #endif m_page->mainFrame()->load(qurl); VDomKitLoop loop; QObject::connect(m_page, SIGNAL(loadFinished(bool)), &loop, SLOT(quitWithRes(bool))); QTimer timer; QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); if (m_timeout > 0) { QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); timer.setSingleShot(true); timer.start(m_timeout); } loop.exec(); if (!timeoutSpy.isEmpty()) { fprintf(stderr, "Page loading timeout (exceeded %d ms): %s\n", m_timeout, url.data()); m_page->blockSignals(true); m_page->triggerAction(QWebPage::Stop); m_page->blockSignals(false); //return NullString; } else if (!loop.getRes()) { fprintf(stderr, "Failed to load page: %s\n", url.data()); return NullString; } #ifdef ENABLE_TIMER qDebug("loading elapsed: %d ms", t.elapsed()); t.restart(); #endif const QByteArray& retval = m_webvdom->dump(); #ifdef ENABLE_TIMER qDebug("dumping elapsed: %d ms", t.elapsed()); #endif return retval; } else {
bool waitForLoadFailed(QQuickWebView* webView, int timeout) { QEventLoop loop; LoadSpy loadSpy(webView); QObject::connect(&loadSpy, SIGNAL(loadFailed()), &loop, SLOT(quit())); QTimer timer; QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); if (timeout > 0) { QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); timer.setSingleShot(true); timer.start(timeout); } loop.exec(); return timeoutSpy.isEmpty(); }
void TestQGeoPositionInfoSource::robustness() { // Perform uneducated API calls and make sure it behaves QVERIFY(m_source); QGeoPositionInfo info = m_source->lastKnownPosition(true); QVERIFY(!info.isValid()); info = m_source->lastKnownPosition(false); QVERIFY(!info.isValid()); m_source->stopUpdates(); // Have changing source fail and check interface works. geocluemock_set_gcmaster_get_default(false); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); m_source->setUpdateInterval(1000); m_source->startUpdates(); m_source->requestUpdate(1000); m_source->stopUpdates(); info = m_source->lastKnownPosition(false); QVERIFY(!info.isValid()); geocluemock_set_gcmaster_get_default(true); // Check that the source is able to recover m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); QSignalSpy updateSpy(m_source, SIGNAL(positionUpdated(const QGeoPositionInfo&))); QSignalSpy timeoutSpy(m_source, SIGNAL(updateTimeout())); m_source->startUpdates(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(timeoutSpy.isEmpty()); // Successfully change source during active updates and check updates continue m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(timeoutSpy.isEmpty()); // Change again successfully the source and check that the requestUpdate is delivered m_source->stopUpdates(); m_source->requestUpdate(2000); updateSpy.clear(); timeoutSpy.clear(); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(timeoutSpy.isEmpty()); // Change the source unsuccessfully and expect timeout m_source->startUpdates(); geocluemock_set_gcmaster_get_default(false); updateSpy.clear(); timeoutSpy.clear(); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); QTRY_VERIFY_WITH_TIMEOUT(!timeoutSpy.isEmpty(), 3000); QVERIFY(updateSpy.isEmpty()); geocluemock_set_gcmaster_get_default(true); // Issue a start to unsuccessfully changed source and expect timeout updateSpy.clear(); timeoutSpy.clear(); m_source->requestUpdate(2000); QTRY_VERIFY_WITH_TIMEOUT(!timeoutSpy.isEmpty(), 3000); QVERIFY(updateSpy.isEmpty()); // Set unknown preferred method and check it has no impact (first set successful method) m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); updateSpy.clear(); timeoutSpy.clear(); m_source->startUpdates(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); m_source->setPreferredPositioningMethods((QGeoPositionInfoSource::PositioningMethods)555); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); // Successfully change preferred method but without velocity geocluemock_set_geoclue_velocity_new(false); geocluemock_set_suppress_velocity_update(true); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(!info.hasAttribute(QGeoPositionInfo::GroundSpeed)); geocluemock_set_geoclue_velocity_new(true); geocluemock_set_suppress_velocity_update(false); // Unsuccessfully change source during active requestUpdate() m_source->stopUpdates(); geocluemock_set_suppress_single_update(true); // Justin Case m_source->requestUpdate(1000); geocluemock_set_gcmaster_get_default(false); updateSpy.clear(); timeoutSpy.clear(); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); QTRY_VERIFY_WITH_TIMEOUT(!timeoutSpy.isEmpty(), 3000); QVERIFY(updateSpy.isEmpty()); geocluemock_set_gcmaster_get_default(true); geocluemock_set_suppress_single_update(false); // Check that setting same positioning method does nothing. // First setup successful and check updates are received m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); m_source->startUpdates(); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); // then set creation to fail. however should not impact because // methods are the same geocluemock_set_gcmaster_get_default(false); m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 3000); }
void TestQGeoPositionInfoSource::updateInferno() { // Tests different position update failure scenarios // Successful, normal update m_source->setUpdateInterval(1000); QSignalSpy updateSpy(m_source, SIGNAL(positionUpdated(const QGeoPositionInfo&))); QSignalSpy timeoutSpy(m_source, SIGNAL(updateTimeout())); m_source->startUpdates(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 2100); QVERIFY(timeoutSpy.isEmpty()); // Suppress the regular updates and check that timeouts are received // Then resume the updates and see it goes ok. geocluemock_set_suppress_regular_updates(true); updateSpy.clear(); timeoutSpy.clear(); QTest::qWait(2000); // there is no updateTimeout because there is no error QTRY_VERIFY_WITH_TIMEOUT(timeoutSpy.isEmpty(), 2000); QVERIFY(updateSpy.isEmpty()); geocluemock_set_suppress_regular_updates(false); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 4000); QVERIFY(timeoutSpy.isEmpty()); // Restart updates and check velocity is received when expected m_source->stopUpdates(); updateSpy.clear(); timeoutSpy.clear(); // start updates without velocity geocluemock_set_suppress_velocity_update(true); m_source->startUpdates(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 4000); QGeoPositionInfo info = updateSpy.takeFirst().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(!info.hasAttribute(QGeoPositionInfo::GroundSpeed)); // enable velocity updates again geocluemock_set_suppress_velocity_update(false); updateSpy.clear(); timeoutSpy.clear(); QTest::qWait(3000); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 4000); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(info.hasAttribute(QGeoPositionInfo::GroundSpeed)); m_source->stopUpdates(); // Test that bad updatedata produces timeout both on regular updates // and single updates geocluemock_set_position_fields(0); updateSpy.clear(); timeoutSpy.clear(); m_source->startUpdates(); QTRY_VERIFY_WITH_TIMEOUT(!timeoutSpy.isEmpty(), 2000); QVERIFY(updateSpy.isEmpty()); updateSpy.clear(); timeoutSpy.clear(); m_source->requestUpdate(1000); QTRY_VERIFY_WITH_TIMEOUT(!timeoutSpy.isEmpty(), 2000); QVERIFY(updateSpy.isEmpty()); geocluemock_unset_position_fields(); // clear // Test that lib works ok with instane lat/lon values geocluemock_set_position_latitude(1000); updateSpy.clear(); timeoutSpy.clear(); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 2000); QVERIFY(timeoutSpy.isEmpty()); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(!info.isValid()); geocluemock_unset_position_latitude(); // clear // Test that invalid velocity updates are not emitted geocluemock_set_velocity_fields(0); updateSpy.clear(); timeoutSpy.clear(); QTest::qWait(1500); QTRY_VERIFY_WITH_TIMEOUT(!updateSpy.isEmpty(), 2000); QVERIFY(timeoutSpy.isEmpty()); info = updateSpy.takeLast().at(0).value<QGeoPositionInfo>(); QVERIFY(info.isValid()); QVERIFY(!info.hasAttribute(QGeoPositionInfo::GroundSpeed)); geocluemock_unset_velocity_fields(); // Test that requestUpdate timeouts correctly geocluemock_set_suppress_single_update(true); geocluemock_set_suppress_regular_updates(true); m_source->stopUpdates(); updateSpy.clear(); timeoutSpy.clear(); m_source->requestUpdate(2000); QTRY_COMPARE_WITH_TIMEOUT(timeoutSpy.count(), 1, 2100); QVERIFY(updateSpy.isEmpty()); geocluemock_set_suppress_single_update(false); geocluemock_set_suppress_regular_updates(false); // Test changing interval during active updates works ok m_source->setUpdateInterval(1000); updateSpy.clear(); timeoutSpy.clear(); m_source->startUpdates(); QTRY_COMPARE_WITH_TIMEOUT_RANGE(updateSpy.count(), 1, 950, 1050); updateSpy.clear(); m_source->setUpdateInterval(2000); QTRY_COMPARE_WITH_TIMEOUT_RANGE(updateSpy.count(), 1, 1900, 2100); // Check that unusual }