summaryrefslogtreecommitdiffstats
path: root/tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp')
-rw-r--r--tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp537
1 files changed, 537 insertions, 0 deletions
diff --git a/tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp b/tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
new file mode 100644
index 00000000..962adf07
--- /dev/null
+++ b/tests/nfcsymbianbackend/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
@@ -0,0 +1,537 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QString>
+#include <QtTest/QtTest>
+#include <QtCore/QCoreApplication>
+#include <QVariant>
+#include <QVariantList>
+#include "qnfctagtestcommon.h"
+#include <qnearfieldtagtype1.h>
+#include "qnfctestcommon.h"
+
+class NfcTagRawCommandOperationType1 : public NfcTagRawCommandOperationCommon
+{
+public:
+ NfcTagRawCommandOperationType1(QNearFieldTarget * tag);
+
+ void setReadAllOp() { readAll = &QNearFieldTagType1::readAll; }
+ void setReadIdOp() { readIdentification = &QNearFieldTagType1::readIdentification; }
+ void setReadByteOp(quint8 addr) { mAddr = addr; readByte = &QNearFieldTagType1::readByte; }
+ void setWriteByteOp(quint8 addr, quint8 data, QNearFieldTagType1::WriteMode mode)
+ {
+ mAddr = addr;
+ mData = data;
+ mMode = mode;
+ writeByte = &QNearFieldTagType1::writeByte;
+ }
+ void setReadSegment(quint8 addr) { mAddr = addr; readSegment = &QNearFieldTagType1::readSegment; }
+ void setReadBlock(quint8 addr) { mAddr = addr; readBlock = &QNearFieldTagType1::readBlock; }
+ void setWriteBlock(quint8 addr, const QByteArray & data, QNearFieldTagType1::WriteMode mode)
+ {
+ mAddr = addr;
+ mDataArray = data;
+ mMode = mode;
+ writeBlock = &QNearFieldTagType1::writeBlock;
+ }
+
+ void run()
+ {
+ if (readAll)
+ {
+ mId = (tagType1->*readAll)();
+ }
+
+ if (readIdentification)
+ {
+ mId = (tagType1->*readIdentification)();
+ }
+
+ if (readByte)
+ {
+ mId = (tagType1->*readByte)(mAddr);
+ }
+
+ if (writeByte)
+ {
+ mId = (tagType1->*writeByte)(mAddr, mData, mMode);
+ }
+
+ if (readBlock)
+ {
+ mId = (tagType1->*readBlock)(mAddr);
+ }
+
+ if (writeBlock)
+ {
+ mId = (tagType1->*writeBlock)(mAddr, mDataArray, mMode);
+ }
+
+ if (readSegment)
+ {
+ mId = (tagType1->*readSegment)(mAddr);
+ }
+ checkInvalidId();
+ waitRequest();
+ }
+
+protected:
+ QNearFieldTagType1 * tagType1;
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*readAll)();
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*readIdentification)();
+
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*readByte)(quint8 address);
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*writeByte)(quint8 address, quint8 data, QNearFieldTagType1::WriteMode mode);
+
+ // dynamic memory functions
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*readSegment)(quint8 segmentAddress);
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*readBlock)(quint8 blockAddress);
+ QNearFieldTarget::RequestId (QNearFieldTagType1::*writeBlock)(quint8 blockAddress, const QByteArray &data,
+ QNearFieldTagType1::WriteMode mode);
+ quint8 mAddr;
+ quint8 mData;
+ QByteArray mDataArray;
+ QNearFieldTagType1::WriteMode mMode;
+};
+
+NfcTagRawCommandOperationType1::NfcTagRawCommandOperationType1(QNearFieldTarget * tag):NfcTagRawCommandOperationCommon(tag)
+{
+ tagType1 = qobject_cast<QNearFieldTagType1 *>(mTarget);
+ QVERIFY(tagType1);
+ readAll = 0;
+ readIdentification = 0;
+ readByte = 0;
+ writeByte = 0;
+ readSegment = 0;
+ readBlock = 0;
+ writeBlock = 0;
+}
+
+class tst_qnearfieldtagtype1 : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_qnearfieldtagtype1();
+ void _testRawAccessAndNdefAccess(const QList<QNdefMessage> &messages);
+
+private Q_SLOTS:
+ void initTestCase();
+ void testRawAndNdefAccess();
+ void testSequence();
+ void testWaitInSlot();
+ void testDeleteOperationBeforeAsyncRequestComplete();
+ void testRemoveTagBeforeAsyncRequestComplete();
+ void testCancelNdefOperation();
+ void cleanupTestCase();
+private:
+ QNfcTagTestCommon<QNearFieldTagType1> tester;
+};
+
+
+tst_qnearfieldtagtype1::tst_qnearfieldtagtype1()
+{
+}
+
+void tst_qnearfieldtagtype1::initTestCase()
+{
+}
+
+void tst_qnearfieldtagtype1::cleanupTestCase()
+{
+}
+
+void tst_qnearfieldtagtype1::testSequence()
+{
+ tester.touchTarget(" dynamic ");
+ QByteArray uid = tester.target->uid();
+ QVERIFY(!uid.isEmpty());
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+ qDebug()<<"========== Test readSeg, writeBlock, async and sync mix ==========";
+ OperationList rawCommandList;
+ const char data[] = {0,1,2,3,4,5,6,7};
+ QByteArray blockData;
+ blockData.append(data, sizeof(data));
+ QByteArray segmentData;
+
+ for (int i = 0x10; i <= 0x1F; ++i)
+ {
+ NfcTagRawCommandOperationType1 * op1 = new NfcTagRawCommandOperationType1(tester.target);
+ op1->setWriteBlock(i, blockData, QNearFieldTagType1::EraseAndWrite);
+ op1->setExpectedOkSignal();
+ op1->setExpectedResponse(QVariant(true));
+
+ if (i == 0x15)
+ {
+ op1->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitTrue);
+ }
+ rawCommandList.append(op1);
+ segmentData.append(blockData);
+ }
+
+ NfcTagRawCommandOperationType1 * op2 = new NfcTagRawCommandOperationType1(tester.target);
+ op2->setReadSegment(1);
+ op2->setExpectedOkSignal();
+ op2->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitTrue);
+ op2->setExpectedResponse(segmentData);
+ rawCommandList.append(op2);
+
+ tester.testSequence(rawCommandList);
+ qDeleteAll(rawCommandList);
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+ qDebug()<<"========== Test invalid readSeg, writeNE, writeBlockNE ==========";
+ rawCommandList.clear();
+ NfcTagRawCommandOperationType1 * op6 = new NfcTagRawCommandOperationType1(tester.target);
+ op6->setReadSegment(0xf1);
+ op6->setIfExpectInvalidId();
+ op6->setExpectedResponse(QVariant());
+ rawCommandList.append(op6);
+
+ NfcTagRawCommandOperationType1 * op3 = new NfcTagRawCommandOperationType1(tester.target);
+ op3->setWriteBlock(0x10, blockData, QNearFieldTagType1::WriteOnly);
+ op3->setExpectedOkSignal();
+ op3->setExpectedResponse(QVariant(true));
+ rawCommandList.append(op3);
+
+ NfcTagRawCommandOperationType1 * op4 = new NfcTagRawCommandOperationType1(tester.target);
+ op4->setWriteByteOp(0x10, 0xff, QNearFieldTagType1::WriteOnly);
+ op4->setExpectedOkSignal();
+ op4->setExpectedResponse(QVariant(true));
+ rawCommandList.append(op4);
+
+ QList<QByteArray> cmdList;
+ QByteArray command;
+ command.append(char(0x1a)); // WRITE-NE
+ command.append(char(0x10)); // Address
+ command.append(char(0x00)); // Data
+ command.append(uid.left(4)); // 4 bytes of UID
+ cmdList.append(command);
+
+ command.clear();
+ command.append(char(0xff)); // Invalid command
+ command.append(char(0xff));
+ command.append(char(0xff));
+ command.append(char(0xff));
+ command.append(char(0xff));
+ command.append(char(0xff));
+ cmdList.append(command);
+
+ QVariantList expectRsp;
+ expectRsp.push_back(QVariant(true));
+ expectRsp.push_back(QVariant());
+
+ NfcTagSendCommandsCommon * op7 = new NfcTagSendCommandsCommon(tester.target);
+ op7->SetCommandLists(cmdList);
+ op7->setExpectedErrorSignal(QNearFieldTarget::InvalidParametersError);
+ op7->SetExpectedResponse(expectRsp);
+ op7->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitFalse);
+ rawCommandList.append(op7);
+
+ cmdList.clear();
+ QByteArray command1;
+ command1.append(char(0x1a)); // WRITE-NE
+ command1.append(char(0x10)); // Address
+ command1.append(char(0x00)); // Data
+ command1.append(uid.left(4)); // 4 bytes of UID
+ cmdList.append(command1);
+ cmdList.append(command1);
+
+ expectRsp.clear();
+ expectRsp.push_back(QVariant(true));
+ expectRsp.push_back(QVariant(true));
+
+ NfcTagSendCommandsCommon * op8 = new NfcTagSendCommandsCommon(tester.target);
+ op8->SetCommandLists(cmdList);
+ op8->setExpectedOkSignal();
+ op8->SetExpectedResponse(expectRsp);
+ rawCommandList.append(op8);
+
+ tester.testSequence(rawCommandList);
+ qDeleteAll(rawCommandList);
+
+ tester.removeTarget();
+}
+
+void tst_qnearfieldtagtype1::testWaitInSlot()
+{
+ tester.touchTarget(" dynamic ");
+
+ const char data[] = {0,1,2,3,4,5,6,7};
+ QByteArray blockData;
+ blockData.append(data, sizeof(data));
+
+ NfcTagRawCommandOperationType1 * op1 = new NfcTagRawCommandOperationType1(tester.target);
+ op1->setWriteBlock(0x10, blockData, QNearFieldTagType1::EraseAndWrite);
+ op1->setExpectedOkSignal();
+ op1->setExpectedResponse(QVariant(true));
+
+ NfcTagRawCommandOperationType1 * op2Wait = new NfcTagRawCommandOperationType1(tester.target);
+ op2Wait->setWriteBlock(0x11, blockData, QNearFieldTagType1::EraseAndWrite);
+ op2Wait->setExpectedOkSignal();
+ op2Wait->setExpectedResponse(QVariant(true));
+ op2Wait->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitTrue);
+
+ NfcTagRawCommandOperationType1 * op3 = new NfcTagRawCommandOperationType1(tester.target);
+ op3->setWriteBlock(0x12, blockData, QNearFieldTagType1::EraseAndWrite);
+ op3->setExpectedOkSignal();
+ op3->setExpectedResponse(QVariant(true));
+
+ NfcTagRawCommandOperationType1 * op4WaitInSlot = new NfcTagRawCommandOperationType1(tester.target);
+ op4WaitInSlot->setWriteBlock(0x13, blockData, QNearFieldTagType1::EraseAndWrite);
+ op4WaitInSlot->setExpectedOkSignal();
+ op4WaitInSlot->setExpectedResponse(QVariant(true));
+
+ tester.testWaitInSlot(op1, op2Wait, op3, op4WaitInSlot);
+
+ delete op1;
+ delete op2Wait;
+ delete op3;
+ delete op4WaitInSlot;
+
+ tester.removeTarget();
+}
+
+void tst_qnearfieldtagtype1::testDeleteOperationBeforeAsyncRequestComplete()
+{
+ tester.touchTarget(" dynamic ");
+ OperationList rawCommandList;
+ const char data[] = {0,1,2,3,4,5,6,7};
+ QByteArray blockData;
+ blockData.append(data, sizeof(data));
+ QByteArray segmentData;
+
+ for (int i = 0x10; i <= 0x1F; ++i)
+ {
+ NfcTagRawCommandOperationType1 * op1 = new NfcTagRawCommandOperationType1(tester.target);
+ op1->setWriteBlock(i, blockData, QNearFieldTagType1::EraseAndWrite);
+ op1->setExpectedOkSignal();
+ op1->setExpectedResponse(QVariant(true));
+
+ if (i == 0x15)
+ {
+ op1->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitTrue);
+ }
+ rawCommandList.append(op1);
+ segmentData.append(blockData);
+ }
+
+ NfcTagRawCommandOperationType1 * op2 = new NfcTagRawCommandOperationType1(tester.target);
+ op2->setReadSegment(1);
+ op2->setExpectedOkSignal();
+ op2->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitTrue);
+ op2->setExpectedResponse(segmentData);
+ rawCommandList.append(op2);
+ tester.testDeleteOperationBeforeAsyncRequestComplete(rawCommandList);
+
+ qDeleteAll(rawCommandList);
+}
+
+void tst_qnearfieldtagtype1::testRemoveTagBeforeAsyncRequestComplete()
+{
+ tester.touchTarget(" dynamic ");
+ OperationList rawCommandList;
+ const char data[] = {0,1,2,3,4,5,6,7};
+ QByteArray blockData;
+ blockData.append(data, sizeof(data));
+ QByteArray segmentData;
+
+ for (int i = 0x10; i <= 0x1F; ++i)
+ {
+ NfcTagRawCommandOperationType1 * op1 = new NfcTagRawCommandOperationType1(tester.target);
+ op1->setWriteBlock(i, blockData, QNearFieldTagType1::EraseAndWrite);
+ op1->setExpectedOkSignal();
+ op1->setExpectedResponse(QVariant(true));
+
+ rawCommandList.append(op1);
+ segmentData.append(blockData);
+ }
+
+ NfcTagRawCommandOperationType1 * op2 = new NfcTagRawCommandOperationType1(tester.target);
+ op2->setReadSegment(1);
+ op2->setExpectedOkSignal();
+ op2->setExpectedResponse(segmentData);
+ rawCommandList.append(op2);
+
+ OperationList rawCommandList1;
+
+ segmentData.clear();
+
+ for (int i = 0x10; i <= 0x1F; ++i)
+ {
+ NfcTagRawCommandOperationType1 * op1 = new NfcTagRawCommandOperationType1(tester.target);
+ op1->setWriteBlock(i, blockData, QNearFieldTagType1::EraseAndWrite);
+ op1->setExpectedOkSignal();
+ op1->setExpectedResponse(QVariant(true));
+
+ rawCommandList1.append(op1);
+ segmentData.append(blockData);
+ }
+
+ NfcTagRawCommandOperationType1 * op3 = new NfcTagRawCommandOperationType1(tester.target);
+ op3->setReadSegment(1);
+ op3->setExpectedOkSignal();
+ op3->setWaitOperation(NfcTagRawCommandOperationCommon::EWaitFalse);
+ op3->setExpectedResponse(segmentData);
+ rawCommandList1.append(op3);
+
+ tester.testRemoveTagBeforeAsyncRequestComplete(rawCommandList, rawCommandList1);
+ qDeleteAll(rawCommandList);
+ qDeleteAll(rawCommandList1);
+}
+
+void tst_qnearfieldtagtype1::testCancelNdefOperation()
+{
+ tester.touchTarget(" static ");
+ tester.testCancelNdefOperation();
+}
+
+void tst_qnearfieldtagtype1::_testRawAccessAndNdefAccess(const QList<QNdefMessage> &messages)
+{
+ QSignalSpy okSpy(tester.target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId&)));
+ QSignalSpy errSpy(tester.target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId&)));
+ QSignalSpy ndefMessageReadSpy(tester.target, SIGNAL(ndefMessageRead(QNdefMessage)));
+ QSignalSpy ndefMessageWriteSpy(tester.target, SIGNAL(ndefMessagesWritten()));
+
+ int okCount = 0;
+ int errCount = 0;
+ int ndefReadCount = 0;
+ int ndefWriteCount = 0;
+ qDebug()<<"okSpy.count()"<<okSpy.count();
+
+ // write ndef first
+ tester.target->writeNdefMessages(messages);
+ ++ndefWriteCount;
+ QTRY_COMPARE(ndefMessageWriteSpy.count(), ndefWriteCount);
+ qDebug()<<"okSpy.count()"<<okSpy.count();
+
+ // has Ndef message check
+ QVERIFY(tester.target->hasNdefMessage());
+ qDebug()<<"okSpy.count()"<<okSpy.count();
+
+ QNearFieldTarget::RequestId id = tester.target->readAll();
+ QVERIFY(tester.target->waitForRequestCompleted(id));
+ QByteArray allBlocks = tester.target->requestResponse(id).toByteArray();
+ ++okCount;
+ QCOMPARE(okSpy.count(), okCount);
+
+ // Verify readByte
+ QNearFieldTarget::RequestId id1 = tester.target->readByte(0x08);
+ QVERIFY(tester.target->waitForRequestCompleted(id1));
+ quint8 cc0 = tester.target->requestResponse(id1).value<quint8>();
+ QCOMPARE(cc0, quint8(0xE1));
+ ++okCount;
+ QCOMPARE(okSpy.count(), okCount);
+
+ QNearFieldTarget::RequestId id2 = tester.target->readByte(0x0d);
+ QVERIFY(tester.target->waitForRequestCompleted(id2));
+ quint8 len = tester.target->requestResponse(id2).value<quint8>();
+ QCOMPARE(int(len), messages.at(0).toByteArray().count());
+ ++okCount;
+ QCOMPARE(okSpy.count(), okCount);
+
+ QCOMPARE(allBlocks.mid(16, len), messages.at(0).toByteArray());
+
+ // Write NDEF with raw command
+ QNdefMessage message;
+ QNdefNfcTextRecord textRecord;
+ textRecord.setText("nfc");
+
+ message.append(textRecord);
+
+ QByteArray newNdefMessageContent = message.toByteArray();
+ quint8 ndefMessageContentLen = newNdefMessageContent.count();
+
+ QNearFieldTarget::RequestId id3 = tester.target->writeByte(0x0d, ndefMessageContentLen);
+ QVERIFY(tester.target->waitForRequestCompleted(id3));
+ QVERIFY(tester.target->requestResponse(id3).toBool());
+ ++okCount;
+ QCOMPARE(okSpy.count(), okCount);
+
+ quint8 block = 1;
+ quint8 byte = 6;
+ for (int i = 0; i < ndefMessageContentLen; ++i)
+ {
+ quint8 addr = (block & 0x0F);
+ addr <<= 3;
+ addr |= (byte & 0x07);
+ QNearFieldTarget::RequestId tempId = tester.target->writeByte(addr, newNdefMessageContent.at(i));
+ QVERIFY(tester.target->waitForRequestCompleted(tempId));
+ QVERIFY(tester.target->requestResponse(tempId).toBool());
+ byte = (7 == byte) ? 0 : (byte+1);
+ block = (0 == byte) ? (block+1) : block;
+ ++okCount;
+ QCOMPARE(okSpy.count(), okCount);
+ }
+
+ // read ndef with ndef access
+ tester.target->readNdefMessages();
+ ++ndefReadCount;
+ QTRY_COMPARE(ndefMessageReadSpy.count(), ndefReadCount);
+
+ const QNdefMessage& ndefMessage_new(ndefMessageReadSpy.first().at(0).value<QNdefMessage>());
+
+ QCOMPARE(newNdefMessageContent, ndefMessage_new.toByteArray());
+ QCOMPARE(errSpy.count(), errCount);
+}
+
+void tst_qnearfieldtagtype1::testRawAndNdefAccess()
+{
+ tester.touchTarget(" static ");
+ QByteArray uid = tester.target->uid();
+ QVERIFY(!uid.isEmpty());
+
+ QNdefMessage message;
+ QNdefNfcUriRecord uriRecord;
+ uriRecord.setUri(QUrl("http://qt.nokia.com"));
+ message.append(uriRecord);
+
+ QList<QNdefMessage> messages;
+ messages.append(message);
+
+ _testRawAccessAndNdefAccess(messages);
+ tester.removeTarget();
+}
+
+QTEST_MAIN(tst_qnearfieldtagtype1);
+
+#include "tst_qnearfieldtagtype1.moc"