Changeset View
Changeset View
Standalone View
Standalone View
autotests/libs/itemstoretest.cpp
Show First 20 Lines • Show All 414 Lines • ▼ Show 20 Line(s) | 410 | { | |||
---|---|---|---|---|---|
415 | AKVERIFYEXEC(fetchJob); | 415 | AKVERIFYEXEC(fetchJob); | ||
416 | QCOMPARE(fetchJob->items().size(), 1); | 416 | QCOMPARE(fetchJob->items().size(), 1); | ||
417 | const Item fetchedItem = fetchJob->items().first(); | 417 | const Item fetchedItem = fetchJob->items().first(); | ||
418 | QCOMPARE(fetchedItem.flags().count(), 1); | 418 | QCOMPARE(fetchedItem.flags().count(), 1); | ||
419 | QCOMPARE(fetchedItem.attributes().count(), 1); | 419 | QCOMPARE(fetchedItem.attributes().count(), 1); | ||
420 | QCOMPARE(fetchedItem.attribute<TestAttribute>()->data, "modified"); | 420 | QCOMPARE(fetchedItem.attribute<TestAttribute>()->data, "modified"); | ||
421 | } | 421 | } | ||
422 | } | 422 | } | ||
423 | | ||||
424 | class ParallelJobsRunner | ||||
425 | { | ||||
426 | public: | ||||
427 | ParallelJobsRunner(int count) | ||||
428 | : numSessions(count) | ||||
429 | { | ||||
430 | sessions.reserve(numSessions); | ||||
431 | modifyJobs.reserve(numSessions); | ||||
432 | for (int i = 0 ; i < numSessions; ++i) { | ||||
433 | auto session = new Session(QByteArray::number(i)); | ||||
434 | sessions.push_back(session); | ||||
435 | } | ||||
436 | } | ||||
437 | | ||||
438 | ~ParallelJobsRunner() | ||||
439 | { | ||||
440 | qDeleteAll(sessions); | ||||
441 | } | ||||
442 | | ||||
443 | void addJob(ItemModifyJob *mjob) | ||||
444 | { | ||||
445 | modifyJobs.push_back(mjob); | ||||
446 | QObject::connect(mjob, &KJob::result, [mjob, this]() { | ||||
447 | if (mjob->error()) { | ||||
448 | errors.append(mjob->errorString()); | ||||
449 | } | ||||
450 | doneJobs.push_back(mjob); | ||||
451 | }); | ||||
452 | } | ||||
453 | | ||||
454 | void waitForAllJobs() | ||||
455 | { | ||||
456 | for (int i = 0 ; i < modifyJobs.count(); ++i) { | ||||
457 | ItemModifyJob *mjob = modifyJobs.at(i); | ||||
458 | if (!doneJobs.contains(mjob)) { | ||||
459 | QSignalSpy spy(mjob, &ItemModifyJob::result); | ||||
460 | QVERIFY(spy.wait()); | ||||
461 | if (mjob->error()) | ||||
462 | qWarning() << mjob->errorString(); | ||||
463 | QCOMPARE(mjob->error(), KJob::NoError); | ||||
464 | } | ||||
465 | } | ||||
466 | QVERIFY2(errors.isEmpty(), qPrintable(errors.join(QLatin1String("; ")))); | ||||
467 | } | ||||
468 | | ||||
469 | const int numSessions; | ||||
470 | std::vector<Session *> sessions; | ||||
471 | QVector<ItemModifyJob *> modifyJobs, doneJobs; | ||||
472 | QStringList errors; | ||||
473 | }; | ||||
474 | | ||||
475 | void ItemStoreTest::testParallelJobsAddingAttributes() | ||||
476 | { | ||||
477 | // Given an item (created on the server) | ||||
478 | Item::Id itemId; | ||||
479 | { | ||||
480 | Item item; | ||||
481 | item.setMimeType(QStringLiteral("text/directory")); | ||||
482 | ItemCreateJob *job = new ItemCreateJob(item, res1_foo); | ||||
483 | AKVERIFYEXEC(job); | ||||
484 | itemId = job->item().id(); | ||||
485 | QVERIFY(itemId >= 0); | ||||
486 | } | ||||
487 | | ||||
488 | // When adding N attributes from N different sessions (e.g. threads or processes) | ||||
489 | ParallelJobsRunner runner(10); | ||||
490 | for (int i = 0 ; i < runner.numSessions; ++i) { | ||||
491 | Item item(itemId); | ||||
492 | Attribute *attr = AttributeFactory::createAttribute("type" + QByteArray::number(i)); | ||||
493 | QVERIFY(attr); | ||||
494 | attr->deserialize("attr" + QByteArray::number(i)); | ||||
495 | item.addAttribute(attr); | ||||
496 | ItemModifyJob *mjob = new ItemModifyJob(item, runner.sessions.at(i)); | ||||
497 | runner.addJob(mjob); | ||||
498 | } | ||||
499 | runner.waitForAllJobs(); | ||||
500 | | ||||
501 | // Then the item should have all attributes | ||||
502 | ItemFetchJob *fetchJob = new ItemFetchJob(Item(itemId)); | ||||
503 | ItemFetchScope fetchScope; | ||||
504 | fetchScope.fetchAllAttributes(true); | ||||
505 | fetchJob->setFetchScope(fetchScope); | ||||
506 | AKVERIFYEXEC(fetchJob); | ||||
507 | QCOMPARE(fetchJob->items().size(), 1); | ||||
508 | const Item fetchedItem = fetchJob->items().first(); | ||||
509 | QCOMPARE(fetchedItem.attributes().count(), runner.numSessions); | ||||
510 | } |