diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt index 513750e9d5e0a44739022f37bc9fd3cb1e0f25f9..1b71d16dffc09692c37a0b2b862fe118fb78e024 100644 --- a/catalogue/CMakeLists.txt +++ b/catalogue/CMakeLists.txt @@ -84,6 +84,8 @@ add_custom_command(OUTPUT InMemoryCatalogueSchema.cpp set(CATALOGUE_UNIT_TESTS_LIB_SRC_FILES CatalogueFactoryTest.cpp + CatalogueTest.cpp + DbLoginFactory.cpp DbLoginTest.cpp ParamNameToIdxTest.cpp InMemoryCatalogueTest.cpp @@ -98,10 +100,13 @@ target_link_libraries (ctacatalogueunittests install(TARGETS ctacatalogueunittests DESTINATION usr/${CMAKE_INSTALL_LIBDIR}) set (CATALOGUE_ORA_UNIT_TESTS_LIB_SRC_FILES + CatalogueTest.cpp + DbLoginFactory.cpp OcciConnTest.cpp OcciEnvTest.cpp OcciRsetTest.cpp - OcciStmtTest.cpp) + OcciStmtTest.cpp + OracleCatalogueTest.cpp) add_library (ctacatalogueoraunittests SHARED ${CATALOGUE_ORA_UNIT_TESTS_LIB_SRC_FILES}) diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..578ff7006fa855b7a39773af1b25cf8ab9d79c57 --- /dev/null +++ b/catalogue/CatalogueTest.cpp @@ -0,0 +1,3075 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#include "catalogue/ArchiveFileRow.hpp" +#include "catalogue/CatalogueFactory.hpp" +#include "catalogue/CatalogueTest.hpp" +#include "catalogue/UserError.hpp" +#include "common/exception/Exception.hpp" + +#include <gtest/gtest.h> +#include <map> +#include <memory> +#include <set> + +namespace unitTests { + +TEST_P(cta_catalogue_CatalogueTest, createBootstrapAdminAndHostNoAuth) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); + ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + { + std::list<common::dataStructures::AdminHost> hosts; + hosts = m_catalogue->getAdminHosts(); + ASSERT_EQ(1, hosts.size()); + + const common::dataStructures::AdminHost host = hosts.front(); + ASSERT_EQ(m_bootstrapComment, host.comment); + + const common::dataStructures::EntryLog creationLog = host.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + host.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } +} + +TEST_P(cta_catalogue_CatalogueTest, createAdminUser) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string createAdminUserComment = "create admin user"; + m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, createAdminUserComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(2, admins.size()); + + const common::dataStructures::AdminUser a1 = admins.front(); + admins.pop_front(); + const common::dataStructures::AdminUser a2 = admins.front(); + + ASSERT_NE(a1, a2); + ASSERT_TRUE((a1.name == m_bootstrapAdminSI.username && a2.name == m_adminSI.username) || + (a2.name == m_bootstrapAdminSI.username && a1.name == m_adminSI.username)); + + if(a1.name == m_bootstrapAdminSI.username) { + ASSERT_EQ(m_bootstrapAdminSI.username, a1.name); + ASSERT_EQ(m_bootstrapComment, a1.comment); + ASSERT_EQ(m_cliSI.username, a1.creationLog.username); + ASSERT_EQ(m_cliSI.host, a1.creationLog.host); + ASSERT_EQ(m_cliSI.username, a1.lastModificationLog.username); + ASSERT_EQ(m_cliSI.host, a1.lastModificationLog.host); + + ASSERT_EQ(m_adminSI.username, a2.name); + ASSERT_EQ(createAdminUserComment, a2.comment); + ASSERT_EQ(m_bootstrapAdminSI.username, a2.creationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, a2.creationLog.host); + ASSERT_EQ(m_bootstrapAdminSI.username, a2.lastModificationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, a2.lastModificationLog.host); + } else { + ASSERT_EQ(m_bootstrapAdminSI.username, a2.name); + ASSERT_EQ(m_bootstrapComment, a2.comment); + ASSERT_EQ(m_cliSI.username, a2.creationLog.username); + ASSERT_EQ(m_cliSI.host, a2.creationLog.host); + ASSERT_EQ(m_cliSI.username, a2.lastModificationLog.username); + ASSERT_EQ(m_cliSI.host, a2.lastModificationLog.host); + + ASSERT_EQ(m_adminSI.username, a1.name); + ASSERT_EQ(createAdminUserComment, a1.comment); + ASSERT_EQ(m_bootstrapAdminSI.username, a1.creationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, a1.creationLog.host); + ASSERT_EQ(m_bootstrapAdminSI.username, a1.lastModificationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, a1.lastModificationLog.host); + } + } +} + +TEST_P(cta_catalogue_CatalogueTest, createAdminUser_same_twice) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, "comment 1"); + + ASSERT_THROW(m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, + "comment 2"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteAdminUser) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + m_catalogue->deleteAdminUser(m_bootstrapAdminSI.username); + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteAdminUser_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); + ASSERT_THROW(m_catalogue->deleteAdminUser("non_existant_sdmin_user"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createAdminHost) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string createAdminHostComment = "create host user"; + const std::string anotherAdminHost = "another_admin_host"; + m_catalogue->createAdminHost(m_bootstrapAdminSI, + anotherAdminHost, createAdminHostComment); + + { + std::list<common::dataStructures::AdminHost> hosts; + hosts = m_catalogue->getAdminHosts(); + ASSERT_EQ(2, hosts.size()); + + const common::dataStructures::AdminHost h1 = hosts.front(); + hosts.pop_front(); + const common::dataStructures::AdminHost h2 = hosts.front(); + + ASSERT_NE(h1, h2); + ASSERT_TRUE( + (h1.name == m_bootstrapAdminSI.host && h2.name == anotherAdminHost) + || + (h2.name == anotherAdminHost && h1.name == m_bootstrapAdminSI.host) + ); + + if(h1.name == m_bootstrapAdminSI.host) { + ASSERT_EQ(m_bootstrapAdminSI.host, h1.name); + ASSERT_EQ(m_bootstrapComment, h1.comment); + ASSERT_EQ(m_cliSI.username, h1.creationLog.username); + ASSERT_EQ(m_cliSI.host, h1.creationLog.host); + ASSERT_EQ(m_cliSI.username, h1.lastModificationLog.username); + ASSERT_EQ(m_cliSI.host, h1.lastModificationLog.host); + + ASSERT_EQ(anotherAdminHost, h2.name); + ASSERT_EQ(createAdminHostComment, h2.comment); + ASSERT_EQ(m_bootstrapAdminSI.username, h2.creationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, h2.creationLog.host); + ASSERT_EQ(m_bootstrapAdminSI.username, h2.lastModificationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, h2.lastModificationLog.host); + } else { + ASSERT_EQ(m_bootstrapAdminSI.host, h2.name); + ASSERT_EQ(m_bootstrapComment, h2.comment); + ASSERT_EQ(m_cliSI.username, h2.creationLog.username); + ASSERT_EQ(m_cliSI.host, h2.creationLog.host); + ASSERT_EQ(m_cliSI.username, h2.lastModificationLog.username); + ASSERT_EQ(m_cliSI.host, h2.lastModificationLog.host); + + ASSERT_EQ(anotherAdminHost, h1.name); + ASSERT_EQ(createAdminHostComment, h1.comment); + ASSERT_EQ(m_bootstrapAdminSI.username, h1.creationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, h1.creationLog.host); + ASSERT_EQ(m_bootstrapAdminSI.username, h1.lastModificationLog.username); + ASSERT_EQ(m_bootstrapAdminSI.host, h1.lastModificationLog.host); + } + } +} + +TEST_P(cta_catalogue_CatalogueTest, createAdminHost_same_twice) { + using namespace cta; + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string anotherAdminHost = "another_admin_host"; + + m_catalogue->createAdminHost(m_bootstrapAdminSI, anotherAdminHost, "comment 1"); + + ASSERT_THROW(m_catalogue->createAdminHost(m_bootstrapAdminSI, + anotherAdminHost, "comment 2"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteAdminHost) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + { + std::list<common::dataStructures::AdminUser> admins; + admins = m_catalogue->getAdminUsers(); + ASSERT_EQ(1, admins.size()); + + const common::dataStructures::AdminUser admin = admins.front(); + ASSERT_EQ(m_bootstrapComment, admin.comment); + + const common::dataStructures::EntryLog creationLog = admin.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + admin.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + m_catalogue->deleteAdminHost(m_bootstrapAdminSI.host); + + ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteAdminHost_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); + ASSERT_THROW(m_catalogue->deleteAdminHost("non_exstant_admin_host"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, isAdmin_false) { + using namespace cta; + + ASSERT_FALSE(m_catalogue->isAdmin(m_cliSI)); +} + +TEST_P(cta_catalogue_CatalogueTest, isAdmin_true) { + using namespace cta; + + m_catalogue->createBootstrapAdminAndHostNoAuth( + m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); + + ASSERT_TRUE(m_catalogue->isAdmin(m_bootstrapAdminSI)); +} + +TEST_P(cta_catalogue_CatalogueTest, createStorageClass) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + const std::string comment = "create storage class"; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); + + const std::list<common::dataStructures::StorageClass> storageClasses = + m_catalogue->getStorageClasses(); + + ASSERT_EQ(1, storageClasses.size()); + + const common::dataStructures::StorageClass storageClass = + storageClasses.front(); + ASSERT_EQ(storageClassName, storageClass.name); + ASSERT_EQ(nbCopies, storageClass.nbCopies); + ASSERT_EQ(comment, storageClass.comment); + + const common::dataStructures::EntryLog creationLog = storageClass.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + storageClass.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createStorageClass_same_twice) { + using namespace cta; + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + const std::string comment = "create storage class"; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); + ASSERT_THROW(m_catalogue->createStorageClass(m_cliSI, + storageClassName, nbCopies, comment), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteStorageClass) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + const std::string comment = "create storage class"; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); + + const std::list<common::dataStructures::StorageClass> storageClasses = + m_catalogue->getStorageClasses(); + + ASSERT_EQ(1, storageClasses.size()); + + const common::dataStructures::StorageClass storageClass = + storageClasses.front(); + ASSERT_EQ(storageClassName, storageClass.name); + ASSERT_EQ(nbCopies, storageClass.nbCopies); + ASSERT_EQ(comment, storageClass.comment); + + const common::dataStructures::EntryLog creationLog = storageClass.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + storageClass.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + m_catalogue->deleteStorageClass(storageClass.name); + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteStorageClass_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); + ASSERT_THROW(m_catalogue->deleteStorageClass("non_existant_storage_class"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createTapePool) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + const std::string comment = "create tape pool"; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, + comment); + + const std::list<common::dataStructures::TapePool> pools = + m_catalogue->getTapePools(); + + ASSERT_EQ(1, pools.size()); + + const common::dataStructures::TapePool pool = pools.front(); + ASSERT_EQ(tapePoolName, pool.name); + ASSERT_EQ(nbPartialTapes, pool.nbPartialTapes); + ASSERT_EQ(is_encrypted, pool.encryption); + ASSERT_EQ(comment, pool.comment); + + const common::dataStructures::EntryLog creationLog = pool.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + pool.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createTapePool_same_twice) { + using namespace cta; + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + const std::string comment = "create tape pool"; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, + comment); + ASSERT_THROW(m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, comment), + catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteTapePool) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + const std::string comment = "create tape pool"; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, + comment); + + const std::list<common::dataStructures::TapePool> pools = + m_catalogue->getTapePools(); + + ASSERT_EQ(1, pools.size()); + + const common::dataStructures::TapePool pool = pools.front(); + ASSERT_EQ(tapePoolName, pool.name); + ASSERT_EQ(nbPartialTapes, pool.nbPartialTapes); + ASSERT_EQ(is_encrypted, pool.encryption); + ASSERT_EQ(comment, pool.comment); + + const common::dataStructures::EntryLog creationLog = pool.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + pool.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + m_catalogue->deleteTapePool(pool.name); + ASSERT_TRUE(m_catalogue->getTapePools().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteTapePool_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + ASSERT_THROW(m_catalogue->deleteTapePool("non_existant_tape_pool"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createArchiveRoute) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string comment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, + comment); + + const std::list<common::dataStructures::ArchiveRoute> routes = + m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(comment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = + m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); +} + +TEST_P(cta_catalogue_CatalogueTest, createArchiveRouteTapePool_same_twice) { + using namespace cta; + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, + "create tape pool"); + + const uint64_t copyNb = 1; + const std::string comment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, + comment); + ASSERT_THROW(m_catalogue->createArchiveRoute(m_cliSI, + storageClassName, copyNb, tapePoolName, comment), + exception::Exception); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteArchiveRoute) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string comment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, + comment); + + const std::list<common::dataStructures::ArchiveRoute> routes = + m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(comment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = + m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); + + m_catalogue->deleteArchiveRoute(storageClassName, copyNb); + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteArchiveRoute_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + ASSERT_THROW(m_catalogue->deleteArchiveRoute("non_existant_storage_class", 1234), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createArchiveRoute_deleteStorageClass) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string comment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, + comment); + + const std::list<common::dataStructures::ArchiveRoute> routes = + m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(comment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = + m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); + + ASSERT_THROW(m_catalogue->deleteStorageClass(storageClassName), exception::Exception); +} + +TEST_P(cta_catalogue_CatalogueTest, createLogicalLibrary) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); + + const std::string logicalLibraryName = "logical_library"; + const std::string comment = "create logical library"; + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); + + const std::list<common::dataStructures::LogicalLibrary> libs = + m_catalogue->getLogicalLibraries(); + + ASSERT_EQ(1, libs.size()); + + const common::dataStructures::LogicalLibrary lib = libs.front(); + ASSERT_EQ(logicalLibraryName, lib.name); + ASSERT_EQ(comment, lib.comment); + + const common::dataStructures::EntryLog creationLog = lib.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + lib.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createLogicalLibrary_same_twice) { + using namespace cta; + + const std::string logicalLibraryName = "logical_library"; + const std::string comment = "create logical library"; + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); + ASSERT_THROW(m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteLogicalLibrary) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); + + const std::string logicalLibraryName = "logical_library"; + const std::string comment = "create logical library"; + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); + + const std::list<common::dataStructures::LogicalLibrary> libs = + m_catalogue->getLogicalLibraries(); + + ASSERT_EQ(1, libs.size()); + + const common::dataStructures::LogicalLibrary lib = libs.front(); + ASSERT_EQ(logicalLibraryName, lib.name); + ASSERT_EQ(comment, lib.comment); + + const common::dataStructures::EntryLog creationLog = lib.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + lib.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + m_catalogue->deleteLogicalLibrary(logicalLibraryName); + ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteLogicalLibrary_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); + ASSERT_THROW(m_catalogue->deleteLogicalLibrary("non_existant_logical_library"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createTape) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const common::dataStructures::Tape tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createTape_same_twice) { + using namespace cta; + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, comment); + ASSERT_THROW(m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, + tapePoolName, encryptionKey, capacityInBytes, disabledValue, fullValue, + comment), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createTape_many_tapes) { + using namespace cta; + + const std::string logicalLibrary = "logical_library_name"; + const std::string tapePool = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t) 10 * 1000 * 1000 * 1000 * 1000; + const bool disabled = true; + const bool full = false; + const std::string comment = "create tape"; + + ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibrary, "create logical library"); + + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + m_catalogue->createTapePool(m_cliSI, tapePool, 2, true, "create tape pool"); + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + const uint64_t nbTapes = 10; + + for(uint64_t i = 1; i <= nbTapes; i++) { + std::ostringstream vid; + vid << "vid" << i; + + m_catalogue->createTape(m_cliSI, vid.str(), logicalLibrary, tapePool, encryptionKey, capacityInBytes, disabled, + full, comment); + } + + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + + for(uint64_t i = 1; i <= nbTapes; i++) { + std::ostringstream vid; + vid << "vid" << i; + + auto vidAndTapeItor = vidToTape.find(vid.str()); + ASSERT_FALSE(vidToTape.end() == vidAndTapeItor); + + const common::dataStructures::Tape tape = vidAndTapeItor->second; + ASSERT_EQ(vid.str(), tape.vid); + ASSERT_EQ(logicalLibrary, tape.logicalLibraryName); + ASSERT_EQ(tapePool, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabled == tape.disabled); + ASSERT_TRUE(full == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = "vid1"; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(1, vidToTape.size()); + ASSERT_EQ("vid1", vidToTape.begin()->first); + ASSERT_EQ("vid1", vidToTape.begin()->second.vid); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.logicalLibrary = logicalLibrary; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + ASSERT_EQ(logicalLibrary, vidToTape.begin()->second.logicalLibraryName); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.tapePool = tapePool; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + ASSERT_EQ(tapePool, vidToTape.begin()->second.tapePoolName); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.capacityInBytes = "10000000000000"; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + ASSERT_EQ(capacityInBytes, vidToTape.begin()->second.capacityInBytes); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.disabled = "true"; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + ASSERT_TRUE(vidToTape.begin()->second.disabled); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.full = "false"; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(nbTapes, tapes.size()); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + ASSERT_EQ(nbTapes, vidToTape.size()); + ASSERT_FALSE(vidToTape.begin()->second.full); + } + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = "non_existant_vid"; + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_TRUE(tapes.empty()); + } +} + +TEST_P(cta_catalogue_CatalogueTest, deleteTape) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const common::dataStructures::Tape tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + m_catalogue->deleteTape(tape.vid); + ASSERT_TRUE(m_catalogue->getTapes().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteTape_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + ASSERT_THROW(m_catalogue->deleteTape("non_exsitant_tape"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, getTapesForWriting) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = false; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<catalogue::TapeForWriting> tapes = m_catalogue->getTapesForWriting(logicalLibraryName); + + ASSERT_EQ(1, tapes.size()); + + const catalogue::TapeForWriting tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(tapePoolName, tape.tapePool); + ASSERT_EQ(0, tape.lastFSeq); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_EQ(0, tape.dataOnTapeInBytes); + ASSERT_FALSE(tape.lbp); +} + +TEST_P(cta_catalogue_CatalogueTest, createMountPolicy) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); + + const std::string name = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + const std::string &comment = "create mount policy"; + + m_catalogue->createMountPolicy( + m_cliSI, + name, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + comment); + + const std::list<common::dataStructures::MountPolicy> mountPolicies = + m_catalogue->getMountPolicies(); + + ASSERT_EQ(1, mountPolicies.size()); + + const common::dataStructures::MountPolicy mountPolicy = mountPolicies.front(); + + ASSERT_EQ(name, mountPolicy.name); + + ASSERT_EQ(archivePriority, mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, mountPolicy.archiveMinRequestAge); + + ASSERT_EQ(retrievePriority, mountPolicy.retrievePriority); + ASSERT_EQ(minRetrieveRequestAge, mountPolicy.retrieveMinRequestAge); + + ASSERT_EQ(maxDrivesAllowed, mountPolicy.maxDrivesAllowed); + + ASSERT_EQ(comment, mountPolicy.comment); + + const common::dataStructures::EntryLog creationLog = mountPolicy.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + mountPolicy.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createMountPolicy_same_twice) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); + + const std::string name = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + const std::string &comment = "create mount policy"; + + m_catalogue->createMountPolicy( + m_cliSI, + name, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + comment); + + ASSERT_THROW(m_catalogue->createMountPolicy( + m_cliSI, + name, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + comment), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteMountPolicy) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); + + const std::string name = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + const std::string &comment = "create mount policy"; + + m_catalogue->createMountPolicy( + m_cliSI, + name, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + comment); + + const std::list<common::dataStructures::MountPolicy> mountPolicies = + m_catalogue->getMountPolicies(); + + ASSERT_EQ(1, mountPolicies.size()); + + const common::dataStructures::MountPolicy mountPolicy = mountPolicies.front(); + + ASSERT_EQ(name, mountPolicy.name); + + ASSERT_EQ(archivePriority, mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, mountPolicy.archiveMinRequestAge); + + ASSERT_EQ(retrievePriority, mountPolicy.retrievePriority); + ASSERT_EQ(minRetrieveRequestAge, mountPolicy.retrieveMinRequestAge); + + ASSERT_EQ(maxDrivesAllowed, mountPolicy.maxDrivesAllowed); + + ASSERT_EQ(comment, mountPolicy.comment); + + const common::dataStructures::EntryLog creationLog = mountPolicy.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + mountPolicy.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + m_catalogue->deleteMountPolicy(name); + + ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteMountPolicy_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); + ASSERT_THROW(m_catalogue->deleteMountPolicy("non_existant_mount_policy"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterMountRule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); + + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterMountRule_same_twice) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); + ASSERT_THROW(m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment), + catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterMountRule_non_existant_mount_policy) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string comment = "create mount rule for requester"; + const std::string mountPolicyName = "non_existant_mount_policy"; + const std::string requesterName = "requester_name"; + ASSERT_THROW(m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment), + catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteRequesterMountRule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); + + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + + m_catalogue->deleteRequesterMountRule(requesterName); + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteRequesterMountRule_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + ASSERT_THROW(m_catalogue->deleteRequesterMountRule("non_existant_requester"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterGroupMountRule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester group"; + const std::string requesterGroupName = "requester_group_name"; + m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); + + const std::list<common::dataStructures::RequesterGroupMountRule> rules = + m_catalogue->getRequesterGroupMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterGroupMountRule rule = rules.front(); + + ASSERT_EQ(requesterGroupName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterGroupMountRule_same_twice) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester group"; + const std::string requesterGroupName = "requester_group_name"; + m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); + ASSERT_THROW(m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment), + catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, createRequesterGroupMountRule_non_existant_mount_policy) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); + + const std::string comment = "create mount rule for requester group"; + const std::string mountPolicyName = "non_existant_mount_policy"; + const std::string requesterGroupName = "requester_group_name"; + ASSERT_THROW(m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment), + catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteRequesterGroupMountRule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester group"; + const std::string requesterGroupName = "requester_group_name"; + m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); + + const std::list<common::dataStructures::RequesterGroupMountRule> rules = m_catalogue->getRequesterGroupMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterGroupMountRule rule = rules.front(); + + ASSERT_EQ(requesterGroupName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + + m_catalogue->deleteRequesterGroupMountRule(requesterGroupName); + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteRequesterGroupMountRule_non_existant) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); + ASSERT_THROW(m_catalogue->deleteRequesterGroupMountRule("non_existant_requester_group"), catalogue::UserError); +} + +TEST_P(cta_catalogue_CatalogueTest, prepareForNewFile_requester_mount_rule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); + + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, + "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string archiveRouteComment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); + + const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(archiveRouteComment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); + + common::dataStructures::UserIdentity userIdentity; + userIdentity.name = requesterName; + userIdentity.group = "group"; + uint64_t expectedArchiveFileId = 0; + for(uint64_t i = 0; i<10; i++) { + const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = + m_catalogue->prepareForNewFile(storageClassName, userIdentity); + + if(0 == i) { + expectedArchiveFileId = queueCriteria.fileId; + } else { + expectedArchiveFileId++; + } + ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); + + ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); + ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); + ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); + ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); + ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); + } +} + +TEST_P(cta_catalogue_CatalogueTest, prepareForNewFile_requester_group_mount_rule) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester group"; + const std::string requesterGroupName = "requester_group_name"; + m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); + + const std::list<common::dataStructures::RequesterGroupMountRule> rules = m_catalogue->getRequesterGroupMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterGroupMountRule rule = rules.front(); + + ASSERT_EQ(requesterGroupName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string archiveRouteComment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); + + const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(archiveRouteComment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = + m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); + + common::dataStructures::UserIdentity userIdentity; + userIdentity.name = "username"; + userIdentity.group = requesterGroupName; + uint64_t expectedArchiveFileId = 0; + for(uint64_t i = 0; i<10; i++) { + const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = + m_catalogue->prepareForNewFile(storageClassName, userIdentity); + + if(0 == i) { + expectedArchiveFileId = queueCriteria.fileId; + } else { + expectedArchiveFileId++; + } + ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); + + ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); + ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); + ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); + ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); + ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); + } +} + +TEST_P(cta_catalogue_CatalogueTest, prepareForNewFile_requester_mount_rule_overide) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string requesterRuleComment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, requesterRuleComment); + + const std::list<common::dataStructures::RequesterMountRule> requesterRules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, requesterRules.size()); + + const common::dataStructures::RequesterMountRule requesterRule = requesterRules.front(); + + ASSERT_EQ(requesterName, requesterRule.name); + ASSERT_EQ(mountPolicyName, requesterRule.mountPolicy); + ASSERT_EQ(requesterRuleComment, requesterRule.comment); + ASSERT_EQ(m_cliSI.username, requesterRule.creationLog.username); + ASSERT_EQ(m_cliSI.host, requesterRule.creationLog.host); + ASSERT_EQ(requesterRule.creationLog, requesterRule.lastModificationLog); + + const std::string requesterGroupRuleComment = "create mount rule for requester group"; + const std::string requesterGroupName = "requester_group_name"; + m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterName, requesterGroupRuleComment); + + const std::list<common::dataStructures::RequesterGroupMountRule> requesterGroupRules = + m_catalogue->getRequesterGroupMountRules(); + ASSERT_EQ(1, requesterGroupRules.size()); + + const common::dataStructures::RequesterGroupMountRule requesterGroupRule = requesterGroupRules.front(); + + ASSERT_EQ(requesterName, requesterGroupRule.name); + ASSERT_EQ(mountPolicyName, requesterGroupRule.mountPolicy); + ASSERT_EQ(requesterGroupRuleComment, requesterGroupRule.comment); + ASSERT_EQ(m_cliSI.username, requesterGroupRule.creationLog.username); + ASSERT_EQ(m_cliSI.host, requesterGroupRule.creationLog.host); + ASSERT_EQ(requesterGroupRule.creationLog, requesterGroupRule.lastModificationLog); + + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, + "create storage class"); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); + + const uint64_t copyNb = 1; + const std::string archiveRouteComment = "create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); + + const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClassName, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(archiveRouteComment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + common::dataStructures::TapeCopyToPoolMap copyToPoolMap = m_catalogue->getTapeCopyToPoolMap(storageClassName); + ASSERT_EQ(1, copyToPoolMap.size()); + std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); + ASSERT_EQ(copyNb, maplet.first); + ASSERT_EQ(tapePoolName, maplet.second); + + common::dataStructures::UserIdentity userIdentity; + userIdentity.name = requesterName; + userIdentity.group = "group"; + uint64_t expectedArchiveFileId = 0; + for(uint64_t i = 0; i<10; i++) { + const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = + m_catalogue->prepareForNewFile(storageClassName, userIdentity); + + if(0 == i) { + expectedArchiveFileId = queueCriteria.fileId; + } else { + expectedArchiveFileId++; + } + ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); + + ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); + ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); + ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); + ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); + ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); + } +} + +TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFile) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid1 = "VID123"; + const std::string vid2 = "VID456"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string createTapeComment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, + disabledValue, fullValue, createTapeComment); + m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, + disabledValue, fullValue, createTapeComment); + + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + { + auto it = vidToTape.find(vid1); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid1, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(createTapeComment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + { + auto it = vidToTape.find(vid2); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid2, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(createTapeComment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const uint64_t archiveFileId = 1234; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const uint64_t archiveFileSize = 1; + const std::string tapeDrive = "tape_drive"; + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + + catalogue::TapeFileWritten file1Written; + file1Written.archiveFileId = archiveFileId; + file1Written.diskInstance = "PUBLIC"; + file1Written.diskFileId = "5678"; + file1Written.diskFilePath = "/public_dir/public_file"; + file1Written.diskFileUser = "public_disk_user"; + file1Written.diskFileGroup = "public_disk_group"; + file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + file1Written.size = archiveFileSize; + file1Written.checksumType = checksumType; + file1Written.checksumValue = checksumValue; + file1Written.storageClassName = storageClassName; + file1Written.vid = vid1; + file1Written.fSeq = 1; + file1Written.blockId = 4321; + file1Written.compressedSize = 1; + file1Written.copyNb = 1; + file1Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file1Written); + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + catalogue::TapeFileWritten file2Written; + file2Written.archiveFileId = file1Written.archiveFileId; + file2Written.diskInstance = file1Written.diskInstance; + file2Written.diskFileId = file1Written.diskFileId; + file2Written.diskFilePath = file1Written.diskFilePath; + file2Written.diskFileUser = file1Written.diskFileUser; + file2Written.diskFileGroup = file1Written.diskFileGroup; + file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; + file2Written.size = archiveFileSize; + file2Written.checksumType = checksumType; + file2Written.checksumValue = checksumValue; + file2Written.storageClassName = storageClassName; + file2Written.vid = vid2; + file2Written.fSeq = 1; + file2Written.blockId = 4331; + file2Written.compressedSize = 1; + file2Written.copyNb = 2; + file2Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file2Written); + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file2Written.size, archiveFile.fileSize); + ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(2, archiveFile.tapeFiles.size()); + + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + + auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); + ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + ASSERT_EQ(file2Written.vid, tapeFile2.vid); + ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); + ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); + ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); + } + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 2; + const uint64_t retrievePriority = 3; + const uint64_t minRetrieveRequestAge = 4; + const uint64_t maxDrivesAllowed = 5; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "create mount policy"); + + const std::string comment = "create mount rule for requester"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); + + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + + common::dataStructures::UserIdentity userIdentity; + userIdentity.name = requesterName; + userIdentity.group = "group"; + const common::dataStructures::RetrieveFileQueueCriteria queueCriteria = + m_catalogue->prepareToRetrieveFile(archiveFileId, userIdentity); + + ASSERT_EQ(2, queueCriteria.tapeFiles.size()); + ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); + ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); + ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); +} + +TEST_P(cta_catalogue_CatalogueTest, getArchiveFileItor_zero_prefetch) { + using namespace cta; + + ASSERT_THROW(m_catalogue->getArchiveFileItor(catalogue::ArchiveFileSearchCriteria(), 0), exception::Exception); +} + +TEST_P(cta_catalogue_CatalogueTest, fileWrittenToTape_many_archive_files) { + using namespace cta; + + const std::string vid = "VID123"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, disabledValue, + fullValue, comment); + + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + { + auto it = vidToTape.find(vid); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 1; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + const std::string tapeDrive = "tape_drive"; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + const uint64_t nbArchiveFiles = 10; + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + const uint64_t archiveFileSize = 1; + std::ostringstream diskFileId; + diskFileId << (12345677 + i); + std::ostringstream diskFilePath; + diskFilePath << "/public_dir/public_file_" << i; + + catalogue::TapeFileWritten fileWritten; + fileWritten.archiveFileId = i; + fileWritten.diskInstance = "PUBLIC"; + fileWritten.diskFileId = diskFileId.str(); + fileWritten.diskFilePath = diskFilePath.str(); + fileWritten.diskFileUser = "public_disk_user"; + fileWritten.diskFileGroup = "public_disk_group"; + fileWritten.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + fileWritten.size = archiveFileSize; + fileWritten.checksumType = checksumType; + fileWritten.checksumValue = checksumValue; + fileWritten.storageClassName = storageClassName; + fileWritten.vid = vid; + fileWritten.fSeq = i; + fileWritten.blockId = i * 100; + fileWritten.compressedSize = 1; + fileWritten.copyNb = 1; + fileWritten.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(fileWritten); + + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(i, tape.lastFSeq); + } + + std::list<uint64_t> prefetches = {1, 2, 3, nbArchiveFiles - 1, nbArchiveFiles, nbArchiveFiles+1, nbArchiveFiles*2}; + for(auto prefetch: prefetches) { + std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = + m_catalogue->getArchiveFileItor(catalogue::ArchiveFileSearchCriteria(), prefetch); + std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + const uint64_t archiveFileSize = 1; + std::ostringstream diskFileId; + diskFileId << (12345677 + i); + std::ostringstream diskFilePath; + diskFilePath << "/public_dir/public_file_" << i; + + catalogue::TapeFileWritten fileWritten; + fileWritten.archiveFileId = i; + fileWritten.diskInstance = "PUBLIC"; + fileWritten.diskFileId = diskFileId.str(); + fileWritten.diskFilePath = diskFilePath.str(); + fileWritten.diskFileUser = "public_disk_user"; + fileWritten.diskFileGroup = "public_disk_group"; + fileWritten.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + fileWritten.size = archiveFileSize; + fileWritten.checksumType = checksumType; + fileWritten.checksumValue = checksumValue; + fileWritten.storageClassName = storageClassName; + fileWritten.vid = vid; + fileWritten.fSeq = i; + fileWritten.blockId = i * 100; + fileWritten.compressedSize = 1; + fileWritten.copyNb = 1; + + const auto idAndFile = m.find(i); + ASSERT_FALSE(m.end() == idAndFile); + const common::dataStructures::ArchiveFile archiveFile = idAndFile->second; + ASSERT_EQ(fileWritten.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(fileWritten.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(fileWritten.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(fileWritten.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(fileWritten.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(fileWritten.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(fileWritten.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + ASSERT_EQ(fileWritten.size, archiveFile.fileSize); + ASSERT_EQ(fileWritten.checksumType, archiveFile.checksumType); + ASSERT_EQ(fileWritten.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(fileWritten.storageClassName, archiveFile.storageClass); + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + ASSERT_EQ(fileWritten.vid, archiveFile.tapeFiles.begin()->second.vid); + ASSERT_EQ(fileWritten.fSeq, archiveFile.tapeFiles.begin()->second.fSeq); + ASSERT_EQ(fileWritten.blockId, archiveFile.tapeFiles.begin()->second.blockId); + ASSERT_EQ(fileWritten.compressedSize, archiveFile.tapeFiles.begin()->second.compressedSize); + ASSERT_EQ(fileWritten.copyNb, archiveFile.tapeFiles.begin()->first); + ASSERT_EQ(fileWritten.copyNb, archiveFile.tapeFiles.begin()->second.copyNb); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.archiveFileId = "10"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(1, m.size()); + ASSERT_EQ(10, m.begin()->first); + ASSERT_EQ(10, m.begin()->second.archiveFileID); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.diskInstance = "PUBLIC"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.diskFileId = "12345687"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(1, m.size()); + ASSERT_EQ("12345687", m.begin()->second.diskFileId); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.diskFilePath = "/public_dir/public_file_10"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(1, m.size()); + ASSERT_EQ("/public_dir/public_file_10", m.begin()->second.diskFileInfo.path); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.diskFileUser = "public_disk_user"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.diskFileGroup = "public_disk_group"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.storageClass = "storage_class"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.vid = vid; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.tapeFileCopyNb = "1"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + searchCriteria.tapePool = "tape_pool_name"; + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(nbArchiveFiles, m.size()); + } + + { + catalogue::ArchiveFileSearchCriteria searchCriteria; + std::ostringstream nonExistantArchiveFileId; + nonExistantArchiveFileId << (nbArchiveFiles + 1234); + searchCriteria.archiveFileId = nonExistantArchiveFileId.str(); + archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); + m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(0, m.size()); + } + } +} + +TEST_P(cta_catalogue_CatalogueTest, fileWrittenToTape_2_tape_files_different_tapes) { + using namespace cta; + + const std::string vid1 = "VID123"; + const std::string vid2 = "VID456"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(2, tapes.size()); + + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + { + auto it = vidToTape.find(vid1); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid1, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + { + auto it = vidToTape.find(vid2); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid2, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const uint64_t archiveFileId = 1234; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const uint64_t archiveFileSize = 1; + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + const std::string tapeDrive = "tape_drive"; + + catalogue::TapeFileWritten file1Written; + file1Written.archiveFileId = archiveFileId; + file1Written.diskInstance = "PUBLIC"; + file1Written.diskFileId = "5678"; + file1Written.diskFilePath = "/public_dir/public_file"; + file1Written.diskFileUser = "public_disk_user"; + file1Written.diskFileGroup = "public_disk_group"; + file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + file1Written.size = archiveFileSize; + file1Written.checksumType = checksumType; + file1Written.checksumValue = checksumValue; + file1Written.storageClassName = storageClassName; + file1Written.vid = vid1; + file1Written.fSeq = 1; + file1Written.blockId = 4321; + file1Written.compressedSize = 1; + file1Written.copyNb = 1; + file1Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file1Written); + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = file1Written.vid; + std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(1, tape.lastFSeq); + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + catalogue::TapeFileWritten file2Written; + file2Written.archiveFileId = file1Written.archiveFileId; + file2Written.diskInstance = file1Written.diskInstance; + file2Written.diskFileId = file1Written.diskFileId; + file2Written.diskFilePath = file1Written.diskFilePath; + file2Written.diskFileUser = file1Written.diskFileUser; + file2Written.diskFileGroup = file1Written.diskFileGroup; + file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; + file2Written.size = archiveFileSize; + file2Written.checksumType = checksumType; + file2Written.checksumValue = checksumValue; + file2Written.storageClassName = storageClassName; + file2Written.vid = vid2; + file2Written.fSeq = 1; + file2Written.blockId = 4331; + file2Written.compressedSize = 1; + file2Written.copyNb = 2; + file2Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file2Written); + + { + ASSERT_EQ(2, m_catalogue->getTapes().size()); + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = file2Written.vid; + std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(1, tape.lastFSeq); + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file2Written.size, archiveFile.fileSize); + ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(2, archiveFile.tapeFiles.size()); + + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + + auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); + ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + ASSERT_EQ(file2Written.vid, tapeFile2.vid); + ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); + ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); + ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); + ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); + } +} + +TEST_P(cta_catalogue_CatalogueTest, fileWrittenToTape_2_tape_files_same_archive_file_same_tape) { + using namespace cta; + + const std::string vid = "VID123"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + { + auto it = vidToTape.find(vid); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const uint64_t archiveFileId = 1234; + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + const std::string tapeDrive = "tape_drive"; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const uint64_t archiveFileSize = 1; + + catalogue::TapeFileWritten file1Written; + file1Written.archiveFileId = archiveFileId; + file1Written.diskInstance = "PUBLIC"; + file1Written.diskFileId = "5678"; + file1Written.diskFilePath = "/public_dir/public_file"; + file1Written.diskFileUser = "public_disk_user"; + file1Written.diskFileGroup = "public_disk_group"; + file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + file1Written.size = archiveFileSize; + file1Written.checksumType = checksumType; + file1Written.checksumValue = checksumValue; + file1Written.storageClassName = storageClassName; + file1Written.vid = vid; + file1Written.fSeq = 1; + file1Written.blockId = 4321; + file1Written.compressedSize = 1; + file1Written.copyNb = 1; + file1Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file1Written); + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = file1Written.vid; + std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(1, tape.lastFSeq); + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + catalogue::TapeFileWritten file2Written; + file2Written.archiveFileId = file1Written.archiveFileId; + file2Written.diskInstance = file1Written.diskInstance; + file2Written.diskFileId = file1Written.diskFileId; + file2Written.diskFilePath = file1Written.diskFilePath; + file2Written.diskFileUser = file1Written.diskFileUser; + file2Written.diskFileGroup = file1Written.diskFileGroup; + file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; + file2Written.size = archiveFileSize; + file2Written.checksumType = checksumType; + file2Written.checksumValue = checksumValue; + file2Written.storageClassName = storageClassName; + file2Written.vid = vid; + file2Written.fSeq = 2; + file2Written.blockId = 4331; + file2Written.compressedSize = 1; + file2Written.copyNb = 2; + file2Written.tapeDrive = tapeDrive; + ASSERT_THROW(m_catalogue->fileWrittenToTape(file2Written), exception::Exception); +} + +TEST_P(cta_catalogue_CatalogueTest, fileWrittenToTape_2_tape_files_corrupted_diskFilePath) { + using namespace cta; + + const std::string vid = "VID123"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const common::dataStructures::Tape tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + + const uint64_t archiveFileId = 1234; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, + "create storage class"); + + const uint64_t archiveFileSize = 1; + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + const std::string tapeDrive = "tape_drive"; + + catalogue::TapeFileWritten file1Written; + file1Written.archiveFileId = archiveFileId; + file1Written.diskInstance = "PUBLIC"; + file1Written.diskFileId = "5678"; + file1Written.diskFilePath = "/public_dir/public_file"; + file1Written.diskFileUser = "public_disk_user"; + file1Written.diskFileGroup = "public_disk_group"; + file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + file1Written.size = archiveFileSize; + file1Written.checksumType = checksumType; + file1Written.checksumValue = checksumValue; + file1Written.storageClassName = storageClassName; + file1Written.vid = vid; + file1Written.fSeq = 1; + file1Written.blockId = 4321; + file1Written.compressedSize = 1; + file1Written.copyNb = 1; + file1Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file1Written); + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + catalogue::TapeFileWritten file2Written; + file2Written.archiveFileId = file1Written.archiveFileId; + file2Written.diskInstance = file1Written.diskInstance; + file2Written.diskFileId = file1Written.diskFileId; + file2Written.diskFilePath = "CORRUPTED disk file path"; + file2Written.diskFileUser = file1Written.diskFileUser; + file2Written.diskFileGroup = file1Written.diskFileGroup; + file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; + file2Written.size = archiveFileSize; + file2Written.checksumType = checksumType; + file2Written.checksumValue = checksumValue; + file2Written.storageClassName = storageClassName; + file2Written.vid = "VID123"; + file2Written.fSeq = 2; + file2Written.blockId = 4331; + file2Written.compressedSize = 1; + file2Written.copyNb = 2; + file2Written.tapeDrive = tapeDrive; + + ASSERT_THROW(m_catalogue->fileWrittenToTape(file2Written), exception::Exception); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { + using namespace cta; + + const std::string vid1 = "VID123"; + const std::string vid2 = "VID456"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, + "create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); + m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, + encryptionKey, capacityInBytes, disabledValue, fullValue, + comment); + + const std::list<common::dataStructures::Tape> tapes = + m_catalogue->getTapes(); + + ASSERT_EQ(2, tapes.size()); + + const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); + { + auto it = vidToTape.find(vid1); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid1, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + { + auto it = vidToTape.find(vid2); + const common::dataStructures::Tape &tape = it->second; + ASSERT_EQ(vid2, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = + tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const uint64_t archiveFileId = 1234; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); + + const std::string storageClassName = "storage_class"; + const uint64_t nbCopies = 2; + m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); + + const uint64_t archiveFileSize = 1; + const std::string checksumType = "checksum_type"; + const std::string checksumValue = "checksum_value"; + const std::string tapeDrive = "tape_drive"; + + catalogue::TapeFileWritten file1Written; + file1Written.archiveFileId = archiveFileId; + file1Written.diskInstance = "PUBLIC"; + file1Written.diskFileId = "5678"; + file1Written.diskFilePath = "/public_dir/public_file"; + file1Written.diskFileUser = "public_disk_user"; + file1Written.diskFileGroup = "public_disk_group"; + file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; + file1Written.size = archiveFileSize; + file1Written.checksumType = checksumType; + file1Written.checksumValue = checksumValue; + file1Written.storageClassName = storageClassName; + file1Written.vid = vid1; + file1Written.fSeq = 1; + file1Written.blockId = 4321; + file1Written.compressedSize = 1; + file1Written.copyNb = 1; + file1Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file1Written); + + { + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = file1Written.vid; + std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(1, tape.lastFSeq); + } + + { + std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = m_catalogue->getArchiveFileItor(); + const std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(1, m.size()); + auto mItor = m.find(file1Written.archiveFileId); + ASSERT_FALSE(m.end() == mItor); + + const common::dataStructures::ArchiveFile archiveFile = mItor->second; + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file1Written.size, archiveFile.fileSize); + ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(1, archiveFile.tapeFiles.size()); + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + } + + catalogue::TapeFileWritten file2Written; + file2Written.archiveFileId = file1Written.archiveFileId; + file2Written.diskInstance = file1Written.diskInstance; + file2Written.diskFileId = file1Written.diskFileId; + file2Written.diskFilePath = file1Written.diskFilePath; + file2Written.diskFileUser = file1Written.diskFileUser; + file2Written.diskFileGroup = file1Written.diskFileGroup; + file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; + file2Written.size = archiveFileSize; + file2Written.checksumType = checksumType; + file2Written.checksumValue = checksumValue; + file2Written.storageClassName = storageClassName; + file2Written.vid = vid2; + file2Written.fSeq = 1; + file2Written.blockId = 4331; + file2Written.compressedSize = 1; + file2Written.copyNb = 2; + file2Written.tapeDrive = tapeDrive; + m_catalogue->fileWrittenToTape(file2Written); + + { + ASSERT_EQ(2, m_catalogue->getTapes().size()); + catalogue::TapeSearchCriteria searchCriteria; + searchCriteria.vid = file2Written.vid; + std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); + ASSERT_EQ(1, tapes.size()); + const common::dataStructures::Tape &tape = tapes.front(); + ASSERT_EQ(1, tape.lastFSeq); + } + + { + std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = m_catalogue->getArchiveFileItor(); + const std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); + ASSERT_EQ(1, m.size()); + + { + auto mItor = m.find(file1Written.archiveFileId); + ASSERT_FALSE(m.end() == mItor); + + const common::dataStructures::ArchiveFile archiveFile = mItor->second; + + ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file2Written.size, archiveFile.fileSize); + ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(2, archiveFile.tapeFiles.size()); + + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + + auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); + ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + ASSERT_EQ(file2Written.vid, tapeFile2.vid); + ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); + ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); + ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); + ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); + } + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); + + ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file2Written.size, archiveFile.fileSize); + ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(2, archiveFile.tapeFiles.size()); + + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + + auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); + ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + ASSERT_EQ(file2Written.vid, tapeFile2.vid); + ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); + ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); + ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); + ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); + } + + { + const common::dataStructures::ArchiveFile archiveFile = m_catalogue->deleteArchiveFile(archiveFileId); + + ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); + ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); + ASSERT_EQ(file2Written.size, archiveFile.fileSize); + ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); + ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); + ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); + + ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); + ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); + ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); + ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); + ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); + + ASSERT_EQ(2, archiveFile.tapeFiles.size()); + + auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); + ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + ASSERT_EQ(file1Written.vid, tapeFile1.vid); + ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); + ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); + ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); + ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); + + auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); + ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); + const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + ASSERT_EQ(file2Written.vid, tapeFile2.vid); + ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); + ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); + ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); + ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); + } + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); +} + +TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_non_existant) { + using namespace cta; + + ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); + ASSERT_THROW(m_catalogue->deleteArchiveFile(12345678), catalogue::UserError); +} + +} // namespace unitTests diff --git a/catalogue/CatalogueTest.hpp b/catalogue/CatalogueTest.hpp new file mode 100644 index 0000000000000000000000000000000000000000..3c083a6f3810098f8173787031ab19e669ae6559 --- /dev/null +++ b/catalogue/CatalogueTest.hpp @@ -0,0 +1,189 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "catalogue/ArchiveFileRow.hpp" +#include "catalogue/CatalogueFactory.hpp" +#include "catalogue/DbLoginFactory.hpp" +#include "catalogue/UserError.hpp" +#include "common/exception/Exception.hpp" + +#include <gtest/gtest.h> +#include <map> +#include <memory> +#include <set> + +namespace unitTests { + +class cta_catalogue_CatalogueTest : public ::testing::TestWithParam<cta::catalogue::DbLoginFactory*> { +public: + cta_catalogue_CatalogueTest(): + m_bootstrapComment("bootstrap") { + + m_cliSI.username = "cli_user_name"; + m_cliSI.host = "cli_host"; + + m_bootstrapAdminSI.username = "bootstrap_admin_user_name"; + m_bootstrapAdminSI.host = "bootstrap_host"; + + m_adminSI.username = "admin_user_name"; + m_adminSI.host = "admin_host"; + } + +protected: + + virtual void SetUp() { + using namespace cta; + using namespace cta::catalogue; + + m_catalogue.reset(CatalogueFactory::create(GetParam()->create())); + + { + const std::list<common::dataStructures::AdminUser> adminUsers = m_catalogue->getAdminUsers(); + for(auto &adminUser: adminUsers) { + m_catalogue->deleteAdminUser(adminUser.name); + } + } + { + const std::list<common::dataStructures::AdminHost> adminHosts = m_catalogue->getAdminHosts(); + for(auto &adminHost: adminHosts) { + m_catalogue->deleteAdminHost(adminHost.name); + } + } + { + const std::list<common::dataStructures::ArchiveRoute> archiveRoutes = m_catalogue->getArchiveRoutes(); + for(auto &archiveRoute: archiveRoutes) { + m_catalogue->deleteArchiveRoute(archiveRoute.storageClassName, archiveRoute.copyNb); + } + } + { + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + for(auto &rule: rules) { + m_catalogue->deleteRequesterMountRule(rule.name); + } + } + { + const std::list<common::dataStructures::RequesterGroupMountRule> rules = + m_catalogue->getRequesterGroupMountRules(); + for(auto &rule: rules) { + m_catalogue->deleteRequesterGroupMountRule(rule.name); + } + } + { + std::unique_ptr<ArchiveFileItor> itor = m_catalogue->getArchiveFileItor(); + while(itor->hasMore()) { + m_catalogue->deleteArchiveFile(itor->next().archiveFileID); + } + } + { + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + for(auto &tape: tapes) { + m_catalogue->deleteTape(tape.vid); + } + } + { + const std::list<common::dataStructures::StorageClass> storageClasses = m_catalogue->getStorageClasses(); + for(auto &storageClass: storageClasses) { + m_catalogue->deleteStorageClass(storageClass.name); + } + } + { + const std::list<common::dataStructures::TapePool> tapePools = m_catalogue->getTapePools(); + for(auto &tapePool: tapePools) { + m_catalogue->deleteTapePool(tapePool.name); + } + } + { + const std::list<common::dataStructures::LogicalLibrary> logicalLibraries = m_catalogue->getLogicalLibraries(); + for(auto &logicalLibrary: logicalLibraries) { + m_catalogue->deleteLogicalLibrary(logicalLibrary.name); + } + } + { + const std::list<common::dataStructures::MountPolicy> mountPolicies = m_catalogue->getMountPolicies(); + for(auto &mountPolicy: mountPolicies) { + m_catalogue->deleteMountPolicy(mountPolicy.name); + } + } + } + + virtual void TearDown() { + m_catalogue.reset(); + } + + std::unique_ptr<cta::catalogue::Catalogue> m_catalogue; + const std::string m_bootstrapComment; + cta::common::dataStructures::SecurityIdentity m_cliSI; + cta::common::dataStructures::SecurityIdentity m_bootstrapAdminSI; + cta::common::dataStructures::SecurityIdentity m_adminSI; + + /** + * Creates a map from VID to tape given the specified list of tapes. + * + * @param listOfTapes The list of tapes from which the map shall be created. + * @return The map from VID to tape. + */ + std::map<std::string, cta::common::dataStructures::Tape> tapeListToMap( + const std::list<cta::common::dataStructures::Tape> &listOfTapes) { + using namespace cta; + + try { + std::map<std::string, cta::common::dataStructures::Tape> vidToTape; + + for (auto &&tape: listOfTapes) { + if(vidToTape.end() != vidToTape.find(tape.vid)) { + throw exception::Exception(std::string("Duplicate VID: value=") + tape.vid); + } + vidToTape[tape.vid] = tape; + } + + return vidToTape; + } catch(exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } + } + + /** + * Creates a map from archive file ID to archive file from the specified iterator. + * + * @param itor Iterator over archive files. + * @return Map from archive file ID to archive file. + */ + std::map<uint64_t, cta::common::dataStructures::ArchiveFile> archiveFileItorToMap(cta::catalogue::ArchiveFileItor &itor) { + using namespace cta; + + try { + std::map<uint64_t, common::dataStructures::ArchiveFile> m; + while(itor.hasMore()) { + const common::dataStructures::ArchiveFile archiveFile = itor.next(); + if(m.end() != m.find(archiveFile.archiveFileID)) { + exception::Exception ex; + ex.getMessage() << "Archive file with ID " << archiveFile.archiveFileID << " is a duplicate"; + throw ex; + } + m[archiveFile.archiveFileID] = archiveFile; + } + return m; + } catch(exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } + } +}; // cta_catalogue_CatalogueTest + +} // namespace unitTests diff --git a/catalogue/DbLoginFactory.cpp b/catalogue/DbLoginFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..63410a1fbc107a0e2d859516bc4face9f7873a15 --- /dev/null +++ b/catalogue/DbLoginFactory.cpp @@ -0,0 +1,31 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#include "catalogue/DbLoginFactory.hpp" + +namespace cta { +namespace catalogue { + +//------------------------------------------------------------------------------ +// destructor +//------------------------------------------------------------------------------ +DbLoginFactory::~DbLoginFactory() { +} + +} // namespace catalogue +} // namespace cta diff --git a/catalogue/DbLoginFactory.hpp b/catalogue/DbLoginFactory.hpp new file mode 100644 index 0000000000000000000000000000000000000000..ff2ef3be0a1e4f8aa911d14da4f463d393eae7d5 --- /dev/null +++ b/catalogue/DbLoginFactory.hpp @@ -0,0 +1,47 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "catalogue/DbLogin.hpp" + +namespace cta { +namespace catalogue { + +/** + * Abstract class specifying the interface to a factory of DbLogin objects. + */ +class DbLoginFactory { +public: + + /** + * Destructor. + */ + virtual ~DbLoginFactory() = 0; + + /** + * Returns a newly created DbLogin object. + * + * @return A newly created DbLogin object. + */ + virtual DbLogin create() = 0; + +}; // class DbLogin + +} // namespace catalogue +} // namespace cta diff --git a/catalogue/InMemoryCatalogueTest.cpp b/catalogue/InMemoryCatalogueTest.cpp index 778b34295b9068005bde6beb5da44bf84b755ff9..7234d88bbd4212a9b3e710de0889839455d70697 100644 --- a/catalogue/InMemoryCatalogueTest.cpp +++ b/catalogue/InMemoryCatalogueTest.cpp @@ -16,3215 +16,40 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "catalogue/ArchiveFileRow.hpp" -#include "catalogue/CatalogueFactory.hpp" -#include "catalogue/UserError.hpp" -#include "common/exception/Exception.hpp" - -#include <gtest/gtest.h> -#include <map> -#include <memory> -#include <set> +#include "catalogue/CatalogueTest.hpp" namespace unitTests { -class cta_catalogue_InMemoryCatalogueTest : public ::testing::Test { -public: - cta_catalogue_InMemoryCatalogueTest(): - m_bootstrapComment("bootstrap") { - - m_cliSI.username = "cli_user_name"; - m_cliSI.host = "cli_host"; - - m_bootstrapAdminSI.username = "bootstrap_admin_user_name"; - m_bootstrapAdminSI.host = "bootstrap_host"; - - m_adminSI.username = "admin_user_name"; - m_adminSI.host = "admin_host"; - } - -protected: - - virtual void SetUp() { - using namespace cta; - using namespace cta::catalogue; - - const DbLogin catalogueLogin(DbLogin::DBTYPE_IN_MEMORY, "", "", ""); - m_catalogue.reset(CatalogueFactory::create(catalogueLogin)); - - { - const std::list<common::dataStructures::AdminUser> adminUsers = m_catalogue->getAdminUsers(); - for(auto &adminUser: adminUsers) { - m_catalogue->deleteAdminUser(adminUser.name); - } - } - { - const std::list<common::dataStructures::AdminHost> adminHosts = m_catalogue->getAdminHosts(); - for(auto &adminHost: adminHosts) { - m_catalogue->deleteAdminHost(adminHost.name); - } - } - { - const std::list<common::dataStructures::ArchiveRoute> archiveRoutes = m_catalogue->getArchiveRoutes(); - for(auto &archiveRoute: archiveRoutes) { - m_catalogue->deleteArchiveRoute(archiveRoute.storageClassName, archiveRoute.copyNb); - } - } - { - const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); - for(auto &rule: rules) { - m_catalogue->deleteRequesterMountRule(rule.name); - } - } - { - const std::list<common::dataStructures::RequesterGroupMountRule> rules = - m_catalogue->getRequesterGroupMountRules(); - for(auto &rule: rules) { - m_catalogue->deleteRequesterGroupMountRule(rule.name); - } - } - { - std::unique_ptr<ArchiveFileItor> itor = m_catalogue->getArchiveFileItor(); - while(itor->hasMore()) { - m_catalogue->deleteArchiveFile(itor->next().archiveFileID); - } - } - { - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); - for(auto &tape: tapes) { - m_catalogue->deleteTape(tape.vid); - } - } - { - const std::list<common::dataStructures::StorageClass> storageClasses = m_catalogue->getStorageClasses(); - for(auto &storageClass: storageClasses) { - m_catalogue->deleteStorageClass(storageClass.name); - } - } - { - const std::list<common::dataStructures::TapePool> tapePools = m_catalogue->getTapePools(); - for(auto &tapePool: tapePools) { - m_catalogue->deleteTapePool(tapePool.name); - } - } - { - const std::list<common::dataStructures::LogicalLibrary> logicalLibraries = m_catalogue->getLogicalLibraries(); - for(auto &logicalLibrary: logicalLibraries) { - m_catalogue->deleteLogicalLibrary(logicalLibrary.name); - } - } - { - const std::list<common::dataStructures::MountPolicy> mountPolicies = m_catalogue->getMountPolicies(); - for(auto &mountPolicy: mountPolicies) { - m_catalogue->deleteMountPolicy(mountPolicy.name); - } - } - } +namespace { - virtual void TearDown() { - m_catalogue.reset(); - } - - std::unique_ptr<cta::catalogue::Catalogue> m_catalogue; - const std::string m_bootstrapComment; - cta::common::dataStructures::SecurityIdentity m_cliSI; - cta::common::dataStructures::SecurityIdentity m_bootstrapAdminSI; - cta::common::dataStructures::SecurityIdentity m_adminSI; +/** + * Creates DbLogin objects for in-memory catalogue databases. + */ +class InMemoryDbLoginFactory: public cta::catalogue::DbLoginFactory { +public: /** - * Creates a map from VID to tape given the specified list of tapes. - * - * @param listOfTapes The list of tapes from which the map shall be created. - * @return The map from VID to tape. + * Destructor. */ - std::map<std::string, cta::common::dataStructures::Tape> tapeListToMap( - const std::list<cta::common::dataStructures::Tape> &listOfTapes) { - using namespace cta; - - try { - std::map<std::string, cta::common::dataStructures::Tape> vidToTape; - - for (auto &&tape: listOfTapes) { - if(vidToTape.end() != vidToTape.find(tape.vid)) { - throw exception::Exception(std::string("Duplicate VID: value=") + tape.vid); - } - vidToTape[tape.vid] = tape; - } - - return vidToTape; - } catch(exception::Exception &ex) { - throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); - } + virtual ~InMemoryDbLoginFactory() { } /** - * Creates a map from archive file ID to archive file from the specified iterator. + * Returns a newly created DbLogin object. * - * @param itor Iterator over archive files. - * @return Map from archive file ID to archive file. + * @return A newly created DbLogin object. */ - std::map<uint64_t, cta::common::dataStructures::ArchiveFile> archiveFileItorToMap(cta::catalogue::ArchiveFileItor &itor) { - using namespace cta; - - try { - std::map<uint64_t, common::dataStructures::ArchiveFile> m; - while(itor.hasMore()) { - const common::dataStructures::ArchiveFile archiveFile = itor.next(); - if(m.end() != m.find(archiveFile.archiveFileID)) { - exception::Exception ex; - ex.getMessage() << "Archive file with ID " << archiveFile.archiveFileID << " is a duplicate"; - throw ex; - } - m[archiveFile.archiveFileID] = archiveFile; - } - return m; - } catch(exception::Exception &ex) { - throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); - } - } -}; - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createBootstrapAdminAndHostNoAuth) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); - ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - { - std::list<common::dataStructures::AdminHost> hosts; - hosts = m_catalogue->getAdminHosts(); - ASSERT_EQ(1, hosts.size()); - - const common::dataStructures::AdminHost host = hosts.front(); - ASSERT_EQ(m_bootstrapComment, host.comment); - - const common::dataStructures::EntryLog creationLog = host.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - host.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createAdminUser) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const std::string createAdminUserComment = "create admin user"; - m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, createAdminUserComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(2, admins.size()); - - const common::dataStructures::AdminUser a1 = admins.front(); - admins.pop_front(); - const common::dataStructures::AdminUser a2 = admins.front(); - - ASSERT_NE(a1, a2); - ASSERT_TRUE((a1.name == m_bootstrapAdminSI.username && a2.name == m_adminSI.username) || - (a2.name == m_bootstrapAdminSI.username && a1.name == m_adminSI.username)); - - if(a1.name == m_bootstrapAdminSI.username) { - ASSERT_EQ(m_bootstrapAdminSI.username, a1.name); - ASSERT_EQ(m_bootstrapComment, a1.comment); - ASSERT_EQ(m_cliSI.username, a1.creationLog.username); - ASSERT_EQ(m_cliSI.host, a1.creationLog.host); - ASSERT_EQ(m_cliSI.username, a1.lastModificationLog.username); - ASSERT_EQ(m_cliSI.host, a1.lastModificationLog.host); - - ASSERT_EQ(m_adminSI.username, a2.name); - ASSERT_EQ(createAdminUserComment, a2.comment); - ASSERT_EQ(m_bootstrapAdminSI.username, a2.creationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, a2.creationLog.host); - ASSERT_EQ(m_bootstrapAdminSI.username, a2.lastModificationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, a2.lastModificationLog.host); - } else { - ASSERT_EQ(m_bootstrapAdminSI.username, a2.name); - ASSERT_EQ(m_bootstrapComment, a2.comment); - ASSERT_EQ(m_cliSI.username, a2.creationLog.username); - ASSERT_EQ(m_cliSI.host, a2.creationLog.host); - ASSERT_EQ(m_cliSI.username, a2.lastModificationLog.username); - ASSERT_EQ(m_cliSI.host, a2.lastModificationLog.host); - - ASSERT_EQ(m_adminSI.username, a1.name); - ASSERT_EQ(createAdminUserComment, a1.comment); - ASSERT_EQ(m_bootstrapAdminSI.username, a1.creationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, a1.creationLog.host); - ASSERT_EQ(m_bootstrapAdminSI.username, a1.lastModificationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, a1.lastModificationLog.host); - } - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createAdminUser_same_twice) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, "comment 1"); - - ASSERT_THROW(m_catalogue->createAdminUser(m_bootstrapAdminSI, m_adminSI.username, - "comment 2"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteAdminUser) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - m_catalogue->deleteAdminUser(m_bootstrapAdminSI.username); - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteAdminUser_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminUsers().empty()); - ASSERT_THROW(m_catalogue->deleteAdminUser("non_existant_sdmin_user"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createAdminHost) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const std::string createAdminHostComment = "create host user"; - const std::string anotherAdminHost = "another_admin_host"; - m_catalogue->createAdminHost(m_bootstrapAdminSI, - anotherAdminHost, createAdminHostComment); - - { - std::list<common::dataStructures::AdminHost> hosts; - hosts = m_catalogue->getAdminHosts(); - ASSERT_EQ(2, hosts.size()); - - const common::dataStructures::AdminHost h1 = hosts.front(); - hosts.pop_front(); - const common::dataStructures::AdminHost h2 = hosts.front(); - - ASSERT_NE(h1, h2); - ASSERT_TRUE( - (h1.name == m_bootstrapAdminSI.host && h2.name == anotherAdminHost) - || - (h2.name == anotherAdminHost && h1.name == m_bootstrapAdminSI.host) - ); - - if(h1.name == m_bootstrapAdminSI.host) { - ASSERT_EQ(m_bootstrapAdminSI.host, h1.name); - ASSERT_EQ(m_bootstrapComment, h1.comment); - ASSERT_EQ(m_cliSI.username, h1.creationLog.username); - ASSERT_EQ(m_cliSI.host, h1.creationLog.host); - ASSERT_EQ(m_cliSI.username, h1.lastModificationLog.username); - ASSERT_EQ(m_cliSI.host, h1.lastModificationLog.host); - - ASSERT_EQ(anotherAdminHost, h2.name); - ASSERT_EQ(createAdminHostComment, h2.comment); - ASSERT_EQ(m_bootstrapAdminSI.username, h2.creationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, h2.creationLog.host); - ASSERT_EQ(m_bootstrapAdminSI.username, h2.lastModificationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, h2.lastModificationLog.host); - } else { - ASSERT_EQ(m_bootstrapAdminSI.host, h2.name); - ASSERT_EQ(m_bootstrapComment, h2.comment); - ASSERT_EQ(m_cliSI.username, h2.creationLog.username); - ASSERT_EQ(m_cliSI.host, h2.creationLog.host); - ASSERT_EQ(m_cliSI.username, h2.lastModificationLog.username); - ASSERT_EQ(m_cliSI.host, h2.lastModificationLog.host); - - ASSERT_EQ(anotherAdminHost, h1.name); - ASSERT_EQ(createAdminHostComment, h1.comment); - ASSERT_EQ(m_bootstrapAdminSI.username, h1.creationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, h1.creationLog.host); - ASSERT_EQ(m_bootstrapAdminSI.username, h1.lastModificationLog.username); - ASSERT_EQ(m_bootstrapAdminSI.host, h1.lastModificationLog.host); - } - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createAdminHost_same_twice) { - using namespace cta; - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const std::string anotherAdminHost = "another_admin_host"; - - m_catalogue->createAdminHost(m_bootstrapAdminSI, anotherAdminHost, "comment 1"); - - ASSERT_THROW(m_catalogue->createAdminHost(m_bootstrapAdminSI, - anotherAdminHost, "comment 2"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteAdminHost) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - { - std::list<common::dataStructures::AdminUser> admins; - admins = m_catalogue->getAdminUsers(); - ASSERT_EQ(1, admins.size()); - - const common::dataStructures::AdminUser admin = admins.front(); - ASSERT_EQ(m_bootstrapComment, admin.comment); - - const common::dataStructures::EntryLog creationLog = admin.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - admin.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - m_catalogue->deleteAdminHost(m_bootstrapAdminSI.host); - - ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteAdminHost_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getAdminHosts().empty()); - ASSERT_THROW(m_catalogue->deleteAdminHost("non_exstant_admin_host"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, isAdmin_false) { - using namespace cta; - - ASSERT_FALSE(m_catalogue->isAdmin(m_cliSI)); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, isAdmin_true) { - using namespace cta; - - m_catalogue->createBootstrapAdminAndHostNoAuth( - m_cliSI, m_bootstrapAdminSI.username, m_bootstrapAdminSI.host, m_bootstrapComment); - - ASSERT_TRUE(m_catalogue->isAdmin(m_bootstrapAdminSI)); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createStorageClass) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - const std::string comment = "create storage class"; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); - - const std::list<common::dataStructures::StorageClass> storageClasses = - m_catalogue->getStorageClasses(); - - ASSERT_EQ(1, storageClasses.size()); - - const common::dataStructures::StorageClass storageClass = - storageClasses.front(); - ASSERT_EQ(storageClassName, storageClass.name); - ASSERT_EQ(nbCopies, storageClass.nbCopies); - ASSERT_EQ(comment, storageClass.comment); - - const common::dataStructures::EntryLog creationLog = storageClass.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - storageClass.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createStorageClass_same_twice) { - using namespace cta; - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - const std::string comment = "create storage class"; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); - ASSERT_THROW(m_catalogue->createStorageClass(m_cliSI, - storageClassName, nbCopies, comment), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteStorageClass) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - const std::string comment = "create storage class"; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, comment); - - const std::list<common::dataStructures::StorageClass> storageClasses = - m_catalogue->getStorageClasses(); - - ASSERT_EQ(1, storageClasses.size()); - - const common::dataStructures::StorageClass storageClass = - storageClasses.front(); - ASSERT_EQ(storageClassName, storageClass.name); - ASSERT_EQ(nbCopies, storageClass.nbCopies); - ASSERT_EQ(comment, storageClass.comment); - - const common::dataStructures::EntryLog creationLog = storageClass.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - storageClass.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - m_catalogue->deleteStorageClass(storageClass.name); - ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteStorageClass_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); - ASSERT_THROW(m_catalogue->deleteStorageClass("non_existant_storage_class"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createTapePool) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapePools().empty()); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - const std::string comment = "create tape pool"; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, - comment); - - const std::list<common::dataStructures::TapePool> pools = - m_catalogue->getTapePools(); - - ASSERT_EQ(1, pools.size()); - - const common::dataStructures::TapePool pool = pools.front(); - ASSERT_EQ(tapePoolName, pool.name); - ASSERT_EQ(nbPartialTapes, pool.nbPartialTapes); - ASSERT_EQ(is_encrypted, pool.encryption); - ASSERT_EQ(comment, pool.comment); - - const common::dataStructures::EntryLog creationLog = pool.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - pool.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createTapePool_same_twice) { - using namespace cta; - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - const std::string comment = "create tape pool"; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, - comment); - ASSERT_THROW(m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, comment), - catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteTapePool) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapePools().empty()); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - const std::string comment = "create tape pool"; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, - comment); - - const std::list<common::dataStructures::TapePool> pools = - m_catalogue->getTapePools(); - - ASSERT_EQ(1, pools.size()); - - const common::dataStructures::TapePool pool = pools.front(); - ASSERT_EQ(tapePoolName, pool.name); - ASSERT_EQ(nbPartialTapes, pool.nbPartialTapes); - ASSERT_EQ(is_encrypted, pool.encryption); - ASSERT_EQ(comment, pool.comment); - - const common::dataStructures::EntryLog creationLog = pool.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - pool.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - m_catalogue->deleteTapePool(pool.name); - ASSERT_TRUE(m_catalogue->getTapePools().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteTapePool_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapePools().empty()); - ASSERT_THROW(m_catalogue->deleteTapePool("non_existant_tape_pool"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createArchiveRoute) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string comment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, - comment); - - const std::list<common::dataStructures::ArchiveRoute> routes = - m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(comment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = - m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createArchiveRouteTapePool_same_twice) { - using namespace cta; - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, - "create tape pool"); - - const uint64_t copyNb = 1; - const std::string comment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, - comment); - ASSERT_THROW(m_catalogue->createArchiveRoute(m_cliSI, - storageClassName, copyNb, tapePoolName, comment), - exception::Exception); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteArchiveRoute) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string comment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, - comment); - - const std::list<common::dataStructures::ArchiveRoute> routes = - m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(comment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = - m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); - - m_catalogue->deleteArchiveRoute(storageClassName, copyNb); - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteArchiveRoute_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - ASSERT_THROW(m_catalogue->deleteArchiveRoute("non_existant_storage_class", 1234), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createArchiveRoute_deleteStorageClass) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string comment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, - comment); - - const std::list<common::dataStructures::ArchiveRoute> routes = - m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(comment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = - m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); - - ASSERT_THROW(m_catalogue->deleteStorageClass(storageClassName), exception::Exception); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createLogicalLibrary) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); - - const std::string logicalLibraryName = "logical_library"; - const std::string comment = "create logical library"; - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); - - const std::list<common::dataStructures::LogicalLibrary> libs = - m_catalogue->getLogicalLibraries(); - - ASSERT_EQ(1, libs.size()); - - const common::dataStructures::LogicalLibrary lib = libs.front(); - ASSERT_EQ(logicalLibraryName, lib.name); - ASSERT_EQ(comment, lib.comment); - - const common::dataStructures::EntryLog creationLog = lib.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - lib.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createLogicalLibrary_same_twice) { - using namespace cta; - - const std::string logicalLibraryName = "logical_library"; - const std::string comment = "create logical library"; - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); - ASSERT_THROW(m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteLogicalLibrary) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); - - const std::string logicalLibraryName = "logical_library"; - const std::string comment = "create logical library"; - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, comment); - - const std::list<common::dataStructures::LogicalLibrary> libs = - m_catalogue->getLogicalLibraries(); - - ASSERT_EQ(1, libs.size()); - - const common::dataStructures::LogicalLibrary lib = libs.front(); - ASSERT_EQ(logicalLibraryName, lib.name); - ASSERT_EQ(comment, lib.comment); - - const common::dataStructures::EntryLog creationLog = lib.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - lib.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - m_catalogue->deleteLogicalLibrary(logicalLibraryName); - ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteLogicalLibrary_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); - ASSERT_THROW(m_catalogue->deleteLogicalLibrary("non_existant_logical_library"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createTape) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - - const std::string vid = "vid"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(1, tapes.size()); - - const common::dataStructures::Tape tape = tapes.front(); - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createTape_same_twice) { - using namespace cta; - - const std::string vid = "vid"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, comment); - ASSERT_THROW(m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, - tapePoolName, encryptionKey, capacityInBytes, disabledValue, fullValue, - comment), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createTape_many_tapes) { - using namespace cta; - - const std::string logicalLibrary = "logical_library_name"; - const std::string tapePool = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t) 10 * 1000 * 1000 * 1000 * 1000; - const bool disabled = true; - const bool full = false; - const std::string comment = "create tape"; - - ASSERT_TRUE(m_catalogue->getLogicalLibraries().empty()); - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibrary, "create logical library"); - - ASSERT_TRUE(m_catalogue->getTapePools().empty()); - m_catalogue->createTapePool(m_cliSI, tapePool, 2, true, "create tape pool"); - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - const uint64_t nbTapes = 10; - - for(uint64_t i = 1; i <= nbTapes; i++) { - std::ostringstream vid; - vid << "vid" << i; - - m_catalogue->createTape(m_cliSI, vid.str(), logicalLibrary, tapePool, encryptionKey, capacityInBytes, disabled, - full, comment); - } - - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - - for(uint64_t i = 1; i <= nbTapes; i++) { - std::ostringstream vid; - vid << "vid" << i; - - auto vidAndTapeItor = vidToTape.find(vid.str()); - ASSERT_FALSE(vidToTape.end() == vidAndTapeItor); - - const common::dataStructures::Tape tape = vidAndTapeItor->second; - ASSERT_EQ(vid.str(), tape.vid); - ASSERT_EQ(logicalLibrary, tape.logicalLibraryName); - ASSERT_EQ(tapePool, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabled == tape.disabled); - ASSERT_TRUE(full == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = "vid1"; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(1, vidToTape.size()); - ASSERT_EQ("vid1", vidToTape.begin()->first); - ASSERT_EQ("vid1", vidToTape.begin()->second.vid); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.logicalLibrary = logicalLibrary; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - ASSERT_EQ(logicalLibrary, vidToTape.begin()->second.logicalLibraryName); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.tapePool = tapePool; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - ASSERT_EQ(tapePool, vidToTape.begin()->second.tapePoolName); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.capacityInBytes = "10000000000000"; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - ASSERT_EQ(capacityInBytes, vidToTape.begin()->second.capacityInBytes); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.disabled = "true"; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - ASSERT_TRUE(vidToTape.begin()->second.disabled); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.full = "false"; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(nbTapes, tapes.size()); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - ASSERT_EQ(nbTapes, vidToTape.size()); - ASSERT_FALSE(vidToTape.begin()->second.full); - } - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = "non_existant_vid"; - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_TRUE(tapes.empty()); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteTape) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - - const std::string vid = "vid"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(1, tapes.size()); - - const common::dataStructures::Tape tape = tapes.front(); - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - m_catalogue->deleteTape(tape.vid); - ASSERT_TRUE(m_catalogue->getTapes().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteTape_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - ASSERT_THROW(m_catalogue->deleteTape("non_exsitant_tape"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, getTapesForWriting) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - - const std::string vid = "vid"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = false; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<catalogue::TapeForWriting> tapes = m_catalogue->getTapesForWriting(logicalLibraryName); - - ASSERT_EQ(1, tapes.size()); - - const catalogue::TapeForWriting tape = tapes.front(); - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(tapePoolName, tape.tapePool); - ASSERT_EQ(0, tape.lastFSeq); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_EQ(0, tape.dataOnTapeInBytes); - ASSERT_FALSE(tape.lbp); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createMountPolicy) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); - - const std::string name = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - const std::string &comment = "create mount policy"; - - m_catalogue->createMountPolicy( - m_cliSI, - name, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - comment); - - const std::list<common::dataStructures::MountPolicy> mountPolicies = - m_catalogue->getMountPolicies(); - - ASSERT_EQ(1, mountPolicies.size()); - - const common::dataStructures::MountPolicy mountPolicy = mountPolicies.front(); - - ASSERT_EQ(name, mountPolicy.name); - - ASSERT_EQ(archivePriority, mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, mountPolicy.archiveMinRequestAge); - - ASSERT_EQ(retrievePriority, mountPolicy.retrievePriority); - ASSERT_EQ(minRetrieveRequestAge, mountPolicy.retrieveMinRequestAge); - - ASSERT_EQ(maxDrivesAllowed, mountPolicy.maxDrivesAllowed); - - ASSERT_EQ(comment, mountPolicy.comment); - - const common::dataStructures::EntryLog creationLog = mountPolicy.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - mountPolicy.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createMountPolicy_same_twice) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); - - const std::string name = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - const std::string &comment = "create mount policy"; - - m_catalogue->createMountPolicy( - m_cliSI, - name, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - comment); - - ASSERT_THROW(m_catalogue->createMountPolicy( - m_cliSI, - name, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - comment), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteMountPolicy) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); - - const std::string name = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - const std::string &comment = "create mount policy"; - - m_catalogue->createMountPolicy( - m_cliSI, - name, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - comment); - - const std::list<common::dataStructures::MountPolicy> mountPolicies = - m_catalogue->getMountPolicies(); - - ASSERT_EQ(1, mountPolicies.size()); - - const common::dataStructures::MountPolicy mountPolicy = mountPolicies.front(); - - ASSERT_EQ(name, mountPolicy.name); - - ASSERT_EQ(archivePriority, mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, mountPolicy.archiveMinRequestAge); - - ASSERT_EQ(retrievePriority, mountPolicy.retrievePriority); - ASSERT_EQ(minRetrieveRequestAge, mountPolicy.retrieveMinRequestAge); - - ASSERT_EQ(maxDrivesAllowed, mountPolicy.maxDrivesAllowed); - - ASSERT_EQ(comment, mountPolicy.comment); - - const common::dataStructures::EntryLog creationLog = mountPolicy.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - mountPolicy.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - m_catalogue->deleteMountPolicy(name); - - ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteMountPolicy_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getMountPolicies().empty()); - ASSERT_THROW(m_catalogue->deleteMountPolicy("non_existant_mount_policy"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterMountRule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); - - const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterMountRule rule = rules.front(); - - ASSERT_EQ(requesterName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterMountRule_same_twice) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); - ASSERT_THROW(m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment), - catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterMountRule_non_existant_mount_policy) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string comment = "create mount rule for requester"; - const std::string mountPolicyName = "non_existant_mount_policy"; - const std::string requesterName = "requester_name"; - ASSERT_THROW(m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment), - catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteRequesterMountRule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); - - const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterMountRule rule = rules.front(); - - ASSERT_EQ(requesterName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); - - m_catalogue->deleteRequesterMountRule(requesterName); - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteRequesterMountRule_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - ASSERT_THROW(m_catalogue->deleteRequesterMountRule("non_existant_requester"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterGroupMountRule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester group"; - const std::string requesterGroupName = "requester_group_name"; - m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); - - const std::list<common::dataStructures::RequesterGroupMountRule> rules = - m_catalogue->getRequesterGroupMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterGroupMountRule rule = rules.front(); - - ASSERT_EQ(requesterGroupName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterGroupMountRule_same_twice) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester group"; - const std::string requesterGroupName = "requester_group_name"; - m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); - ASSERT_THROW(m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment), - catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, createRequesterGroupMountRule_non_existant_mount_policy) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); - - const std::string comment = "create mount rule for requester group"; - const std::string mountPolicyName = "non_existant_mount_policy"; - const std::string requesterGroupName = "requester_group_name"; - ASSERT_THROW(m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment), - catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteRequesterGroupMountRule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 4; - const uint64_t retrievePriority = 5; - const uint64_t minRetrieveRequestAge = 8; - const uint64_t maxDrivesAllowed = 9; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester group"; - const std::string requesterGroupName = "requester_group_name"; - m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); - - const std::list<common::dataStructures::RequesterGroupMountRule> rules = m_catalogue->getRequesterGroupMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterGroupMountRule rule = rules.front(); - - ASSERT_EQ(requesterGroupName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); - - m_catalogue->deleteRequesterGroupMountRule(requesterGroupName); - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteRequesterGroupMountRule_non_existant) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterGroupMountRules().empty()); - ASSERT_THROW(m_catalogue->deleteRequesterGroupMountRule("non_existant_requester_group"), catalogue::UserError); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, prepareForNewFile_requester_mount_rule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); - - const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterMountRule rule = rules.front(); - - ASSERT_EQ(requesterName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, - "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string archiveRouteComment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); - - const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(archiveRouteComment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); - - common::dataStructures::UserIdentity userIdentity; - userIdentity.name = requesterName; - userIdentity.group = "group"; - uint64_t expectedArchiveFileId = 0; - for(uint64_t i = 0; i<10; i++) { - const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = - m_catalogue->prepareForNewFile(storageClassName, userIdentity); - - if(0 == i) { - expectedArchiveFileId = queueCriteria.fileId; - } else { - expectedArchiveFileId++; - } - ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); - - ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); - ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); - ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); - ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); - ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, prepareForNewFile_requester_group_mount_rule) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester group"; - const std::string requesterGroupName = "requester_group_name"; - m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterGroupName, comment); - - const std::list<common::dataStructures::RequesterGroupMountRule> rules = m_catalogue->getRequesterGroupMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterGroupMountRule rule = rules.front(); - - ASSERT_EQ(requesterGroupName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string archiveRouteComment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); - - const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(archiveRouteComment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = - m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); - - common::dataStructures::UserIdentity userIdentity; - userIdentity.name = "username"; - userIdentity.group = requesterGroupName; - uint64_t expectedArchiveFileId = 0; - for(uint64_t i = 0; i<10; i++) { - const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = - m_catalogue->prepareForNewFile(storageClassName, userIdentity); - - if(0 == i) { - expectedArchiveFileId = queueCriteria.fileId; - } else { - expectedArchiveFileId++; - } - ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); - - ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); - ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); - ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); - ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); - ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, prepareForNewFile_requester_mount_rule_overide) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string requesterRuleComment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, requesterRuleComment); - - const std::list<common::dataStructures::RequesterMountRule> requesterRules = m_catalogue->getRequesterMountRules(); - ASSERT_EQ(1, requesterRules.size()); - - const common::dataStructures::RequesterMountRule requesterRule = requesterRules.front(); - - ASSERT_EQ(requesterName, requesterRule.name); - ASSERT_EQ(mountPolicyName, requesterRule.mountPolicy); - ASSERT_EQ(requesterRuleComment, requesterRule.comment); - ASSERT_EQ(m_cliSI.username, requesterRule.creationLog.username); - ASSERT_EQ(m_cliSI.host, requesterRule.creationLog.host); - ASSERT_EQ(requesterRule.creationLog, requesterRule.lastModificationLog); - - const std::string requesterGroupRuleComment = "create mount rule for requester group"; - const std::string requesterGroupName = "requester_group_name"; - m_catalogue->createRequesterGroupMountRule(m_cliSI, mountPolicyName, requesterName, requesterGroupRuleComment); - - const std::list<common::dataStructures::RequesterGroupMountRule> requesterGroupRules = - m_catalogue->getRequesterGroupMountRules(); - ASSERT_EQ(1, requesterGroupRules.size()); - - const common::dataStructures::RequesterGroupMountRule requesterGroupRule = requesterGroupRules.front(); - - ASSERT_EQ(requesterName, requesterGroupRule.name); - ASSERT_EQ(mountPolicyName, requesterGroupRule.mountPolicy); - ASSERT_EQ(requesterGroupRuleComment, requesterGroupRule.comment); - ASSERT_EQ(m_cliSI.username, requesterGroupRule.creationLog.username); - ASSERT_EQ(m_cliSI.host, requesterGroupRule.creationLog.host); - ASSERT_EQ(requesterGroupRule.creationLog, requesterGroupRule.lastModificationLog); - - ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, - "create storage class"); - - const std::string tapePoolName = "tape_pool"; - const uint64_t nbPartialTapes = 2; - const bool is_encrypted = true; - m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, "create tape pool"); - - const uint64_t copyNb = 1; - const std::string archiveRouteComment = "create archive route"; - m_catalogue->createArchiveRoute(m_cliSI, storageClassName, copyNb, tapePoolName, archiveRouteComment); - - const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); - - ASSERT_EQ(1, routes.size()); - - const common::dataStructures::ArchiveRoute route = routes.front(); - ASSERT_EQ(storageClassName, route.storageClassName); - ASSERT_EQ(copyNb, route.copyNb); - ASSERT_EQ(tapePoolName, route.tapePoolName); - ASSERT_EQ(archiveRouteComment, route.comment); - - const common::dataStructures::EntryLog creationLog = route.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - common::dataStructures::TapeCopyToPoolMap copyToPoolMap = m_catalogue->getTapeCopyToPoolMap(storageClassName); - ASSERT_EQ(1, copyToPoolMap.size()); - std::pair<uint64_t, std::string> maplet = *(copyToPoolMap.begin()); - ASSERT_EQ(copyNb, maplet.first); - ASSERT_EQ(tapePoolName, maplet.second); - - common::dataStructures::UserIdentity userIdentity; - userIdentity.name = requesterName; - userIdentity.group = "group"; - uint64_t expectedArchiveFileId = 0; - for(uint64_t i = 0; i<10; i++) { - const common::dataStructures::ArchiveFileQueueCriteria queueCriteria = - m_catalogue->prepareForNewFile(storageClassName, userIdentity); - - if(0 == i) { - expectedArchiveFileId = queueCriteria.fileId; - } else { - expectedArchiveFileId++; - } - ASSERT_EQ(expectedArchiveFileId, queueCriteria.fileId); - - ASSERT_EQ(1, queueCriteria.copyToPoolMap.size()); - ASSERT_EQ(copyNb, queueCriteria.copyToPoolMap.begin()->first); - ASSERT_EQ(tapePoolName, queueCriteria.copyToPoolMap.begin()->second); - ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); - ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, prepareToRetrieveFile) { - using namespace cta; - - ASSERT_TRUE(m_catalogue->getTapes().empty()); - - const std::string vid1 = "VID123"; - const std::string vid2 = "VID456"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string createTapeComment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, - disabledValue, fullValue, createTapeComment); - m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, - disabledValue, fullValue, createTapeComment); - - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - { - auto it = vidToTape.find(vid1); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid1, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(createTapeComment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - { - auto it = vidToTape.find(vid2); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid2, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(createTapeComment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const uint64_t archiveFileId = 1234; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const uint64_t archiveFileSize = 1; - const std::string tapeDrive = "tape_drive"; - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - - catalogue::TapeFileWritten file1Written; - file1Written.archiveFileId = archiveFileId; - file1Written.diskInstance = "PUBLIC"; - file1Written.diskFileId = "5678"; - file1Written.diskFilePath = "/public_dir/public_file"; - file1Written.diskFileUser = "public_disk_user"; - file1Written.diskFileGroup = "public_disk_group"; - file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - file1Written.size = archiveFileSize; - file1Written.checksumType = checksumType; - file1Written.checksumValue = checksumValue; - file1Written.storageClassName = storageClassName; - file1Written.vid = vid1; - file1Written.fSeq = 1; - file1Written.blockId = 4321; - file1Written.compressedSize = 1; - file1Written.copyNb = 1; - file1Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file1Written); - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - catalogue::TapeFileWritten file2Written; - file2Written.archiveFileId = file1Written.archiveFileId; - file2Written.diskInstance = file1Written.diskInstance; - file2Written.diskFileId = file1Written.diskFileId; - file2Written.diskFilePath = file1Written.diskFilePath; - file2Written.diskFileUser = file1Written.diskFileUser; - file2Written.diskFileGroup = file1Written.diskFileGroup; - file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; - file2Written.size = archiveFileSize; - file2Written.checksumType = checksumType; - file2Written.checksumValue = checksumValue; - file2Written.storageClassName = storageClassName; - file2Written.vid = vid2; - file2Written.fSeq = 1; - file2Written.blockId = 4331; - file2Written.compressedSize = 1; - file2Written.copyNb = 2; - file2Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file2Written); - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file2Written.size, archiveFile.fileSize); - ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(2, archiveFile.tapeFiles.size()); - - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - - auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); - ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; - ASSERT_EQ(file2Written.vid, tapeFile2.vid); - ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); - ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); - ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); - } - - const std::string mountPolicyName = "mount_policy"; - const uint64_t archivePriority = 1; - const uint64_t minArchiveRequestAge = 2; - const uint64_t retrievePriority = 3; - const uint64_t minRetrieveRequestAge = 4; - const uint64_t maxDrivesAllowed = 5; - - m_catalogue->createMountPolicy( - m_cliSI, - mountPolicyName, - archivePriority, - minArchiveRequestAge, - retrievePriority, - minRetrieveRequestAge, - maxDrivesAllowed, - "create mount policy"); - - const std::string comment = "create mount rule for requester"; - const std::string requesterName = "requester_name"; - m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, requesterName, comment); - - const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); - ASSERT_EQ(1, rules.size()); - - const common::dataStructures::RequesterMountRule rule = rules.front(); - - ASSERT_EQ(requesterName, rule.name); - ASSERT_EQ(mountPolicyName, rule.mountPolicy); - ASSERT_EQ(comment, rule.comment); - ASSERT_EQ(m_cliSI.username, rule.creationLog.username); - ASSERT_EQ(m_cliSI.host, rule.creationLog.host); - ASSERT_EQ(rule.creationLog, rule.lastModificationLog); - - common::dataStructures::UserIdentity userIdentity; - userIdentity.name = requesterName; - userIdentity.group = "group"; - const common::dataStructures::RetrieveFileQueueCriteria queueCriteria = - m_catalogue->prepareToRetrieveFile(archiveFileId, userIdentity); - - ASSERT_EQ(2, queueCriteria.tapeFiles.size()); - ASSERT_EQ(archivePriority, queueCriteria.mountPolicy.archivePriority); - ASSERT_EQ(minArchiveRequestAge, queueCriteria.mountPolicy.archiveMinRequestAge); - ASSERT_EQ(maxDrivesAllowed, queueCriteria.mountPolicy.maxDrivesAllowed); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, getArchiveFileItor_zero_prefetch) { - using namespace cta; - - ASSERT_THROW(m_catalogue->getArchiveFileItor(catalogue::ArchiveFileSearchCriteria(), 0), exception::Exception); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, fileWrittenToTape_many_archive_files) { - using namespace cta; - - const std::string vid = "VID123"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, disabledValue, - fullValue, comment); - - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); - - ASSERT_EQ(1, tapes.size()); - - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - { - auto it = vidToTape.find(vid); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 1; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - const std::string tapeDrive = "tape_drive"; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - const uint64_t nbArchiveFiles = 10; - for(uint64_t i = 1; i <= nbArchiveFiles; i++) { - const uint64_t archiveFileSize = 1; - std::ostringstream diskFileId; - diskFileId << (12345677 + i); - std::ostringstream diskFilePath; - diskFilePath << "/public_dir/public_file_" << i; - - catalogue::TapeFileWritten fileWritten; - fileWritten.archiveFileId = i; - fileWritten.diskInstance = "PUBLIC"; - fileWritten.diskFileId = diskFileId.str(); - fileWritten.diskFilePath = diskFilePath.str(); - fileWritten.diskFileUser = "public_disk_user"; - fileWritten.diskFileGroup = "public_disk_group"; - fileWritten.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - fileWritten.size = archiveFileSize; - fileWritten.checksumType = checksumType; - fileWritten.checksumValue = checksumValue; - fileWritten.storageClassName = storageClassName; - fileWritten.vid = vid; - fileWritten.fSeq = i; - fileWritten.blockId = i * 100; - fileWritten.compressedSize = 1; - fileWritten.copyNb = 1; - fileWritten.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(fileWritten); - - const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(i, tape.lastFSeq); - } - - std::list<uint64_t> prefetches = {1, 2, 3, nbArchiveFiles - 1, nbArchiveFiles, nbArchiveFiles+1, nbArchiveFiles*2}; - for(auto prefetch: prefetches) { - std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = - m_catalogue->getArchiveFileItor(catalogue::ArchiveFileSearchCriteria(), prefetch); - std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - - for(uint64_t i = 1; i <= nbArchiveFiles; i++) { - const uint64_t archiveFileSize = 1; - std::ostringstream diskFileId; - diskFileId << (12345677 + i); - std::ostringstream diskFilePath; - diskFilePath << "/public_dir/public_file_" << i; - - catalogue::TapeFileWritten fileWritten; - fileWritten.archiveFileId = i; - fileWritten.diskInstance = "PUBLIC"; - fileWritten.diskFileId = diskFileId.str(); - fileWritten.diskFilePath = diskFilePath.str(); - fileWritten.diskFileUser = "public_disk_user"; - fileWritten.diskFileGroup = "public_disk_group"; - fileWritten.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - fileWritten.size = archiveFileSize; - fileWritten.checksumType = checksumType; - fileWritten.checksumValue = checksumValue; - fileWritten.storageClassName = storageClassName; - fileWritten.vid = vid; - fileWritten.fSeq = i; - fileWritten.blockId = i * 100; - fileWritten.compressedSize = 1; - fileWritten.copyNb = 1; - - const auto idAndFile = m.find(i); - ASSERT_FALSE(m.end() == idAndFile); - const common::dataStructures::ArchiveFile archiveFile = idAndFile->second; - ASSERT_EQ(fileWritten.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(fileWritten.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(fileWritten.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(fileWritten.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(fileWritten.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(fileWritten.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(fileWritten.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - ASSERT_EQ(fileWritten.size, archiveFile.fileSize); - ASSERT_EQ(fileWritten.checksumType, archiveFile.checksumType); - ASSERT_EQ(fileWritten.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(fileWritten.storageClassName, archiveFile.storageClass); - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - ASSERT_EQ(fileWritten.vid, archiveFile.tapeFiles.begin()->second.vid); - ASSERT_EQ(fileWritten.fSeq, archiveFile.tapeFiles.begin()->second.fSeq); - ASSERT_EQ(fileWritten.blockId, archiveFile.tapeFiles.begin()->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, archiveFile.tapeFiles.begin()->second.compressedSize); - ASSERT_EQ(fileWritten.copyNb, archiveFile.tapeFiles.begin()->first); - ASSERT_EQ(fileWritten.copyNb, archiveFile.tapeFiles.begin()->second.copyNb); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.archiveFileId = "10"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(1, m.size()); - ASSERT_EQ(10, m.begin()->first); - ASSERT_EQ(10, m.begin()->second.archiveFileID); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.diskInstance = "PUBLIC"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.diskFileId = "12345687"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(1, m.size()); - ASSERT_EQ("12345687", m.begin()->second.diskFileId); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.diskFilePath = "/public_dir/public_file_10"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(1, m.size()); - ASSERT_EQ("/public_dir/public_file_10", m.begin()->second.diskFileInfo.path); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.diskFileUser = "public_disk_user"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.diskFileGroup = "public_disk_group"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.storageClass = "storage_class"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.vid = vid; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.tapeFileCopyNb = "1"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - searchCriteria.tapePool = "tape_pool_name"; - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(nbArchiveFiles, m.size()); - } - - { - catalogue::ArchiveFileSearchCriteria searchCriteria; - std::ostringstream nonExistantArchiveFileId; - nonExistantArchiveFileId << (nbArchiveFiles + 1234); - searchCriteria.archiveFileId = nonExistantArchiveFileId.str(); - archiveFileItor = m_catalogue->getArchiveFileItor(searchCriteria, prefetch); - m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(0, m.size()); - } - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, fileWrittenToTape_2_tape_files_different_tapes) { - using namespace cta; - - const std::string vid1 = "VID123"; - const std::string vid2 = "VID456"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(2, tapes.size()); - - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - { - auto it = vidToTape.find(vid1); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid1, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - { - auto it = vidToTape.find(vid2); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid2, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const uint64_t archiveFileId = 1234; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const uint64_t archiveFileSize = 1; - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - const std::string tapeDrive = "tape_drive"; - - catalogue::TapeFileWritten file1Written; - file1Written.archiveFileId = archiveFileId; - file1Written.diskInstance = "PUBLIC"; - file1Written.diskFileId = "5678"; - file1Written.diskFilePath = "/public_dir/public_file"; - file1Written.diskFileUser = "public_disk_user"; - file1Written.diskFileGroup = "public_disk_group"; - file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - file1Written.size = archiveFileSize; - file1Written.checksumType = checksumType; - file1Written.checksumValue = checksumValue; - file1Written.storageClassName = storageClassName; - file1Written.vid = vid1; - file1Written.fSeq = 1; - file1Written.blockId = 4321; - file1Written.compressedSize = 1; - file1Written.copyNb = 1; - file1Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file1Written); - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = file1Written.vid; - std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(1, tape.lastFSeq); - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - catalogue::TapeFileWritten file2Written; - file2Written.archiveFileId = file1Written.archiveFileId; - file2Written.diskInstance = file1Written.diskInstance; - file2Written.diskFileId = file1Written.diskFileId; - file2Written.diskFilePath = file1Written.diskFilePath; - file2Written.diskFileUser = file1Written.diskFileUser; - file2Written.diskFileGroup = file1Written.diskFileGroup; - file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; - file2Written.size = archiveFileSize; - file2Written.checksumType = checksumType; - file2Written.checksumValue = checksumValue; - file2Written.storageClassName = storageClassName; - file2Written.vid = vid2; - file2Written.fSeq = 1; - file2Written.blockId = 4331; - file2Written.compressedSize = 1; - file2Written.copyNb = 2; - file2Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file2Written); - - { - ASSERT_EQ(2, m_catalogue->getTapes().size()); - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = file2Written.vid; - std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(1, tape.lastFSeq); - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file2Written.size, archiveFile.fileSize); - ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(2, archiveFile.tapeFiles.size()); - - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - - auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); - ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; - ASSERT_EQ(file2Written.vid, tapeFile2.vid); - ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); - ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); - ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); - ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); - } -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, fileWrittenToTape_2_tape_files_same_archive_file_same_tape) { - using namespace cta; - - const std::string vid = "VID123"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(1, tapes.size()); - - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - { - auto it = vidToTape.find(vid); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const uint64_t archiveFileId = 1234; - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - const std::string tapeDrive = "tape_drive"; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const uint64_t archiveFileSize = 1; - - catalogue::TapeFileWritten file1Written; - file1Written.archiveFileId = archiveFileId; - file1Written.diskInstance = "PUBLIC"; - file1Written.diskFileId = "5678"; - file1Written.diskFilePath = "/public_dir/public_file"; - file1Written.diskFileUser = "public_disk_user"; - file1Written.diskFileGroup = "public_disk_group"; - file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - file1Written.size = archiveFileSize; - file1Written.checksumType = checksumType; - file1Written.checksumValue = checksumValue; - file1Written.storageClassName = storageClassName; - file1Written.vid = vid; - file1Written.fSeq = 1; - file1Written.blockId = 4321; - file1Written.compressedSize = 1; - file1Written.copyNb = 1; - file1Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file1Written); - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = file1Written.vid; - std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(1, tape.lastFSeq); - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - catalogue::TapeFileWritten file2Written; - file2Written.archiveFileId = file1Written.archiveFileId; - file2Written.diskInstance = file1Written.diskInstance; - file2Written.diskFileId = file1Written.diskFileId; - file2Written.diskFilePath = file1Written.diskFilePath; - file2Written.diskFileUser = file1Written.diskFileUser; - file2Written.diskFileGroup = file1Written.diskFileGroup; - file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; - file2Written.size = archiveFileSize; - file2Written.checksumType = checksumType; - file2Written.checksumValue = checksumValue; - file2Written.storageClassName = storageClassName; - file2Written.vid = vid; - file2Written.fSeq = 2; - file2Written.blockId = 4331; - file2Written.compressedSize = 1; - file2Written.copyNb = 2; - file2Written.tapeDrive = tapeDrive; - ASSERT_THROW(m_catalogue->fileWrittenToTape(file2Written), exception::Exception); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, fileWrittenToTape_2_tape_files_corrupted_diskFilePath) { - using namespace cta; - - const std::string vid = "VID123"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(1, tapes.size()); - - const common::dataStructures::Tape tape = tapes.front(); - ASSERT_EQ(vid, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - - const uint64_t archiveFileId = 1234; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, - "create storage class"); - - const uint64_t archiveFileSize = 1; - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - const std::string tapeDrive = "tape_drive"; - - catalogue::TapeFileWritten file1Written; - file1Written.archiveFileId = archiveFileId; - file1Written.diskInstance = "PUBLIC"; - file1Written.diskFileId = "5678"; - file1Written.diskFilePath = "/public_dir/public_file"; - file1Written.diskFileUser = "public_disk_user"; - file1Written.diskFileGroup = "public_disk_group"; - file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - file1Written.size = archiveFileSize; - file1Written.checksumType = checksumType; - file1Written.checksumValue = checksumValue; - file1Written.storageClassName = storageClassName; - file1Written.vid = vid; - file1Written.fSeq = 1; - file1Written.blockId = 4321; - file1Written.compressedSize = 1; - file1Written.copyNb = 1; - file1Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file1Written); - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - catalogue::TapeFileWritten file2Written; - file2Written.archiveFileId = file1Written.archiveFileId; - file2Written.diskInstance = file1Written.diskInstance; - file2Written.diskFileId = file1Written.diskFileId; - file2Written.diskFilePath = "CORRUPTED disk file path"; - file2Written.diskFileUser = file1Written.diskFileUser; - file2Written.diskFileGroup = file1Written.diskFileGroup; - file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; - file2Written.size = archiveFileSize; - file2Written.checksumType = checksumType; - file2Written.checksumValue = checksumValue; - file2Written.storageClassName = storageClassName; - file2Written.vid = "VID123"; - file2Written.fSeq = 2; - file2Written.blockId = 4331; - file2Written.compressedSize = 1; - file2Written.copyNb = 2; - file2Written.tapeDrive = tapeDrive; - - ASSERT_THROW(m_catalogue->fileWrittenToTape(file2Written), exception::Exception); -} - -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteArchiveFile) { - using namespace cta; - - const std::string vid1 = "VID123"; - const std::string vid2 = "VID456"; - const std::string logicalLibraryName = "logical_library_name"; - const std::string tapePoolName = "tape_pool_name"; - const std::string encryptionKey = "encryption_key"; - const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; - const bool disabledValue = true; - const bool fullValue = false; - const std::string comment = "create tape"; - - m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, - "create logical library"); - m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "create tape pool"); - m_catalogue->createTape(m_cliSI, vid1, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - m_catalogue->createTape(m_cliSI, vid2, logicalLibraryName, tapePoolName, - encryptionKey, capacityInBytes, disabledValue, fullValue, - comment); - - const std::list<common::dataStructures::Tape> tapes = - m_catalogue->getTapes(); - - ASSERT_EQ(2, tapes.size()); - - const std::map<std::string, common::dataStructures::Tape> vidToTape = tapeListToMap(tapes); - { - auto it = vidToTape.find(vid1); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid1, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - { - auto it = vidToTape.find(vid2); - const common::dataStructures::Tape &tape = it->second; - ASSERT_EQ(vid2, tape.vid); - ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); - ASSERT_EQ(tapePoolName, tape.tapePoolName); - ASSERT_EQ(encryptionKey, tape.encryptionKey); - ASSERT_EQ(capacityInBytes, tape.capacityInBytes); - ASSERT_TRUE(disabledValue == tape.disabled); - ASSERT_TRUE(fullValue == tape.full); - ASSERT_EQ(comment, tape.comment); - - const common::dataStructures::EntryLog creationLog = tape.creationLog; - ASSERT_EQ(m_cliSI.username, creationLog.username); - ASSERT_EQ(m_cliSI.host, creationLog.host); - - const common::dataStructures::EntryLog lastModificationLog = - tape.lastModificationLog; - ASSERT_EQ(creationLog, lastModificationLog); - } - - const uint64_t archiveFileId = 1234; - - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->getArchiveFileById(archiveFileId), exception::Exception); - - const std::string storageClassName = "storage_class"; - const uint64_t nbCopies = 2; - m_catalogue->createStorageClass(m_cliSI, storageClassName, nbCopies, "create storage class"); - - const uint64_t archiveFileSize = 1; - const std::string checksumType = "checksum_type"; - const std::string checksumValue = "checksum_value"; - const std::string tapeDrive = "tape_drive"; - - catalogue::TapeFileWritten file1Written; - file1Written.archiveFileId = archiveFileId; - file1Written.diskInstance = "PUBLIC"; - file1Written.diskFileId = "5678"; - file1Written.diskFilePath = "/public_dir/public_file"; - file1Written.diskFileUser = "public_disk_user"; - file1Written.diskFileGroup = "public_disk_group"; - file1Written.diskFileRecoveryBlob = "opaque_disk_file_recovery_contents"; - file1Written.size = archiveFileSize; - file1Written.checksumType = checksumType; - file1Written.checksumValue = checksumValue; - file1Written.storageClassName = storageClassName; - file1Written.vid = vid1; - file1Written.fSeq = 1; - file1Written.blockId = 4321; - file1Written.compressedSize = 1; - file1Written.copyNb = 1; - file1Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file1Written); - - { - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = file1Written.vid; - std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(1, tape.lastFSeq); - } - - { - std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = m_catalogue->getArchiveFileItor(); - const std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(1, m.size()); - auto mItor = m.find(file1Written.archiveFileId); - ASSERT_FALSE(m.end() == mItor); - - const common::dataStructures::ArchiveFile archiveFile = mItor->second; - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file1Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file1Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file1Written.size, archiveFile.fileSize); - ASSERT_EQ(file1Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file1Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file1Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file1Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file1Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file1Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file1Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file1Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(1, archiveFile.tapeFiles.size()); - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - } - - catalogue::TapeFileWritten file2Written; - file2Written.archiveFileId = file1Written.archiveFileId; - file2Written.diskInstance = file1Written.diskInstance; - file2Written.diskFileId = file1Written.diskFileId; - file2Written.diskFilePath = file1Written.diskFilePath; - file2Written.diskFileUser = file1Written.diskFileUser; - file2Written.diskFileGroup = file1Written.diskFileGroup; - file2Written.diskFileRecoveryBlob = file1Written.diskFileRecoveryBlob; - file2Written.size = archiveFileSize; - file2Written.checksumType = checksumType; - file2Written.checksumValue = checksumValue; - file2Written.storageClassName = storageClassName; - file2Written.vid = vid2; - file2Written.fSeq = 1; - file2Written.blockId = 4331; - file2Written.compressedSize = 1; - file2Written.copyNb = 2; - file2Written.tapeDrive = tapeDrive; - m_catalogue->fileWrittenToTape(file2Written); - - { - ASSERT_EQ(2, m_catalogue->getTapes().size()); - catalogue::TapeSearchCriteria searchCriteria; - searchCriteria.vid = file2Written.vid; - std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(searchCriteria); - ASSERT_EQ(1, tapes.size()); - const common::dataStructures::Tape &tape = tapes.front(); - ASSERT_EQ(1, tape.lastFSeq); - } - - { - std::unique_ptr<catalogue::ArchiveFileItor> archiveFileItor = m_catalogue->getArchiveFileItor(); - const std::map<uint64_t, common::dataStructures::ArchiveFile> m = archiveFileItorToMap(*archiveFileItor); - ASSERT_EQ(1, m.size()); - - { - auto mItor = m.find(file1Written.archiveFileId); - ASSERT_FALSE(m.end() == mItor); - - const common::dataStructures::ArchiveFile archiveFile = mItor->second; - - ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file2Written.size, archiveFile.fileSize); - ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(2, archiveFile.tapeFiles.size()); - - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - - auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); - ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; - ASSERT_EQ(file2Written.vid, tapeFile2.vid); - ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); - ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); - ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); - ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); - } - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->getArchiveFileById(archiveFileId); - - ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file2Written.size, archiveFile.fileSize); - ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(2, archiveFile.tapeFiles.size()); - - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - - auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); - ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; - ASSERT_EQ(file2Written.vid, tapeFile2.vid); - ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); - ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); - ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); - ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); - } - - { - const common::dataStructures::ArchiveFile archiveFile = m_catalogue->deleteArchiveFile(archiveFileId); - - ASSERT_EQ(file2Written.archiveFileId, archiveFile.archiveFileID); - ASSERT_EQ(file2Written.diskFileId, archiveFile.diskFileId); - ASSERT_EQ(file2Written.size, archiveFile.fileSize); - ASSERT_EQ(file2Written.checksumType, archiveFile.checksumType); - ASSERT_EQ(file2Written.checksumValue, archiveFile.checksumValue); - ASSERT_EQ(file2Written.storageClassName, archiveFile.storageClass); - - ASSERT_EQ(file2Written.diskInstance, archiveFile.diskInstance); - ASSERT_EQ(file2Written.diskFilePath, archiveFile.diskFileInfo.path); - ASSERT_EQ(file2Written.diskFileUser, archiveFile.diskFileInfo.owner); - ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); - ASSERT_EQ(file2Written.diskFileRecoveryBlob, archiveFile.diskFileInfo.recoveryBlob); - - ASSERT_EQ(2, archiveFile.tapeFiles.size()); - - auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); - ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; - ASSERT_EQ(file1Written.vid, tapeFile1.vid); - ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); - ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); - ASSERT_EQ(file1Written.compressedSize, tapeFile1.compressedSize); - ASSERT_EQ(file1Written.copyNb, tapeFile1.copyNb); - - auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); - ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; - ASSERT_EQ(file2Written.vid, tapeFile2.vid); - ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); - ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); - ASSERT_EQ(file2Written.compressedSize, tapeFile2.compressedSize); - ASSERT_EQ(file2Written.copyNb, tapeFile2.copyNb); + virtual cta::catalogue::DbLogin create() { + using namespace cta::catalogue; + return DbLogin(DbLogin::DBTYPE_IN_MEMORY, "", "", ""); } +}; // class InMemoryDbLoginFactory - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); -} +InMemoryDbLoginFactory g_inMemoryDbLoginFactory; -TEST_F(cta_catalogue_InMemoryCatalogueTest, deleteArchiveFile_non_existant) { - using namespace cta; +} // anonymous namespace - ASSERT_FALSE(m_catalogue->getArchiveFileItor()->hasMore()); - ASSERT_THROW(m_catalogue->deleteArchiveFile(12345678), catalogue::UserError); -} +INSTANTIATE_TEST_CASE_P(InMemory, cta_catalogue_CatalogueTest, + ::testing::Values(dynamic_cast<cta::catalogue::DbLoginFactory*>(&g_inMemoryDbLoginFactory))); } // namespace unitTests diff --git a/catalogue/OracleCatalogueTest.cpp b/catalogue/OracleCatalogueTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6c8adffd4da8c1c053ab6330582c4b4a5469ec0b --- /dev/null +++ b/catalogue/OracleCatalogueTest.cpp @@ -0,0 +1,56 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#include "catalogue/CatalogueTest.hpp" +#include "tests/OraUnitTestsCmdLineArgs.hpp" + +namespace { + +/** + * Creates DbLogin objects for in-memory catalogue databases. + */ +class OracleDbLoginFactory: public cta::catalogue::DbLoginFactory { +public: + + /** + * Destructor. + */ + virtual ~OracleDbLoginFactory() { + } + + /** + * Returns a newly created DbLogin object. + * + * @return A newly created DbLogin object. + */ + virtual cta::catalogue::DbLogin create() { + using namespace cta::catalogue; + return DbLogin::parseFile(g_cmdLineArgs.oraDbConnFile); + } +}; // class OracleDbLoginFactory + +OracleDbLoginFactory g_oracleDbLoginFactory; + +} // anonymous namespace + +namespace unitTests { + +INSTANTIATE_TEST_CASE_P(Oracle, cta_catalogue_CatalogueTest, + ::testing::Values(dynamic_cast<cta::catalogue::DbLoginFactory*>(&g_oracleDbLoginFactory))); + +} // namespace unitTests diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c1e6e77186a2af3ec05b7de5e73284d6e93cba34..bbf47e6c78a08fa89fe6da8b148bab1df6f79908 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -53,10 +53,10 @@ add_executable(cta-oraUnitTests ${GMOCK_SRC}) target_link_libraries(cta-oraUnitTests - ctacatalogueoraunittests - ${GMOCK_LIB} - gtest - pthread) + ctacatalogueoraunittests + ${GMOCK_LIB} + gtest + pthread) add_executable(cta-unitTests-multiProcess unit_tests.cpp diff --git a/tests/oraUnitTests.cpp b/tests/oraUnitTests.cpp index 67521c6bebbd028afbcb6567800be400c1e60a0b..5c24b5f355ca9084ee6521925ae739e6c403e77c 100644 --- a/tests/oraUnitTests.cpp +++ b/tests/oraUnitTests.cpp @@ -16,6 +16,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "catalogue/CatalogueTest.hpp" #include "tests/OraUnitTestsCmdLineArgs.hpp" #include <gmock/gmock.h> @@ -32,8 +33,9 @@ static void printUsage(std::ostream &os) { } /** - * Parses the specified command-line arguments. This should be called after Google test has consumed all of its - * command-line options from the command-line. + * Parses the specified command-line arguments. This should be called after + * Google test has consumed all of its command-line options from the + * command-line. */ static CmdLineArgs parseCmdLine(const int argc, char ** argv) { if(argc != 2) {