Skip to content
Snippets Groups Projects
Commit 830d4857 authored by Sébastien Blin's avatar Sébastien Blin
Browse files

test: split ut_conversation

Change-Id: I14df750d459a0771f4e60923a1ecf3bfb938a78b
parent f045eb97
No related branches found
No related tags found
No related merge requests found
...@@ -149,7 +149,7 @@ ut_conversationRepository_SOURCES = conversationRepository/conversationRepositor ...@@ -149,7 +149,7 @@ ut_conversationRepository_SOURCES = conversationRepository/conversationRepositor
# conversation # conversation
# #
check_PROGRAMS += ut_conversation check_PROGRAMS += ut_conversation
ut_conversation_SOURCES = conversation/conversation.cpp common.cpp ut_conversation_SOURCES = conversation/conversationcommon.cpp conversation/conversation.cpp common.cpp
# #
# media_negotiation # media_negotiation
# #
...@@ -162,6 +162,18 @@ ut_media_negotiation_SOURCES = media_negotiation/media_negotiation.cpp common.cp ...@@ -162,6 +162,18 @@ ut_media_negotiation_SOURCES = media_negotiation/media_negotiation.cpp common.cp
check_PROGRAMS += ut_compability check_PROGRAMS += ut_compability
ut_compability_SOURCES = conversation/compability.cpp ut_compability_SOURCES = conversation/compability.cpp
#
# conversationRequest
#
check_PROGRAMS += ut_conversationRequest
ut_conversationRequest_SOURCES = conversation/conversationRequest.cpp common.cpp
#
# conversationMembersEvent
#
check_PROGRAMS += ut_conversationMembersEvent
ut_conversationMembersEvent_SOURCES = conversation/conversationMembersEvent.cpp conversation/conversationcommon.cpp common.cpp
# #
# syncHistory # syncHistory
# #
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* Copyright (C) 2021 Savoir-faire Linux Inc.
*
* Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <yaml-cpp/yaml.h>
#include <filesystem>
#include "common.h"
/* Jami */
#include "account_const.h"
#include "base64.h"
#include "jami.h"
#include "fileutils.h"
#include "manager.h"
#include "jamidht/conversation.h"
#include "jamidht/conversationrepository.h"
#include "conversation/conversationcommon.h"
using namespace std::string_literals;
/* Make GCC quiet about unused functions */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
namespace jami {
void
addVote(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& votedUri,
const std::string& content)
{
auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + account->getAccountID()
+ DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
auto voteDirectory = repoPath + DIR_SEPARATOR_STR + "votes" + DIR_SEPARATOR_STR + "members";
auto voteFile = voteDirectory + DIR_SEPARATOR_STR + votedUri;
if (!fileutils::recursive_mkdir(voteDirectory, 0700)) {
return;
}
std::ofstream file(voteFile);
if (file.is_open()) {
file << content;
file.close();
}
Json::Value json;
json["uri"] = votedUri;
json["type"] = "vote";
Json::StreamWriterBuilder wbuilder;
wbuilder["commentStyle"] = "None";
wbuilder["indentation"] = "";
ConversationRepository cr(account->weak(), convId);
cr.commitMessage(Json::writeString(wbuilder, json));
}
void
simulateRemoval(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& votedUri)
{
auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + account->getAccountID()
+ DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
auto memberFile = repoPath + DIR_SEPARATOR_STR + "members" + DIR_SEPARATOR_STR + votedUri
+ ".crt";
auto bannedFile = repoPath + DIR_SEPARATOR_STR + "banned" + DIR_SEPARATOR_STR + "members"
+ DIR_SEPARATOR_STR + votedUri + ".crt";
std::rename(memberFile.c_str(), bannedFile.c_str());
git_repository* repo = nullptr;
if (git_repository_open(&repo, repoPath.c_str()) != 0)
return;
GitRepository rep = {std::move(repo), git_repository_free};
// git add -A
git_index* index_ptr = nullptr;
if (git_repository_index(&index_ptr, repo) < 0)
return;
GitIndex index {index_ptr, git_index_free};
git_strarray array = {nullptr, 0};
git_index_add_all(index.get(), &array, 0, nullptr, nullptr);
git_index_write(index.get());
git_strarray_dispose(&array);
ConversationRepository cr(account->weak(), convId);
Json::Value json;
json["action"] = "ban";
json["uri"] = votedUri;
json["type"] = "member";
Json::StreamWriterBuilder wbuilder;
wbuilder["commentStyle"] = "None";
wbuilder["indentation"] = "";
cr.commitMessage(Json::writeString(wbuilder, json));
DRing::sendMessage(account->getAccountID(),
convId,
"trigger the fake history to be pulled"s,
"");
}
void
addFile(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& relativePath,
const std::string& content)
{
auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + account->getAccountID()
+ DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
// Add file
auto p = std::filesystem::path(fileutils::getFullPath(repoPath, relativePath));
fileutils::recursive_mkdir(p.parent_path());
std::ofstream file(p);
if (file.is_open()) {
file << content;
file.close();
}
git_repository* repo = nullptr;
if (git_repository_open(&repo, repoPath.c_str()) != 0)
return;
GitRepository rep = {std::move(repo), git_repository_free};
// git add -A
git_index* index_ptr = nullptr;
if (git_repository_index(&index_ptr, repo) < 0)
return;
GitIndex index {index_ptr, git_index_free};
git_strarray array = {nullptr, 0};
git_index_add_all(index.get(), &array, 0, nullptr, nullptr);
git_index_write(index.get());
git_strarray_dispose(&array);
}
void
addAll(std::shared_ptr<JamiAccount> account, const std::string& convId)
{
auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + account->getAccountID()
+ DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
git_repository* repo = nullptr;
if (git_repository_open(&repo, repoPath.c_str()) != 0)
return;
GitRepository rep = {std::move(repo), git_repository_free};
// git add -A
git_index* index_ptr = nullptr;
if (git_repository_index(&index_ptr, repo) < 0)
return;
GitIndex index {index_ptr, git_index_free};
git_strarray array = {nullptr, 0};
git_index_add_all(index.get(), &array, 0, nullptr, nullptr);
git_index_write(index.get());
git_strarray_dispose(&array);
}
void
commit(std::shared_ptr<JamiAccount> account, const std::string& convId, Json::Value& message)
{
ConversationRepository cr(account->weak(), convId);
Json::StreamWriterBuilder wbuilder;
wbuilder["commentStyle"] = "None";
wbuilder["indentation"] = "";
cr.commitMessage(Json::writeString(wbuilder, message));
}
std::string
commitInRepo(const std::string& path, std::shared_ptr<JamiAccount> account, const std::string& msg)
{
auto deviceId = std::string(account->currentDeviceId());
auto name = account->getDisplayName();
if (name.empty())
name = deviceId;
git_signature* sig_ptr = nullptr;
// Sign commit's buffer
if (git_signature_new(&sig_ptr, name.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) {
JAMI_ERR("Unable to create a commit signature.");
return {};
}
GitSignature sig {sig_ptr, git_signature_free};
// Retrieve current index
git_index* index_ptr = nullptr;
git_repository* repo = nullptr;
// TODO share this repo with GitServer
if (git_repository_open(&repo, path.c_str()) != 0) {
JAMI_ERR("Could not open repository");
return {};
}
if (git_repository_index(&index_ptr, repo) < 0) {
JAMI_ERR("Could not open repository index");
return {};
}
GitIndex index {index_ptr, git_index_free};
git_oid tree_id;
if (git_index_write_tree(&tree_id, index.get()) < 0) {
JAMI_ERR("Unable to write initial tree from index");
return {};
}
git_tree* tree_ptr = nullptr;
if (git_tree_lookup(&tree_ptr, repo, &tree_id) < 0) {
JAMI_ERR("Could not look up initial tree");
return {};
}
GitTree tree = {tree_ptr, git_tree_free};
git_oid commit_id;
if (git_reference_name_to_id(&commit_id, repo, "HEAD") < 0) {
JAMI_ERR("Cannot get reference for HEAD");
return {};
}
git_commit* head_ptr = nullptr;
if (git_commit_lookup(&head_ptr, repo, &commit_id) < 0) {
JAMI_ERR("Could not look up HEAD commit");
return {};
}
GitCommit head_commit {head_ptr, git_commit_free};
git_buf to_sign = {};
const git_commit* head_ref[1] = {head_commit.get()};
if (git_commit_create_buffer(
&to_sign, repo, sig.get(), sig.get(), nullptr, msg.c_str(), tree.get(), 1, &head_ref[0])
< 0) {
JAMI_ERR("Could not create commit buffer");
return {};
}
// git commit -S
auto to_sign_vec = std::vector<uint8_t>(to_sign.ptr, to_sign.ptr + to_sign.size);
auto signed_buf = account->identity().first->sign(to_sign_vec);
std::string signed_str = base64::encode(signed_buf);
if (git_commit_create_with_signature(&commit_id,
repo,
to_sign.ptr,
signed_str.c_str(),
"signature")
< 0) {
JAMI_ERR("Could not sign commit");
return {};
}
// Move commit to main branch
git_reference* ref_ptr = nullptr;
if (git_reference_create(&ref_ptr, repo, "refs/heads/main", &commit_id, true, nullptr) < 0) {
JAMI_WARN("Could not move commit to main");
}
git_reference_free(ref_ptr);
git_repository_free(repo);
auto commit_str = git_oid_tostr_s(&commit_id);
if (commit_str) {
JAMI_INFO("New message added with id: %s", commit_str);
return commit_str;
}
return {};
}
} // namespace jami
#pragma GCC diagnostic pop
/*
* Copyright (C) 2021 Savoir-faire Linux Inc.
*
* Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
#include "jamidht/jamiaccount.h"
#include <string>
namespace jami {
void addVote(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& votedUri,
const std::string& content);
void simulateRemoval(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& votedUri);
void addFile(std::shared_ptr<JamiAccount> account,
const std::string& convId,
const std::string& relativePath,
const std::string& content = "");
void addAll(std::shared_ptr<JamiAccount> account, const std::string& convId);
void commit(std::shared_ptr<JamiAccount> account, const std::string& convId, Json::Value& message);
std::string commitInRepo(const std::string& repoPath,
std::shared_ptr<JamiAccount> account,
const std::string& message);
} // namespace jami
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment