/** * @brief TEST_F SdkTestShares * * Initialize a test scenario by: * * - Creating/uploading some folders/files to share * - Creating a new contact to share to * * Performs different operations related to sharing: * * - Share a folder with an existing contact * - Check the correctness of the outgoing share * - Check the reception and correctness of the incoming share * - Modify the access level * - Revoke the access to the share * - Share a folder with a non registered email * - Check the correctness of the pending outgoing share * - Create a public link * - Import a public link * - Get a node from public link * - Remove a public link */ TEST_F(SdkTest, SdkTestShares) { MegaShareList *sl; MegaShare *s; MegaNodeList *nl; MegaNode *n; MegaNode *n1; getMegaApiAux(); // login + fetchnodes // Initialize a test scenario : create some folders/files to share // Create some nodes to share // |--Shared-folder // |--subfolder // |--file.txt MegaNode *rootnode = megaApi->getRootNode(); char foldername1[64] = "Shared-folder"; MegaHandle hfolder1; responseReceived = false; megaApi->createFolder(foldername1, rootnode); waitForResponse(&responseReceived); ASSERT_EQ(MegaError::API_OK, lastError) << "Cannot create a folder (error: " << lastError << ")"; hfolder1 = h; // 'h' is set in 'onRequestFinish()' n1 = megaApi->getNodeByHandle(hfolder1); char foldername2[64] = "subfolder"; MegaHandle hfolder2; responseReceived = false; megaApi->createFolder(foldername2, megaApi->getNodeByHandle(hfolder1)); waitForResponse(&responseReceived); ASSERT_EQ(MegaError::API_OK, lastError) << "Cannot create a folder (error: " << lastError << ")"; hfolder2 = h; MegaHandle hfile1; createFile(PUBLICFILE.data(), false); // not a large file since don't need to test transfers here uploadFinished = false; megaApi->startUpload(PUBLICFILE.data(), megaApi->getNodeByHandle(hfolder1)); waitForResponse(&uploadFinished); ASSERT_EQ(MegaError::API_OK, lastError) << "Cannot upload file (error: " << lastError << ")"; hfile1 = h; // Initialize a test scenario: create a new contact to share to string message = "Hi contact. Let's share some stuff"; contactRequestUpdated = false; contactRequestUpdatedAux = false; ASSERT_NO_FATAL_FAILURE( inviteContact(emailaux, message, MegaContactRequest::INVITE_ACTION_ADD) ); waitForResponse(&contactRequestUpdatedAux); // at the target side (auxiliar account) waitForResponse(&contactRequestUpdated); // at the source side (main account) MegaContactRequestList *crlaux = megaApiAux->getIncomingContactRequests(); ASSERT_EQ(1, crlaux->size()) << "Too many incoming contact requests in auxiliar account"; MegaContactRequest *craux = crlaux->get(0); contactRequestUpdated = false; contactRequestUpdatedAux = false; ASSERT_NO_FATAL_FAILURE( replyContact(craux, MegaContactRequest::REPLY_ACTION_ACCEPT) ); waitForResponse(&contactRequestUpdatedAux); // at the target side (auxiliar account) waitForResponse(&contactRequestUpdated); // at the source side (main account) delete crlaux; // --- Create a new outgoing share --- nodeUpdated = false; nodeUpdatedAux = false; ASSERT_NO_FATAL_FAILURE( shareFolder(n1, emailaux.data(), MegaShare::ACCESS_READ) ); waitForResponse(&nodeUpdated); waitForResponse(&nodeUpdatedAux); // --- Check the outgoing share --- sl = megaApi->getOutShares(); ASSERT_EQ(1, sl->size()) << "Outgoing share failed"; s = sl->get(0); ASSERT_EQ(MegaShare::ACCESS_READ, s->getAccess()) << "Wrong access level of outgoing share"; ASSERT_EQ(hfolder1, s->getNodeHandle()) << "Wrong node handle of outgoing share"; ASSERT_STREQ(emailaux.data(), s->getUser()) << "Wrong email address of outgoing share"; ASSERT_TRUE(megaApi->isShared(n1)) << "Wrong sharing information at outgoing share"; ASSERT_TRUE(megaApi->isOutShare(n1)) << "Wrong sharing information at outgoing share"; delete sl; // --- Check the incoming share --- nl = megaApiAux->getInShares(megaApiAux->getContact(email.data())); ASSERT_EQ(1, nl->size()) << "Incoming share not received in auxiliar account"; n = nl->get(0); ASSERT_EQ(hfolder1, n->getHandle()) << "Wrong node handle of incoming share"; ASSERT_STREQ(foldername1, n->getName()) << "Wrong folder name of incoming share"; ASSERT_EQ(MegaError::API_OK, megaApiAux->checkAccess(n, MegaShare::ACCESS_READ).getErrorCode()) << "Wrong access level of incoming share"; ASSERT_TRUE(megaApiAux->isInShare(n)) << "Wrong sharing information at incoming share"; ASSERT_TRUE(megaApiAux->isShared(n)) << "Wrong sharing information at incoming share"; delete nl; // --- Modify the access level of an outgoing share --- nodeUpdated = false; nodeUpdatedAux = false; ASSERT_NO_FATAL_FAILURE( shareFolder(megaApi->getNodeByHandle(hfolder1), emailaux.data(), MegaShare::ACCESS_READWRITE) ); waitForResponse(&nodeUpdated); waitForResponse(&nodeUpdatedAux); nl = megaApiAux->getInShares(megaApiAux->getContact(email.data())); ASSERT_EQ(1, nl->size()) << "Incoming share not received in auxiliar account"; n = nl->get(0); ASSERT_EQ(MegaError::API_OK, megaApiAux->checkAccess(n, MegaShare::ACCESS_READWRITE).getErrorCode()) << "Wrong access level of incoming share"; delete nl; // --- Revoke access to an outgoing share --- nodeUpdated = false; nodeUpdatedAux = false; ASSERT_NO_FATAL_FAILURE( shareFolder(n1, emailaux.data(), MegaShare::ACCESS_UNKNOWN) ); waitForResponse(&nodeUpdated); waitForResponse(&nodeUpdatedAux); sl = megaApi->getOutShares(); ASSERT_EQ(0, sl->size()) << "Outgoing share revocation failed"; delete sl; nl = megaApiAux->getInShares(megaApiAux->getContact(email.data())); ASSERT_EQ(0, nl->size()) << "Incoming share revocation failed"; delete nl; // --- Get pending outgoing shares --- char emailfake[64]; srand (time(NULL)); sprintf(emailfake, "*****@*****.**", rand()%1000000); // carefull, antispam rejects too many tries without response for the same address n = megaApi->getNodeByHandle(hfolder2); nodeUpdated = false; ASSERT_NO_FATAL_FAILURE( shareFolder(n, emailfake, MegaShare::ACCESS_FULL) ); waitForResponse(&nodeUpdated); sl = megaApi->getPendingOutShares(n); delete n; ASSERT_EQ(1, sl->size()) << "Pending outgoing share failed"; s = sl->get(0); n = megaApi->getNodeByHandle(s->getNodeHandle()); // ASSERT_STREQ(emailfake, s->getUser()) << "Wrong email address of outgoing share"; User is not created yet ASSERT_FALSE(megaApi->isShared(n)) << "Node is already shared, must be pending"; ASSERT_FALSE(megaApi->isOutShare(n)) << "Node is already shared, must be pending"; delete sl; delete n; // --- Create a public link --- MegaNode *nfile1 = megaApi->getNodeByHandle(hfile1); ASSERT_NO_FATAL_FAILURE( createPublicLink(nfile1) ); // The created link is stored in this->link at onRequestFinish() // --- Import a public link --- ASSERT_NO_FATAL_FAILURE( importPublicLink(link, rootnode) ); MegaNode *nimported = megaApi->getNodeByHandle(h); ASSERT_STREQ(nfile1->getName(), nimported->getName()) << "Imported file with wrong name"; ASSERT_EQ(rootnode->getHandle(), nimported->getParentHandle()) << "Imported file in wrong path"; // --- Get node from public link --- ASSERT_NO_FATAL_FAILURE( getPublicNode(link) ); ASSERT_TRUE(publicNode->isPublic()) << "Cannot get a node from public link"; // --- Remove a public link --- ASSERT_NO_FATAL_FAILURE( removePublicLink(nfile1) ); delete nfile1; nfile1 = megaApi->getNodeByHandle(h); ASSERT_FALSE(nfile1->isPublic()) << "Public link removal failed (still public)"; delete nimported; }