123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- /*=========================================================================
- Library: CTK
- Copyright (c) 2013 University College London, Centre for Medical Image Computing
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0.txt
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =========================================================================*/
- #include "ctkXnatSessionTest.h"
- #include <QCoreApplication>
- #include <QCryptographicHash>
- #include <QDebug>
- #include <QDir>
- #include <QSignalSpy>
- #include <QStringList>
- #include <QTest>
- #include <QTime>
- #include <QTimer>
- #include <QUrl>
- #include <QUuid>
- #include <ctkXnatDataModel.h>
- #include <ctkXnatException.h>
- #include <ctkXnatFile.h>
- #include <ctkXnatLoginProfile.h>
- #include <ctkXnatProject.h>
- #include <ctkXnatResource.h>
- #include <ctkXnatResourceFolder.h>
- #include <ctkXnatSession.h>
- #include <ctkXnatSubject.h>
- class ctkXnatSessionTestCasePrivate
- {
- public:
- ctkXnatSession* Session;
- ctkXnatLoginProfile LoginProfile;
- QString Project;
- QString Subject;
- QString Experiment;
- QDateTime DateTime;
- };
- // --------------------------------------------------------------------------
- ctkXnatSessionTestCase::ctkXnatSessionTestCase()
- : d_ptr(new ctkXnatSessionTestCasePrivate())
- {
- }
- // --------------------------------------------------------------------------
- ctkXnatSessionTestCase::~ctkXnatSessionTestCase()
- {
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::initTestCase()
- {
- Q_D(ctkXnatSessionTestCase);
- d->LoginProfile.setName("ctk");
- d->LoginProfile.setServerUrl(QString("https://central.xnat.org"));
- d->LoginProfile.setUserName("ctk");
- d->LoginProfile.setPassword("ctk-xnat2015");
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::init()
- {
- Q_D(ctkXnatSessionTestCase);
- d->DateTime = QDateTime::currentDateTime();
- d->Session = new ctkXnatSession(d->LoginProfile);
- d->Session->open();
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::cleanupTestCase()
- {
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::cleanup()
- {
- Q_D(ctkXnatSessionTestCase);
- delete d->Session;
- d->Session = NULL;
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testProjectList()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatObject* dataModel = d->Session->dataModel();
- dataModel->fetch();
- QList<ctkXnatObject*> projects = dataModel->children();
- QVERIFY(projects.size() > 0);
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testResourceUri()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatObject* dataModel = d->Session->dataModel();
- QVERIFY(!dataModel->resourceUri().isNull());
- QVERIFY(dataModel->resourceUri().isEmpty());
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testParentChild()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatDataModel* dataModel = d->Session->dataModel();
- ctkXnatProject* project = new ctkXnatProject(dataModel);
- QVERIFY(project->parent() == dataModel);
- QVERIFY(dataModel->children().contains(project));
- dataModel->add(project);
- int numberOfOccurrences = 0;
- foreach (ctkXnatObject* serverProject, dataModel->children())
- {
- if (serverProject == project || serverProject->id() == project->id())
- {
- ++numberOfOccurrences;
- }
- }
- QVERIFY(numberOfOccurrences == 1);
- dataModel->remove(project);
- numberOfOccurrences = 0;
- foreach (ctkXnatObject* serverProject, dataModel->children())
- {
- if (serverProject == project || serverProject->id() == project->id())
- {
- ++numberOfOccurrences;
- }
- }
- QVERIFY(numberOfOccurrences == 0);
- delete project;
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testSession()
- {
- Q_D(ctkXnatSessionTestCase);
- QVERIFY(d->Session->isOpen());
- QDateTime expirationDate = d->Session->expirationDate();
- QVERIFY(d->DateTime < expirationDate);
- QTest::qSleep(2000);
- QUuid uuid = d->Session->httpGet("/data/version");
- QVERIFY(!uuid.isNull());
- d->Session->httpSync(uuid);
- QVERIFY(expirationDate < d->Session->expirationDate());
- try
- {
- d->Session->httpSync(uuid);
- QFAIL("Exception for unknown uuid expected");
- }
- catch(const ctkInvalidArgumentException&)
- {}
- d->Session->close();
- try
- {
- d->Session->dataModel();
- QFAIL("Exception for closed session expected");
- }
- catch(const ctkXnatInvalidSessionException&)
- {}
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testAuthenticationError()
- {
- ctkXnatLoginProfile loginProfile;
- loginProfile.setName("error");
- loginProfile.setServerUrl(QString("https://central.xnat.org"));
- loginProfile.setUserName("x");
- loginProfile.setPassword("y");
- ctkXnatSession session(loginProfile);
- try
- {
- session.open();
- QFAIL("Authenication error exception expected");
- }
- catch (const ctkXnatAuthenticationException&)
- {}
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testCreateProject()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatDataModel* dataModel = d->Session->dataModel();
- QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
- d->Project = projectId;
- ctkXnatProject* project = new ctkXnatProject(dataModel);
- project->setId(projectId);
- project->setName(projectId);
- project->setDescription("CTK_test_project");
- bool exists = d->Session->exists(project);
- QVERIFY(!exists);
- project->save();
- exists = d->Session->exists(project);
- QVERIFY(exists);
- d->Session->remove(project);
- exists = d->Session->exists(project);
- QVERIFY(!exists);
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testCreateSubject()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatDataModel* dataModel = d->Session->dataModel();
- QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
- d->Project = projectId;
- ctkXnatProject* project = new ctkXnatProject(dataModel);
- project->setId(projectId);
- project->setName(projectId);
- project->setDescription("CTK_test_project");
- QVERIFY(!project->exists());
- project->save();
- QVERIFY(project->exists());
- ctkXnatSubject* subject = new ctkXnatSubject(project);
- QString subjectName = QString("CTK_S") + QUuid::createUuid().toString().mid(1, 8);
- subject->setName(subjectName);
- subject->save();
- QVERIFY(!subject->id().isNull());
- subject->erase();
- QVERIFY(!subject->exists());
- project->erase();
- QVERIFY(!project->exists());
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testAddResourceFolder()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatDataModel* dataModel = d->Session->dataModel();
- QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
- d->Project = projectId;
- ctkXnatProject* project = new ctkXnatProject(dataModel);
- project->setId(projectId);
- project->setName(projectId);
- project->setDescription("CTK_test_project");
- QVERIFY(!project->exists());
- project->save();
- QVERIFY(project->exists());
- ctkXnatResource* resource = project->addResourceFolder("TestResource", "testFormat", "testContent", "testTag1,testTag2");
- QVERIFY(resource->exists());
- QVERIFY(resource->name() == "TestResource");
- QVERIFY(resource->format() == "testFormat");
- QVERIFY(resource->content() == "testContent");
- QVERIFY(resource->tags() == "testTag1,testTag2");
- ctkXnatResourceFolder* folder = dynamic_cast<ctkXnatResourceFolder*>(resource->parent());
- QVERIFY(folder->exists());
- QVERIFY(folder != 0);
- QVERIFY(folder->name() == "Resources");
- project->erase();
- QVERIFY(!project->exists());
- QVERIFY(!folder->exists());
- QVERIFY(!resource->exists());
- }
- // --------------------------------------------------------------------------
- void ctkXnatSessionTestCase::testUploadAndDownloadFile()
- {
- Q_D(ctkXnatSessionTestCase);
- ctkXnatDataModel* dataModel = d->Session->dataModel();
- QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
- d->Project = projectId;
- ctkXnatProject* project = new ctkXnatProject(dataModel);
- project->setId(projectId);
- project->setName(projectId);
- project->setDescription("CTK_test_project");
- QVERIFY(!project->exists());
- project->save();
- QVERIFY(project->exists());
- ctkXnatResource* resource = project->addResourceFolder("TestResourceContainingData");
- QVERIFY(resource->exists());
- QVERIFY(resource->name() == "TestResourceContainingData");
- QVERIFY(resource->format() == "");
- QVERIFY(resource->content() == "");
- QVERIFY(resource->tags() == "");
- QString tempDirPath = QDir::tempPath() + QUuid::createUuid().toString().mid(1, 8);
- QString uploadFileName = tempDirPath + "/ctk_xnat_upload_" + QUuid::createUuid().toString().mid(1, 8) + ".txt";
- QString downloadFileName = tempDirPath + "/ctk_xnat_download_" + QUuid::createUuid().toString().mid(1, 8) + ".txt";
- QDir tempDir;
- if (tempDir.mkdir(tempDirPath))
- {
- QFile uploadedFile(uploadFileName);
- if (uploadedFile.open(QFile::ReadWrite))
- {
- QTextStream stream( &uploadedFile );
- stream << "Hi, I am a CTK test file! ;-)" << endl;
- QFileInfo fileInfo;
- fileInfo.setFile(uploadFileName);
- // Create xnatFile object
- ctkXnatFile* xnatFile = new ctkXnatFile(resource);
- xnatFile->setLocalFilePath(fileInfo.filePath());
- xnatFile->setName(fileInfo.fileName());
- xnatFile->setFileFormat("some format");
- xnatFile->setFileContent("some content");
- xnatFile->setFileTags("some, tags");
- resource->add(xnatFile);
- // Actual file upload
- xnatFile->save();
- QVERIFY(xnatFile->exists());
- xnatFile->download(downloadFileName);
- QFile downloadedFile(downloadFileName);
- QVERIFY(downloadedFile.exists());
- uploadedFile.close();
- if (downloadedFile.open(QFile::ReadOnly) && uploadedFile.open(QFile::ReadOnly))
- {
- QCryptographicHash hashUploaded(QCryptographicHash::Md5);
- QCryptographicHash hashDownloaded(QCryptographicHash::Md5);
- #if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
- hashUploaded.addData(&uploadedFile);
- hashDownloaded.addData(&downloadedFile);
- #else
- hashUploaded.addData(uploadedFile.readAll());
- hashDownloaded.addData(downloadedFile.readAll());
- #endif
- QString md5ChecksumUploaded(hashUploaded.result().toHex());
- QString md5ChecksumDownloaded(hashDownloaded.result().toHex());
- QVERIFY (md5ChecksumDownloaded == md5ChecksumUploaded);
- // Remove the data from XNAT
- project->erase();
- QVERIFY(!project->exists());
- QVERIFY(!resource->exists());
- QVERIFY(!xnatFile->exists());
- // Remove the local data
- uploadedFile.close();
- downloadedFile.close();
- uploadedFile.remove();
- downloadedFile.remove();
- tempDir.cdUp();
- tempDir.rmdir(tempDirPath);
- }
- else
- {
- qWarning()<<"Could not open files for validation! Could not finish test!";
- }
- }
- else
- {
- qWarning()<<"Could not create temporary file for upload! Could not finish test!";
- return;
- }
- }
- else
- {
- qWarning()<<"Could not create temporary directory! Could not finish test!";
- }
- }
- // --------------------------------------------------------------------------
- int ctkXnatSessionTest(int argc, char* argv[])
- {
- QCoreApplication app(argc, argv);
- ctkXnatSessionTestCase test;
- return QTest::qExec(&test, argc, argv);
- }
|