winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }