ContentTests.cpp (6856B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 4 #include "ContentUtil.h" 5 #include "sfsclient/Content.h" 6 7 #include <catch2/catch_test_macros.hpp> 8 9 #define TEST(...) TEST_CASE("[ContentTests] " __VA_ARGS__) 10 #define TEST_SCENARIO(...) TEST_CASE("[ContentTests] Scenario: " __VA_ARGS__) 11 12 using namespace SFS; 13 using namespace SFS::details; 14 using namespace SFS::details::contentutil; 15 16 namespace 17 { 18 std::unique_ptr<File> GetFile(const std::string& fileId, 19 const std::string& url, 20 uint64_t sizeInBytes, 21 const std::unordered_map<HashType, std::string>& hashes) 22 { 23 std::unique_ptr<File> file; 24 REQUIRE(File::Make(fileId, url, sizeInBytes, hashes, file) == Result::Success); 25 REQUIRE(file != nullptr); 26 return file; 27 }; 28 29 std::unique_ptr<Content> GetContent(const std::string& contentNameSpace, 30 const std::string& contentName, 31 const std::string& contentVersion, 32 const std::vector<File>& files) 33 { 34 std::unique_ptr<Content> content; 35 REQUIRE(Content::Make(contentNameSpace, contentName, contentVersion, files, content) == Result::Success); 36 REQUIRE(content != nullptr); 37 return content; 38 }; 39 } // namespace 40 41 TEST_SCENARIO("Testing Content::Make()") 42 { 43 GIVEN("Elements that make up a content") 44 { 45 const std::string contentNameSpace{"myNameSpace"}; 46 const std::string contentName{"myName"}; 47 const std::string contentVersion{"myVersion"}; 48 49 std::unique_ptr<File> file1 = GetFile("fileId1", "url1", 1 /*sizeInBytes*/, {{HashType::Sha1, "sha1"}}); 50 std::unique_ptr<File> file2 = GetFile("fileId2", "url2", 1 /*sizeInBytes*/, {{HashType::Sha256, "sha256"}}); 51 52 std::vector<File> files; 53 files.push_back(std::move(*file1)); 54 files.push_back(std::move(*file2)); 55 56 // Getting raw pointers to check they don't match after copy but match after move 57 std::vector<File*> filePointers; 58 for (size_t i = 0; i < files.size(); ++i) 59 { 60 filePointers.push_back(&files[i]); 61 } 62 63 WHEN("A Content is created by copying the parameters") 64 { 65 std::unique_ptr<Content> copiedContent; 66 REQUIRE(Content::Make(contentNameSpace, contentName, contentVersion, files, copiedContent) == 67 Result::Success); 68 REQUIRE(copiedContent != nullptr); 69 70 THEN("The content elements are copies") 71 { 72 CHECK(contentNameSpace == copiedContent->GetContentId().GetNameSpace()); 73 CHECK(contentName == copiedContent->GetContentId().GetName()); 74 CHECK(contentVersion == copiedContent->GetContentId().GetVersion()); 75 76 // Files were cloned, so the pointers are different, but the contents should be similar 77 REQUIRE(files.size() == copiedContent->GetFiles().size()); 78 REQUIRE(filePointers.size() == copiedContent->GetFiles().size()); 79 for (size_t i = 0; i < files.size(); ++i) 80 { 81 // Checking ptrs 82 REQUIRE(filePointers[i] != &copiedContent->GetFiles()[i]); 83 REQUIRE(&files[i] != &copiedContent->GetFiles()[i]); 84 85 // Checking contents 86 CHECK((files[i] == copiedContent->GetFiles()[i])); 87 } 88 } 89 90 AND_THEN("Using the Make() that moves the file parameter really moves the parameter") 91 { 92 std::unique_ptr<Content> movedContent; 93 REQUIRE(Content::Make(contentNameSpace, contentName, contentVersion, std::move(files), movedContent) == 94 Result::Success); 95 REQUIRE(movedContent != nullptr); 96 97 // Checking contents 98 CHECK((*copiedContent == *movedContent)); 99 100 // Checking underlying pointers are the same since they were moved 101 REQUIRE(filePointers.size() == movedContent->GetFiles().size()); 102 REQUIRE(copiedContent->GetFiles().size() == movedContent->GetFiles().size()); 103 for (size_t i = 0; i < filePointers.size(); ++i) 104 { 105 REQUIRE(&copiedContent->GetFiles()[i] != &movedContent->GetFiles()[i]); 106 REQUIRE(filePointers[i] == &movedContent->GetFiles()[i]); 107 } 108 } 109 } 110 } 111 } 112 113 TEST("Testing Content equality operators") 114 { 115 const std::string contentNameSpace{"myNameSpace"}; 116 const std::string contentName{"myName"}; 117 const std::string contentVersion{"myVersion"}; 118 119 std::unique_ptr<File> file = GetFile("fileId", "url", 1 /*sizeInBytes*/, {{HashType::Sha1, "sha1"}}); 120 121 std::unique_ptr<File> clonedFile; 122 REQUIRE(File::Make(file->GetFileId(), file->GetUrl(), file->GetSizeInBytes(), file->GetHashes(), clonedFile) == 123 Result::Success); 124 125 std::vector<File> files; 126 files.push_back(std::move(*file)); 127 128 std::vector<File> clonedFiles; 129 clonedFiles.push_back(std::move(*clonedFile)); 130 131 const std::unique_ptr<Content> content = GetContent(contentNameSpace, contentName, contentVersion, files); 132 133 SECTION("Equal") 134 { 135 auto CompareContentEqual = [&content](const std::unique_ptr<Content>& sameContent) { 136 REQUIRE((*content == *sameContent)); 137 REQUIRE_FALSE((*content != *sameContent)); 138 }; 139 140 CompareContentEqual(GetContent(contentNameSpace, contentName, contentVersion, files)); 141 CompareContentEqual(GetContent(contentNameSpace, contentName, contentVersion, clonedFiles)); 142 } 143 144 SECTION("Not equal") 145 { 146 auto CompareContentNotEqual = [&content](const std::unique_ptr<Content>& otherContent) { 147 REQUIRE((*content != *otherContent)); 148 REQUIRE_FALSE((*content == *otherContent)); 149 }; 150 151 CompareContentNotEqual(GetContent("", contentName, contentVersion, files)); 152 CompareContentNotEqual(GetContent(contentNameSpace, "", contentVersion, files)); 153 CompareContentNotEqual(GetContent(contentNameSpace, contentName, "", files)); 154 CompareContentNotEqual(GetContent(contentNameSpace, contentName, contentVersion, {})); 155 CompareContentNotEqual(GetContent("", "", "", {})); 156 CompareContentNotEqual(GetContent("MYNAMESPACE", contentName, contentVersion, files)); 157 CompareContentNotEqual(GetContent(contentNameSpace, "MYNAME", contentVersion, files)); 158 CompareContentNotEqual(GetContent(contentNameSpace, contentName, "MYVERSION", files)); 159 } 160 }