+void testAddCatalog(HTTP::Client* cl)
+{
+// erase dir
+ SGPath rootPath(simgear::Dir::current().path());
+ rootPath.append("pkg_add_catalog");
+ simgear::Dir pd(rootPath);
+ pd.removeChildren();
+
+
+ pkg::RootRef root(new pkg::Root(rootPath, "8.1.2"));
+ // specify a test dir
+ root->setHTTPClient(cl);
+
+ pkg::CatalogRef c = pkg::Catalog::createFromUrl(root.ptr(), "http://localhost:2000/catalogTest1/catalog.xml");
+
+ waitForUpdateComplete(cl, root);
+
+// verify on disk state
+ SGPath p(rootPath);
+ p.append("org.flightgear.test.catalog1");
+ p.append("catalog.xml");
+ VERIFY(p.exists());
+ COMPARE(root->allPackages().size(), 3);
+ COMPARE(root->catalogs().size(), 1);
+
+ pkg::PackageRef p1 = root->getPackageById("alpha");
+ COMPARE(p1->id(), "alpha");
+
+ pkg::PackageRef p2 = root->getPackageById("org.flightgear.test.catalog1.c172p");
+ COMPARE(p2->id(), "c172p");
+ COMPARE(p2->qualifiedId(), "org.flightgear.test.catalog1.c172p");
+
+}
+
+void testInstallPackage(HTTP::Client* cl)
+{
+ SGPath rootPath(simgear::Dir::current().path());
+ rootPath.append("pkg_install_with_dep");
+ simgear::Dir pd(rootPath);
+ pd.removeChildren();
+
+ pkg::RootRef root(new pkg::Root(rootPath, "8.1.2"));
+ // specify a test dir
+ root->setHTTPClient(cl);
+
+ pkg::CatalogRef c = pkg::Catalog::createFromUrl(root.ptr(), "http://localhost:2000/catalogTest1/catalog.xml");
+ waitForUpdateComplete(cl, root);
+
+ pkg::PackageRef p1 = root->getPackageById("org.flightgear.test.catalog1.c172p");
+ pkg::InstallRef ins = p1->install();
+
+ VERIFY(ins->isQueued());
+
+ waitForUpdateComplete(cl, root);
+ VERIFY(p1->isInstalled());
+ VERIFY(p1->existingInstall() == ins);
+
+ pkg::PackageRef commonDeps = root->getPackageById("common-sounds");
+ VERIFY(commonDeps->existingInstall());
+
+ // verify on disk state
+ SGPath p(rootPath);
+ p.append("org.flightgear.test.catalog1");
+ p.append("Aircraft");
+ p.append("c172p");
+
+ COMPARE(p, ins->path());
+
+ p.append("c172p-floats-set.xml");
+ VERIFY(p.exists());
+
+ SGPath p2(rootPath);
+ p2.append("org.flightgear.test.catalog1");
+ p2.append("Aircraft");
+ p2.append("sounds");
+ p2.append("sharedfile.txt");
+ VERIFY(p2.exists());
+}
+
+void testUninstall(HTTP::Client* cl)
+{
+ SGPath rootPath(simgear::Dir::current().path());
+ rootPath.append("pkg_uninstall");
+ simgear::Dir pd(rootPath);
+ pd.removeChildren();
+
+ pkg::RootRef root(new pkg::Root(rootPath, "8.1.2"));
+ root->setHTTPClient(cl);
+
+ pkg::CatalogRef c = pkg::Catalog::createFromUrl(root.ptr(), "http://localhost:2000/catalogTest1/catalog.xml");
+ waitForUpdateComplete(cl, root);
+
+ pkg::PackageRef p1 = root->getPackageById("org.flightgear.test.catalog1.c172p");
+ pkg::InstallRef ins = p1->install();
+
+ waitForUpdateComplete(cl, root);
+
+ VERIFY(p1->isInstalled());
+
+ ins->uninstall();
+
+ VERIFY(!ins->path().exists());
+}
+
+void testRemoveCatalog(HTTP::Client* cl)
+{
+ SGPath rootPath(simgear::Dir::current().path());
+ rootPath.append("pkg_catalog_remove");
+ simgear::Dir pd(rootPath);
+ pd.removeChildren();
+
+ pkg::RootRef root(new pkg::Root(rootPath, "8.1.2"));
+ root->setHTTPClient(cl);
+
+ {
+ pkg::CatalogRef c = pkg::Catalog::createFromUrl(root.ptr(), "http://localhost:2000/catalogTest1/catalog.xml");
+ waitForUpdateComplete(cl, root);
+ }
+
+ {
+ pkg::PackageRef p1 = root->getPackageById("org.flightgear.test.catalog1.c172p");
+ pkg::InstallRef ins = p1->install();
+
+ waitForUpdateComplete(cl, root);
+
+ VERIFY(p1->isInstalled());
+ }
+
+ root->removeCatalogById("org.flightgear.test.catalog1");
+
+
+ SGPath p2(rootPath);
+ p2.append("org.flightgear.test.catalog1");
+ VERIFY(!p2.exists());
+
+ VERIFY(root->allPackages().empty());
+ VERIFY(root->catalogs().empty());
+
+ pkg::CatalogRef c = root->getCatalogById("org.flightgear.test.catalog1");
+ COMPARE(c, pkg::CatalogRef());
+}
+
+template <class T>
+bool contains(const std::vector<T>& vec, const T& item)
+{
+ typename std::vector<T>::const_iterator it = std::find(vec.begin(), vec.end(), item);
+ return (it != vec.end());
+}
+
+void testRefreshCatalog(HTTP::Client* cl)
+{
+ SGPath rootPath(simgear::Dir::current().path());
+ rootPath.append("pkg_catalog_refresh_update");
+ simgear::Dir pd(rootPath);
+ pd.removeChildren();
+
+ pkg::RootRef root(new pkg::Root(rootPath, "8.1.2"));
+ root->setHTTPClient(cl);
+
+ {
+ pkg::CatalogRef c = pkg::Catalog::createFromUrl(root.ptr(), "http://localhost:2000/catalogTest1/catalog.xml");
+ waitForUpdateComplete(cl, root);
+ }
+
+ {
+ pkg::PackageRef p1 = root->getPackageById("org.flightgear.test.catalog1.c172p");
+ pkg::InstallRef ins = p1->install();
+
+ pkg::PackageRef p2 = root->getPackageById("org.flightgear.test.catalog1.alpha");
+ pkg::InstallRef ins2 = p2->install();
+
+ waitForUpdateComplete(cl, root);
+
+ VERIFY(p1->isInstalled());
+ VERIFY(p2->isInstalled());
+ }
+
+ VERIFY(root->packagesNeedingUpdate().empty());
+
+ global_catalogVersion = 2;
+
+ VERIFY(!cl->hasActiveRequests());
+ root->refresh();
+
+ // should be a no-op due to catalog age testing
+ VERIFY(!cl->hasActiveRequests());
+
+ // force it this time
+ root->refresh(true);
+ VERIFY(cl->hasActiveRequests());
+ waitForUpdateComplete(cl, root);
+
+ pkg::CatalogRef c = root->getCatalogById("org.flightgear.test.catalog1");
+ COMPARE(c->ageInSeconds(), 0);
+
+ VERIFY(root->getPackageById("dc3") != pkg::PackageRef());
+ COMPARE(root->packagesNeedingUpdate().size(), 2);
+
+ pkg::PackageList needingUpdate = root->packagesNeedingUpdate();
+ VERIFY(contains(needingUpdate, root->getPackageById("common-sounds")));
+ VERIFY(contains(needingUpdate, root->getPackageById("org.flightgear.test.catalog1.alpha")));
+
+ pkg::InstallRef ins = root->getPackageById("alpha")->existingInstall();
+ VERIFY(ins->hasUpdate());
+
+ for (pkg::PackageList::const_iterator it = needingUpdate.begin();
+ it != needingUpdate.end(); ++it)
+ {
+ root->scheduleToUpdate((*it)->existingInstall());
+ }
+
+ waitForUpdateComplete(cl, root);
+
+ VERIFY(root->packagesNeedingUpdate().empty());
+ COMPARE(root->getPackageById("common-sounds")->revision(), 11);
+}
+
+