registry.cpp (5638B)
1 #include "helper.hpp" 2 3 #include <registry.hpp> 4 5 #include <errors.hpp> 6 #include <index.hpp> 7 #include <package.hpp> 8 #include <remote.hpp> 9 10 static const char *M = "[registry]"; 11 12 #define MAKE_PACKAGE \ 13 Index ri("Remote Name"); \ 14 Category cat("Category Name", &ri); \ 15 Package pkg(Package::ScriptType, "Hello", &cat); \ 16 pkg.setDescription("Hello World"); \ 17 Version ver("1.0", &pkg); \ 18 ver.setAuthor("John Doe"); \ 19 Source *src = new Source("file", "url", &ver); \ 20 ver.addSource(src); 21 22 TEST_CASE("query uninstalled package", M) { 23 MAKE_PACKAGE 24 25 Registry reg; 26 27 const Registry::Entry &entry = reg.getEntry(&pkg); 28 REQUIRE_FALSE(entry); 29 REQUIRE(entry.id == 0); 30 REQUIRE(entry.version == VersionName()); 31 } 32 33 TEST_CASE("query installed package", M) { 34 MAKE_PACKAGE 35 36 Registry reg; 37 38 const Registry::Entry &entry = reg.push(&ver, 2); 39 REQUIRE(entry); 40 REQUIRE(entry.id == 1); 41 REQUIRE(entry.remote == "Remote Name"); 42 REQUIRE(entry.category == "Category Name"); 43 REQUIRE(entry.package == "Hello"); 44 REQUIRE(entry.type == Package::ScriptType); 45 REQUIRE(entry.version.toString() == "1.0"); 46 REQUIRE(entry.author == "John Doe"); 47 REQUIRE(entry.flags == 2); 48 49 const Registry::Entry &selectEntry = reg.getEntry(&pkg); 50 REQUIRE(selectEntry.id == entry.id); 51 REQUIRE(selectEntry.remote == entry.remote); 52 REQUIRE(selectEntry.category == entry.category); 53 REQUIRE(selectEntry.package == entry.package); 54 REQUIRE(selectEntry.description == entry.description); 55 REQUIRE(selectEntry.type == entry.type); 56 REQUIRE(selectEntry.version == entry.version); 57 REQUIRE(selectEntry.author == entry.author); 58 REQUIRE(selectEntry.flags == entry.flags); 59 } 60 61 TEST_CASE("bump version", M) { 62 MAKE_PACKAGE 63 64 Version ver2("2.0", &pkg); 65 ver2.addSource(new Source("file", "url", &ver2)); 66 67 Registry reg; 68 reg.push(&ver, 1); 69 70 const Registry::Entry &entry1 = reg.getEntry(&pkg); 71 REQUIRE(entry1.version.toString() == "1.0"); 72 CHECK(entry1.author == "John Doe"); 73 CHECK(entry1.flags == 1); 74 75 reg.push(&ver2, 2); 76 const Registry::Entry &entry2 = reg.getEntry(&pkg); 77 REQUIRE(entry2.version.toString() == "2.0"); 78 CHECK(entry2.author == ""); 79 REQUIRE(entry2.flags == 2); 80 81 REQUIRE(entry2.id == entry1.id); 82 } 83 84 TEST_CASE("get file list", M) { 85 MAKE_PACKAGE 86 87 Registry reg; 88 REQUIRE(reg.getFiles(reg.getEntry(&pkg)).empty()); 89 90 reg.push(&ver); 91 92 const std::vector<Registry::File> &files = reg.getFiles(reg.getEntry(&pkg)); 93 REQUIRE(files.size() == 1); 94 REQUIRE(files[0].path == src->targetPath()); 95 REQUIRE(files[0].sections == 0); 96 REQUIRE(files[0].type == pkg.type()); 97 } 98 99 TEST_CASE("query all packages", M) { 100 MAKE_PACKAGE 101 102 const std::string remote = "Remote Name"; 103 104 Registry reg; 105 REQUIRE(reg.getEntries(remote).empty()); 106 107 reg.push(&ver); 108 109 const std::vector<Registry::Entry> &entries = reg.getEntries(remote); 110 REQUIRE(entries.size() == 1); 111 REQUIRE(entries[0].id == 1); 112 REQUIRE(entries[0].remote == "Remote Name"); 113 REQUIRE(entries[0].category == "Category Name"); 114 REQUIRE(entries[0].package == "Hello"); 115 REQUIRE(entries[0].type == Package::ScriptType); 116 REQUIRE(entries[0].version.toString() == "1.0"); 117 REQUIRE(entries[0].author == "John Doe"); 118 } 119 120 TEST_CASE("forget registry entry", M) { 121 MAKE_PACKAGE 122 123 Registry reg; 124 reg.forget(reg.push(&ver)); 125 126 const Registry::Entry &afterForget = reg.getEntry(&pkg); 127 REQUIRE(afterForget.id == 0); // uninstalled 128 } 129 130 TEST_CASE("file conflicts", M) { 131 Registry reg; 132 133 { 134 MAKE_PACKAGE 135 reg.push(&ver); 136 } 137 138 Index ri("Remote Name"); 139 Category cat("Category Name", &ri); 140 Package pkg(Package::ScriptType, "Duplicate Package", &cat); 141 Version ver("1.0", &pkg); 142 Source *src1 = new Source("file", "url", &ver); 143 ver.addSource(src1); 144 Source *src2 = new Source("file2", "url", &ver); 145 ver.addSource(src2); 146 147 CHECK(reg.getEntry(&pkg).id == 0); // uninstalled 148 149 try { 150 reg.push(&ver); 151 FAIL("duplicate is accepted"); 152 } 153 catch(const reapack_error &) {} 154 155 CHECK(reg.getEntry(&pkg).id == 0); // still uninstalled 156 157 std::vector<Path> conflicts; 158 const auto &pushResult = reg.push(&ver, 0, &conflicts); 159 CHECK(pushResult.id == 0); 160 161 REQUIRE(conflicts.size() == 1); 162 REQUIRE(conflicts[0] == src1->targetPath()); 163 164 REQUIRE(reg.getEntry(&pkg).id == 0); // never installed 165 } 166 167 TEST_CASE("get main files", M) { 168 MAKE_PACKAGE 169 170 Registry reg; 171 REQUIRE(reg.getMainFiles({}).empty()); 172 173 Source *main1 = new Source({}, "url", &ver); 174 main1->setSections(Source::MIDIEditorSection); 175 main1->setTypeOverride(Package::EffectType); 176 ver.addSource(main1); 177 178 Source *main2 = new Source({}, "url", &ver); // duplicate file ignored 179 main2->setSections(Source::MainSection); 180 main2->setTypeOverride(Package::EffectType); 181 ver.addSource(main2); 182 183 const Registry::Entry &entry = reg.push(&ver); 184 185 const std::vector<Registry::File> ¤t = reg.getMainFiles(entry); 186 REQUIRE(current.size() == 1); 187 REQUIRE(current[0].path == main1->targetPath()); 188 REQUIRE(current[0].sections == Source::MIDIEditorSection); 189 REQUIRE(current[0].type == Package::EffectType); 190 } 191 192 TEST_CASE("registry entry flags", M) { 193 MAKE_PACKAGE 194 195 Registry reg; 196 reg.push(&ver); 197 198 const Registry::Entry &entry = reg.getEntry(&pkg); 199 REQUIRE(entry.flags == 0); 200 201 reg.setFlags(entry, 2); 202 REQUIRE(reg.getEntry(&pkg).flags == 2); 203 REQUIRE(reg.getEntries(ri.name())[0].flags == 2); 204 205 reg.setFlags(entry, 0); 206 REQUIRE(reg.getEntry(&pkg).flags == 0); 207 } 208 209 TEST_CASE("get file owner", M) { 210 MAKE_PACKAGE 211 212 Registry reg; 213 REQUIRE_FALSE(reg.getOwner({})); 214 215 const Registry::Entry &entry = reg.push(&ver); 216 REQUIRE(reg.getOwner(src->targetPath()) == entry); 217 }