void tst_QLlcpSocket::tst_invalidServiceUri() { QLatin1String invalidServiceUri("invalid"); QLlcpSocket *socket = new QLlcpSocket; QSignalSpy stateSpy(socket, SIGNAL(stateChanged(QLlcpSocket::SocketState))); QSignalSpy errorSpy(socket, SIGNAL(error(QLlcpSocket::SocketError))); socket->connectToService(0, invalidServiceUri); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::ConnectingState); QCOMPARE(socket->state(), QLlcpSocket::ConnectingState); QTRY_VERIFY(!errorSpy.isEmpty()); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::UnconnectedState); QCOMPARE(socket->state(), QLlcpSocket::UnconnectedState); QCOMPARE(errorSpy.takeFirst().at(0).value<QLlcpSocket::SocketError>(), QLlcpSocket::SocketAccessError); QCOMPARE(socket->error(), QLlcpSocket::SocketAccessError); QVERIFY(!socket->errorString().isEmpty()); delete socket; }
QT_USE_NAMESPACE void tst_QRadioTuner::initTestCase() { qRegisterMetaType<QRadioTuner::State>("QRadioTuner::State"); qRegisterMetaType<QRadioTuner::Band>("QRadioTuner::Band"); mock = new MockRadioTunerControl(this); service = new MockMediaService(this, mock); provider = new MockMediaServiceProvider(service); radio = new QRadioTuner(0,provider); QVERIFY(radio->service() != 0); QVERIFY(radio->isAvailable()); QVERIFY(radio->availabilityError() == QtMultimediaKit::NoError); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); QCOMPARE(radio->state(), QRadioTuner::StoppedState); radio->start(); QVERIFY(radio->availabilityError() == QtMultimediaKit::NoError); QCOMPARE(radio->state(), QRadioTuner::ActiveState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value<QRadioTuner::State>(), QRadioTuner::ActiveState); }
void tst_QXARadio_xa::testStopRadio() { QVERIFY(radio->service() != 0); QVERIFY(radio->error() == QRadioTuner::NoError); QVERIFY(radio->errorString().isEmpty()); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); radio->stop(); QTRY_COMPARE(stateSpy.count(), 1); // wait for callbacks to complete in symbian API QCOMPARE(radio->state(), QRadioTuner::StoppedState); // delete radio; }
void tst_QRadioTuner_s60::cleanupTestCase() { QVERIFY(radio->error() == QRadioTuner::NoError); QVERIFY(radio->errorString().isEmpty()); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); radio->stop(); QCOMPARE(radio->state(), QRadioTuner::StoppedState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value<QRadioTuner::State>(), QRadioTuner::StoppedState); delete radio; }
void tst_QRadioTuner_s60::initTestCase() { qRegisterMetaType<QRadioTuner::State>("QRadioTuner::State"); qRegisterMetaType<QRadioTuner::Band>("QRadioTuner::Band"); radio = new QRadioTuner(0); QVERIFY(radio->service() != 0); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); QCOMPARE(radio->state(), QRadioTuner::StoppedState); radio->start(); QCOMPARE(radio->state(), QRadioTuner::ActiveState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value<QRadioTuner::State>(), QRadioTuner::ActiveState); }
void tst_QRadioTuner::cleanupTestCase() { QVERIFY(radio->error() == QRadioTuner::NoError); QVERIFY(radio->errorString().isEmpty()); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); radio->stop(); QVERIFY(radio->availabilityError() == QtMultimediaKit::NoError); QCOMPARE(radio->state(), QRadioTuner::StoppedState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value<QRadioTuner::State>(), QRadioTuner::StoppedState); delete radio; delete service; delete provider; }
void tst_QAudioDecoderBackend::fileTest() { QAudioDecoder d; QAudioBuffer buffer; quint64 duration = 0; int byteCount = 0; int sampleCount = 0; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.sourceFilename(), QString("")); QVERIFY(d.audioFormat() == QAudioFormat()); // Test local file QFileInfo fileInfo(QFINDTESTDATA(TEST_FILE_NAME)); d.setSourceFilename(fileInfo.absoluteFilePath()); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.sourceFilename(), fileInfo.absoluteFilePath()); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); QTRY_VERIFY(!stateSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); QTRY_VERIFY(!durationSpy.isEmpty()); QVERIFY(qAbs(d.duration() - 1000) < 20); buffer = d.read(); QVERIFY(buffer.isValid()); // Test file is 44.1K 16bit mono, 44094 samples QCOMPARE(buffer.format().channelCount(), 1); QCOMPARE(buffer.format().sampleRate(), 44100); QCOMPARE(buffer.format().sampleSize(), 16); QCOMPARE(buffer.format().sampleType(), QAudioFormat::SignedInt); QCOMPARE(buffer.format().codec(), QString("audio/pcm")); QCOMPARE(buffer.byteCount(), buffer.sampleCount() * 2); // 16bit mono // The decoder should still have no format set QVERIFY(d.audioFormat() == QAudioFormat()); QVERIFY(errorSpy.isEmpty()); duration += buffer.duration(); sampleCount += buffer.sampleCount(); byteCount += buffer.byteCount(); // Now drain the decoder if (sampleCount < 44094) { QTRY_COMPARE(d.bufferAvailable(), true); } while (d.bufferAvailable()) { buffer = d.read(); QVERIFY(buffer.isValid()); QTRY_VERIFY(!positionSpy.isEmpty()); QVERIFY(positionSpy.takeLast().at(0).toLongLong() == qint64(duration / 1000)); duration += buffer.duration(); sampleCount += buffer.sampleCount(); byteCount += buffer.byteCount(); if (sampleCount < 44094) { QTRY_COMPARE(d.bufferAvailable(), true); } } // Make sure the duration is roughly correct (+/- 20ms) QCOMPARE(sampleCount, 44094); QCOMPARE(byteCount, 44094 * 2); QVERIFY(qAbs(qint64(duration) - 1000000) < 20000); QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); QTRY_COMPARE(finishedSpy.count(), 1); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); d.stop(); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); readySpy.clear(); bufferChangedSpy.clear(); stateSpy.clear(); durationSpy.clear(); finishedSpy.clear(); positionSpy.clear(); // change output audio format QAudioFormat format; format.setChannelCount(2); format.setSampleSize(8); format.setSampleRate(11050); format.setCodec("audio/pcm"); format.setSampleType(QAudioFormat::SignedInt); d.setAudioFormat(format); // We expect 1 second still, at 11050 * 2 samples == 22k samples. // (at 1 byte/sample -> 22kb) // Make sure it stuck QVERIFY(d.audioFormat() == format); duration = 0; sampleCount = 0; byteCount = 0; d.start(); QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); QTRY_VERIFY(!stateSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); QTRY_VERIFY(!durationSpy.isEmpty()); QVERIFY(qAbs(d.duration() - 1000) < 20); buffer = d.read(); QVERIFY(buffer.isValid()); // See if we got the right format QVERIFY(buffer.format() == format); // The decoder should still have the same format QVERIFY(d.audioFormat() == format); QVERIFY(errorSpy.isEmpty()); duration += buffer.duration(); sampleCount += buffer.sampleCount(); byteCount += buffer.byteCount(); // Now drain the decoder if (duration < 998000) { QTRY_COMPARE(d.bufferAvailable(), true); } while (d.bufferAvailable()) { buffer = d.read(); QVERIFY(buffer.isValid()); QTRY_VERIFY(!positionSpy.isEmpty()); QVERIFY(positionSpy.takeLast().at(0).toLongLong() == qint64(duration / 1000)); QVERIFY(d.position() - (duration / 1000) < 20); duration += buffer.duration(); sampleCount += buffer.sampleCount(); byteCount += buffer.byteCount(); if (duration < 998000) { QTRY_COMPARE(d.bufferAvailable(), true); } } // Resampling might end up with fewer or more samples // so be a bit sloppy QVERIFY(qAbs(sampleCount - 22047) < 100); QVERIFY(qAbs(byteCount - 22047) < 100); QVERIFY(qAbs(qint64(duration) - 1000000) < 20000); QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); QTRY_COMPARE(finishedSpy.count(), 1); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); d.stop(); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); }
void tst_QAudioDecoderBackend::deviceTest() { QAudioDecoder d; QAudioBuffer buffer; quint64 duration = 0; int sampleCount = 0; QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.sourceFilename(), QString("")); QVERIFY(d.audioFormat() == QAudioFormat()); QFileInfo fileInfo(QFINDTESTDATA(TEST_FILE_NAME)); QFile file(fileInfo.absoluteFilePath()); QVERIFY(file.open(QIODevice::ReadOnly)); d.setSourceDevice(&file); QVERIFY(d.sourceDevice() == &file); QVERIFY(d.sourceFilename().isEmpty()); // We haven't set the format yet QVERIFY(d.audioFormat() == QAudioFormat()); d.start(); QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); QTRY_VERIFY(!stateSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); QTRY_VERIFY(!durationSpy.isEmpty()); QVERIFY(qAbs(d.duration() - 1000) < 20); buffer = d.read(); QVERIFY(buffer.isValid()); // Test file is 44.1K 16bit mono QCOMPARE(buffer.format().channelCount(), 1); QCOMPARE(buffer.format().sampleRate(), 44100); QCOMPARE(buffer.format().sampleSize(), 16); QCOMPARE(buffer.format().sampleType(), QAudioFormat::SignedInt); QCOMPARE(buffer.format().codec(), QString("audio/pcm")); QVERIFY(errorSpy.isEmpty()); duration += buffer.duration(); sampleCount += buffer.sampleCount(); // Now drain the decoder if (sampleCount < 44094) { QTRY_COMPARE(d.bufferAvailable(), true); } while (d.bufferAvailable()) { buffer = d.read(); QVERIFY(buffer.isValid()); QTRY_VERIFY(!positionSpy.isEmpty()); QVERIFY(positionSpy.takeLast().at(0).toLongLong() == qint64(duration / 1000)); QVERIFY(d.position() - (duration / 1000) < 20); duration += buffer.duration(); sampleCount += buffer.sampleCount(); if (sampleCount < 44094) { QTRY_COMPARE(d.bufferAvailable(), true); } } // Make sure the duration is roughly correct (+/- 20ms) QCOMPARE(sampleCount, 44094); QVERIFY(qAbs(qint64(duration) - 1000000) < 20000); QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); QTRY_COMPARE(finishedSpy.count(), 1); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); d.stop(); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); readySpy.clear(); bufferChangedSpy.clear(); stateSpy.clear(); durationSpy.clear(); finishedSpy.clear(); positionSpy.clear(); // Now try changing formats QAudioFormat format; format.setChannelCount(2); format.setSampleSize(8); format.setSampleRate(8000); format.setCodec("audio/pcm"); format.setSampleType(QAudioFormat::SignedInt); d.setAudioFormat(format); // Make sure it stuck QVERIFY(d.audioFormat() == format); d.start(); QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); QTRY_VERIFY(!stateSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); QTRY_VERIFY(!durationSpy.isEmpty()); QVERIFY(qAbs(d.duration() - 1000) < 20); buffer = d.read(); QVERIFY(buffer.isValid()); // See if we got the right format QVERIFY(buffer.format() == format); // The decoder should still have the same format QVERIFY(d.audioFormat() == format); QVERIFY(errorSpy.isEmpty()); d.stop(); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); }
/* The corrupted file is generated by copying a few random numbers from /dev/random on a linux machine. */ void tst_QAudioDecoderBackend::corruptedFileTest() { QAudioDecoder d; QAudioBuffer buffer; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.sourceFilename(), QString("")); QVERIFY(d.audioFormat() == QAudioFormat()); // Test local file QFileInfo fileInfo(QFINDTESTDATA(TEST_CORRUPTED_FILE_NAME)); d.setSourceFilename(fileInfo.absoluteFilePath()); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.sourceFilename(), fileInfo.absoluteFilePath()); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.audioFormat(), QAudioFormat()); QCOMPARE(d.duration(), qint64(-1)); QCOMPARE(d.position(), qint64(-1)); // Check the error code. QTRY_VERIFY(!errorSpy.isEmpty()); // Have to use qvariant_cast, toInt will return 0 because unrecognized type; QAudioDecoder::Error errorCode = qvariant_cast<QAudioDecoder::Error>(errorSpy.takeLast().at(0)); QCOMPARE(errorCode, QAudioDecoder::FormatError); QCOMPARE(d.error(), QAudioDecoder::FormatError); // Check all other spies. QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); QVERIFY(stateSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); errorSpy.clear(); // Try read even if the file is corrupted to test the robustness. buffer = d.read(); QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(!buffer.isValid()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.position(), qint64(-1)); QVERIFY(errorSpy.isEmpty()); QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); QVERIFY(stateSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); d.stop(); QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); }
void tst_QFeedbackHapticsEffect::startStop() { qRegisterMetaType<QFeedbackEffect::ErrorType>("QFeedbackEffect::ErrorType"); if (QFeedbackActuator::actuators().isEmpty()) QSKIP("this test requires to have actuators"); QList<QFeedbackActuator*> actuators = QFeedbackActuator::actuators(); QFETCH(int, duration); QFETCH(qreal, intensity); QFETCH(int, attackTime); QFETCH(qreal, attackIntensity); QFETCH(int, fadeTime); QFETCH(qreal, fadeIntensity); QFETCH(int, period); QFeedbackHapticsEffect effect; QSignalSpy errorspy(&effect, SIGNAL(error(QFeedbackEffect::ErrorType))); QSignalSpy stateSpy(&effect, SIGNAL(stateChanged())); effect.setDuration(duration); effect.setIntensity(intensity); effect.setAttackTime(attackTime); effect.setAttackIntensity(attackIntensity); effect.setFadeTime(fadeTime); effect.setFadeIntensity(fadeIntensity); effect.setPeriod(period); QCOMPARE(effect.state(), QFeedbackHapticsEffect::Stopped); QCOMPARE(effect.actuator(), actuators.at(0)); // Double set a few properties (shouldn't call the backend) effect.setAttackTime(attackTime); QVERIFY(effect.attackTime() == attackTime); effect.setFadeTime(fadeTime); QVERIFY(effect.fadeTime() == fadeTime); // Test setting to a non default actuator and then back again if (actuators.count() > 1) { effect.setActuator(actuators.at(1)); QCOMPARE(effect.actuator(), actuators.at(1)); effect.setActuator(0); QCOMPARE(effect.actuator(), actuators.at(0)); // noop effect.setActuator(actuators.at(0)); QCOMPARE(effect.actuator(), actuators.at(0)); } // Now start QVERIFY(stateSpy.isEmpty()); effect.start(); QVERIFY(errorspy.isEmpty()); // This seems a little risky QTRY_COMPARE(effect.state(), QFeedbackHapticsEffect::Running); QVERIFY(errorspy.isEmpty()); QCOMPARE(stateSpy.count(), 1); // stopped to start effect.pause(); QCOMPARE(effect.state(), QFeedbackHapticsEffect::Paused); QCOMPARE(stateSpy.count(), 2); // Now try to change a few properties (should be refused because of !Stopped) effect.setPeriod(period + 100); QVERIFY(effect.period() == period); QFeedbackActuator* actuator = effect.actuator(); effect.setActuator(0); QVERIFY(effect.actuator() == actuator); effect.start(); QCOMPARE(effect.state(), QFeedbackHapticsEffect::Running); QCOMPARE(stateSpy.count(), 3); QTRY_COMPARE(effect.state(), QFeedbackHapticsEffect::Stopped); QVERIFY(errorspy.isEmpty()); QCOMPARE(stateSpy.count(), 4); }
void tst_QLlcpSocket::tst_clientConnection() { QFETCH(ClientConnectionShutdown, shutdown); QFETCH(bool, stream); QString service = QLatin1String("urn:nfc:sn:com.nokia.qtmobility.commandserver") + (stream ? QLatin1String(".stream") : QLatin1String(".datagram")); /* Construction */ QLlcpSocket *socket = new QLlcpSocket; QSignalSpy stateSpy(socket, SIGNAL(stateChanged(QLlcpSocket::SocketState))); QCOMPARE(socket->state(), QLlcpSocket::UnconnectedState); /* Connection */ QSignalSpy connectedSpy(socket, SIGNAL(connected())); QSignalSpy errorSpy(socket, SIGNAL(error(QLlcpSocket::SocketError))); socket->connectToService(0, service); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::ConnectingState); QCOMPARE(socket->state(), QLlcpSocket::ConnectingState); stateSpy.clear(); QTRY_VERIFY_TIMEOUT(30000, !connectedSpy.isEmpty() || !errorSpy.isEmpty()); if (errorSpy.count() != 0) { qDebug() << errorSpy.takeFirst().at(0).toInt(); QSKIP("Connection error", SkipSingle); } QCOMPARE(connectedSpy.count(), 1); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::ConnectedState); QCOMPARE(socket->state(), QLlcpSocket::ConnectedState); stateSpy.clear(); QSignalSpy bytesWrittenSpy(socket, SIGNAL(bytesWritten(qint64))); QSignalSpy readyReadSpy(socket, SIGNAL(readyRead())); /* Verify connected to correct service */ if (stream) { socket->write("URI\n"); QCOMPARE(bytesWrittenSpy.count(), 1); QCOMPARE(bytesWrittenSpy.takeFirst().at(0).value<qint64>(), qint64(4)); QTRY_VERIFY(!readyReadSpy.isEmpty() && socket->canReadLine()); const QByteArray line = socket->readLine().trimmed(); QCOMPARE(line, service.toLatin1()); } else { socket->writeDatagram("URI"); QCOMPARE(bytesWrittenSpy.count(), 1); QCOMPARE(bytesWrittenSpy.takeFirst().at(0).value<qint64>(), qint64(3)); QTRY_VERIFY(!readyReadSpy.isEmpty() && socket->hasPendingDatagrams()); QByteArray datagram; datagram.resize(socket->pendingDatagramSize()); socket->readDatagram(datagram.data(), datagram.size()); QCOMPARE(datagram, service.toLatin1()); } bytesWrittenSpy.clear(); readyReadSpy.clear(); /* Read / Write */ if (stream) { QByteArray data("ECHO Test data\n"); socket->write(data); QCOMPARE(bytesWrittenSpy.count(), 1); QCOMPARE(bytesWrittenSpy.takeFirst().at(0).value<qint64>(), qint64(data.size())); QTRY_VERIFY(!readyReadSpy.isEmpty()); const QByteArray line = socket->readLine().trimmed(); QCOMPARE(line.constData(), "Test data"); } else { socket->writeDatagram("ECHO Test data"); QCOMPARE(bytesWrittenSpy.count(), 1); QCOMPARE(bytesWrittenSpy.takeFirst().at(0).value<qint64>(), qint64(14)); QTRY_VERIFY(!readyReadSpy.isEmpty()); QByteArray datagram; datagram.resize(socket->pendingDatagramSize()); socket->readDatagram(datagram.data(), datagram.size()); QCOMPARE(datagram.constData(), "Test data"); } bytesWrittenSpy.clear(); readyReadSpy.clear(); QSignalSpy disconnectedSpy(socket, SIGNAL(disconnected())); errorSpy.clear(); /* Shutdown */ switch (shutdown) { case ServerDisconnect: if (stream) socket->write("DISCONNECT\n"); else socket->writeDatagram("DISCONNECT"); break; case ServerClose: if (stream) socket->write("CLOSE\n"); else socket->writeDatagram("CLOSE"); break; case ClientDisconnect: socket->disconnectFromService(); break; case ClientClose: socket->close(); break; } QTRY_VERIFY(!disconnectedSpy.isEmpty()); QCOMPARE(disconnectedSpy.count(), 1); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::ClosingState); QCOMPARE(stateSpy.takeFirst().at(0).value<QLlcpSocket::SocketState>(), QLlcpSocket::UnconnectedState); QVERIFY(!socket->isOpen()); if (shutdown == ServerDisconnect || shutdown == ServerClose) { QTRY_VERIFY(!errorSpy.isEmpty()); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorSpy.takeFirst().at(0).value<QLlcpSocket::SocketError>(), QLlcpSocket::RemoteHostClosedError); QCOMPARE(socket->error(), QLlcpSocket::RemoteHostClosedError); } delete socket; }