diff --git a/node/fixtures/Background/SyncMembershipFixtures.php b/node/fixtures/Background/SyncMembershipFixtures.php new file mode 100644 index 0000000..5bad18a --- /dev/null +++ b/node/fixtures/Background/SyncMembershipFixtures.php @@ -0,0 +1,72 @@ +getLabel()), + 0, + $node1, + new \DateTimeImmutable('2024-09-09 14:55:0'), + true, + UuidV7::fromString(self::VIRUTAL_NODE_1) + ); + + $node1VirtualNodesCollection->add($vm1); + + $manager->persist($vm1); + $manager->persist($node1); + + $this->loadHistory($manager); + + $manager->flush(); + } + + private function loadHistory(ObjectManager $manager) + { + $h = new HistoryEvent( + UuidV7::fromString('019239be-19ea-7ba7-b38d-1855553df0f7'), + UuidV7::fromString(self::NODE_1), + HistoryEventType::CHANGE_MEMBERSHIP, + new \DateTimeImmutable('2024-09-09 16:50:00'), + (string) MembershipState::JOINED->value, + null, + null + ); + + $manager->persist($h); + } +} diff --git a/node/tests/Application/Background/SyncMembershipControllerTest.php b/node/tests/Application/Background/SyncMembershipControllerTest.php new file mode 100644 index 0000000..0c59a3d --- /dev/null +++ b/node/tests/Application/Background/SyncMembershipControllerTest.php @@ -0,0 +1,123 @@ + self::NODE_2, + 'historyEvents' => [ + [ + 'id' => self::HISTORY_EVENT_1, + 'node' => self::NODE_2, + 'type' => 0, + 'data' => '0', + 'eventTime' => '2024-10-09T14:56:49.086Z', + ], + ], + 'nodes' => [ + [ + 'id' => self::NODE_2, + 'host' => 'localhost', + 'networkPort' => 9003, + 'state' => 0, + 'joinedAt' => '2024-09-09T14:56:49.086Z', + 'weight' => 1, + 'seed' => true, + 'updatedAt' => '2024-09-09T14:56:49.086Z', + 'label' => 'F', + 'virtualNodes' => [ + [ + 'id' => self::VIRTUAL_NODE_2, + 'label' => 'F1', + 'slot' => 180, + 'createdAt' => '2024-09-09T14:56:49.086Z', + 'active' => true, + ], + ], + ], + ], + ]; + + public function testMembershipSyncSuccess(): void + { + $this->databaseTool->loadFixtures([ + SyncMembershipFixtures::class, + ]); + + $this->client->followRedirects(); + $this->postJson(self::URI, self::JSON_DATA); + + self::assertResponseIsSuccessful(); + + /** @var EntityManagerInterface $em */ + $em = self::getContainer()->get(EntityManagerInterface::class); + $nodes = $em->getRepository(Node::class)->findAll(); + $historyEvents = $em->getRepository(HistoryEvent::class)->findAll(); + $preferenceListEntries = $em->getRepository(PreferenceListEntry::class)->findAll(); + + self::assertCount(2, $nodes); + + $nodesMap = []; + foreach ($nodes as $node) { + $nodesMap[$node->getId()->toRfc4122()] = $node; + } + + $node1Result = $nodesMap[SyncMembershipFixtures::NODE_1]; + $node2Result = $nodesMap[self::NODE_2]; + + self::assertCount(1, $node1Result->getVirtualNodes()); + self::assertCount(1, $node2Result->getVirtualNodes()); + + $virtualNode1 = $node1Result->getVirtualNodes()->first(); + $virtualNode2 = $node2Result->getVirtualNodes()->first(); + + self::assertEquals(SyncMembershipFixtures::VIRUTAL_NODE_1, $virtualNode1->getId()->toRfc4122()); + self::assertEquals(self::VIRTUAL_NODE_2, $virtualNode2->getId()->toRfc4122()); + + self::assertTrue($virtualNode1->isActive()); + self::assertTrue($virtualNode2->isActive()); + + self::assertCount(2, $historyEvents); + + $newHistoryEventFiltered = array_filter($historyEvents, fn (HistoryEvent $historyEvent) => self::HISTORY_EVENT_1 === $historyEvent->getId()->toRfc4122()); + self::assertCount(1, $newHistoryEventFiltered); + + /** @var HistoryEvent $newHistoryEvent */ + $newHistoryEvent = current($newHistoryEventFiltered); + + assertEquals(self::NODE_2, $newHistoryEvent->getNode()->toRfc4122()); + self::assertNotNull($newHistoryEvent->getReceivedAt()); + + self::assertCount(RingInformations::RING_SIZE, $preferenceListEntries); + + foreach ($preferenceListEntries as $preferenceEntry) { + if ($preferenceEntry->getSlot() >= 0 && $preferenceEntry->getSlot() < 180) { + assertEquals(SyncMembershipFixtures::NODE_1, $preferenceEntry->getOwnerId()->toRfc4122()); + assertEquals(self::NODE_2, current($preferenceEntry->getCoordinatorsIds())->toRfc4122()); + } else { + assertEquals(self::NODE_2, $preferenceEntry->getOwnerId()->toRfc4122()); + assertEquals(SyncMembershipFixtures::NODE_1, current($preferenceEntry->getCoordinatorsIds())->toRfc4122()); + } + assertCount(1, $preferenceEntry->getCoordinatorsIds()); + assertEmpty($preferenceEntry->getOthersNodesIds()); + } + } +}