From 06feefa1a7a60f0975de4cff51d9eadc067dc327 Mon Sep 17 00:00:00 2001
From: Steven Murray <steven.murray@cern.ch>
Date: Tue, 22 Mar 2016 13:22:40 +0100
Subject: [PATCH] Added mount group unit tests for SqliteCatalogue

---
 catalogue/SqliteCatalogue.cpp     | 229 +++++++++++++++++++++++++++++-
 catalogue/SqliteCatalogueTest.cpp | 114 +++++++++++++++
 2 files changed, 337 insertions(+), 6 deletions(-)

diff --git a/catalogue/SqliteCatalogue.cpp b/catalogue/SqliteCatalogue.cpp
index cd8734ff5c..3d507e9eee 100644
--- a/catalogue/SqliteCatalogue.cpp
+++ b/catalogue/SqliteCatalogue.cpp
@@ -195,6 +195,35 @@ void cta::catalogue::SqliteCatalogue::createDbSchema() {
         "LOGICAL_LIBRARY(LOGICAL_LIBRARY_NAME),"
       "FOREIGN KEY(TAPE_POOL_NAME) REFERENCES "
         "TAPE_POOL(TAPE_POOL_NAME)"
+    ");"
+    "CREATE TABLE MOUNT_GROUP("
+      "MOUNT_GROUP_NAME,"
+
+      "ARCHIVE_PRIORITY,"
+      "MIN_ARCHIVE_FILES_QUEUED,"
+      "MIN_ARCHIVE_BYTES_QUEUED,"
+      "MIN_ARCHIVE_REQUEST_AGE,"
+
+      "RETRIEVE_PRIORITY,"
+      "MIN_RETRIEVE_FILES_QUEUED,"
+      "MIN_RETRIEVE_BYTES_QUEUED,"
+      "MIN_RETRIEVE_REQUEST_AGE,"
+
+      "MAX_DRIVES_ALLOWED,"
+
+      "COMMENT TEXT,"
+
+      "CREATION_LOG_USER_NAME  TEXT,"
+      "CREATION_LOG_GROUP_NAME TEXT,"
+      "CREATION_LOG_HOST_NAME  TEXT,"
+      "CREATION_LOG_TIME       INTEGER,"
+
+      "LAST_MOD_USER_NAME  TEXT,"
+      "LAST_MOD_GROUP_NAME TEXT,"
+      "LAST_MOD_HOST_NAME  TEXT,"
+      "LAST_MOD_TIME       INTEGER,"
+
+      "PRIMARY KEY(MOUNT_GROUP_NAME)"
     ");";
   m_conn.enableForeignKeys();
   m_conn.execNonQuery(sql);
@@ -245,6 +274,7 @@ void cta::catalogue::SqliteCatalogue::createAdminUser(
     "VALUES("
       ":USER_NAME,"
       ":GROUP_NAME,"
+
       ":COMMENT,"
 
       ":CREATION_LOG_USER_NAME,"
@@ -260,6 +290,7 @@ void cta::catalogue::SqliteCatalogue::createAdminUser(
 
   stmt->bind(":USER_NAME", user.name);
   stmt->bind(":GROUP_NAME", user.group);
+
   stmt->bind(":COMMENT", comment);
 
   stmt->bind(":CREATION_LOG_USER_NAME", cliIdentity.user.name);
@@ -387,6 +418,7 @@ void cta::catalogue::SqliteCatalogue::createAdminHost(
   std::unique_ptr<SqliteStmt> stmt(m_conn.createStmt(sql));
 
   stmt->bind(":HOST_NAME", hostName);
+
   stmt->bind(":COMMENT", comment);
 
   stmt->bind(":CREATION_LOG_USER_NAME", cliIdentity.user.name);
@@ -1185,7 +1217,8 @@ std::list<cta::common::dataStructures::Tape>
     common::dataStructures::Tape tape;
 
     tape.vid = stmt->columnText(nameToIdx["VID"]);
-    tape.logicalLibraryName = stmt->columnText(nameToIdx["LOGICAL_LIBRARY_NAME"]);
+    tape.logicalLibraryName =
+      stmt->columnText(nameToIdx["LOGICAL_LIBRARY_NAME"]);
     tape.tapePoolName = stmt->columnText(nameToIdx["TAPE_POOL_NAME"]);
     tape.encryptionKey = stmt->columnText(nameToIdx["ENCRYPTION_KEY"]);
     tape.capacityInBytes = stmt->columnUint64(nameToIdx["CAPACITY_IN_BYTES"]);
@@ -1303,7 +1336,13 @@ void cta::catalogue::SqliteCatalogue::modifyTapeComment(const common::dataStruct
 //------------------------------------------------------------------------------
 // createUser
 //------------------------------------------------------------------------------
-void cta::catalogue::SqliteCatalogue::createUser(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &name, const std::string &group, const std::string &mountGroup, const std::string &comment) {}
+void cta::catalogue::SqliteCatalogue::createUser(
+  const common::dataStructures::SecurityIdentity &cliIdentity,
+  const std::string &name,
+  const std::string &group,
+  const std::string &mountGroup,
+  const std::string &comment) {
+}
 
 //------------------------------------------------------------------------------
 // deleteUser
@@ -1328,9 +1367,98 @@ void cta::catalogue::SqliteCatalogue::modifyUserComment(const common::dataStruct
 //------------------------------------------------------------------------------
 // createMountGroup
 //------------------------------------------------------------------------------
-void cta::catalogue::SqliteCatalogue::createMountGroup(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &name, const uint64_t archivePriority, const uint64_t minArchiveFilesQueued, 
-                               const uint64_t minArchiveBytesQueued, const uint64_t minArchiveRequestAge, const uint64_t retrievePriority, const uint64_t minRetrieveFilesQueued,
-                               const uint64_t minRetrieveBytesQueued, const uint64_t minRetrieveRequestAge, const uint64_t maxDrivesAllowed, const std::string &comment) {}
+void cta::catalogue::SqliteCatalogue::createMountGroup(
+  const common::dataStructures::SecurityIdentity &cliIdentity,
+  const std::string &name,
+  const uint64_t archivePriority,
+  const uint64_t minArchiveFilesQueued, 
+  const uint64_t minArchiveBytesQueued,
+  const uint64_t minArchiveRequestAge,
+  const uint64_t retrievePriority,
+  const uint64_t minRetrieveFilesQueued,
+  const uint64_t minRetrieveBytesQueued,
+  const uint64_t minRetrieveRequestAge,
+  const uint64_t maxDrivesAllowed,
+  const std::string &comment) {
+  const time_t now = time(NULL);
+  const char *const sql =
+    "INSERT INTO MOUNT_GROUP("
+      "MOUNT_GROUP_NAME,"
+
+      "ARCHIVE_PRIORITY,"
+      "MIN_ARCHIVE_FILES_QUEUED,"
+      "MIN_ARCHIVE_BYTES_QUEUED,"
+      "MIN_ARCHIVE_REQUEST_AGE,"
+
+      "RETRIEVE_PRIORITY,"
+      "MIN_RETRIEVE_FILES_QUEUED,"
+      "MIN_RETRIEVE_BYTES_QUEUED,"
+      "MIN_RETRIEVE_REQUEST_AGE,"
+
+      "MAX_DRIVES_ALLOWED,"
+
+      "COMMENT,"
+
+      "CREATION_LOG_USER_NAME,"
+      "CREATION_LOG_GROUP_NAME,"
+      "CREATION_LOG_HOST_NAME,"
+      "CREATION_LOG_TIME,"
+
+      "LAST_MOD_USER_NAME,"
+      "LAST_MOD_GROUP_NAME,"
+      "LAST_MOD_HOST_NAME,"
+      "LAST_MOD_TIME)"
+    "VALUES("
+      ":MOUNT_GROUP_NAME,"
+
+      ":ARCHIVE_PRIORITY,"
+      ":MIN_ARCHIVE_FILES_QUEUED,"
+      ":MIN_ARCHIVE_BYTES_QUEUED,"
+      ":MIN_ARCHIVE_REQUEST_AGE,"
+
+      ":RETRIEVE_PRIORITY,"
+      ":MIN_RETRIEVE_FILES_QUEUED,"
+      ":MIN_RETRIEVE_BYTES_QUEUED,"
+      ":MIN_RETRIEVE_REQUEST_AGE,"
+
+      ":MAX_DRIVES_ALLOWED,"
+
+      ":COMMENT,"
+
+      ":CREATION_LOG_USER_NAME,"
+      ":CREATION_LOG_GROUP_NAME,"
+      ":CREATION_LOG_HOST_NAME,"
+      ":CREATION_LOG_TIME,"
+
+      ":CREATION_LOG_USER_NAME,"
+      ":CREATION_LOG_GROUP_NAME,"
+      ":CREATION_LOG_HOST_NAME,"
+      ":CREATION_LOG_TIME);";
+  std::unique_ptr<SqliteStmt> stmt(m_conn.createStmt(sql));
+
+  stmt->bind(":MOUNT_GROUP_NAME", name);
+
+  stmt->bind(":ARCHIVE_PRIORITY", archivePriority);
+  stmt->bind(":MIN_ARCHIVE_FILES_QUEUED", minArchiveFilesQueued);
+  stmt->bind(":MIN_ARCHIVE_BYTES_QUEUED", minArchiveBytesQueued);
+  stmt->bind(":MIN_ARCHIVE_REQUEST_AGE", minArchiveRequestAge);
+
+  stmt->bind(":RETRIEVE_PRIORITY", retrievePriority);
+  stmt->bind(":MIN_RETRIEVE_FILES_QUEUED", minRetrieveFilesQueued);
+  stmt->bind(":MIN_RETRIEVE_BYTES_QUEUED", minRetrieveBytesQueued);
+  stmt->bind(":MIN_RETRIEVE_REQUEST_AGE", minRetrieveRequestAge);
+
+  stmt->bind(":MAX_DRIVES_ALLOWED", maxDrivesAllowed);
+
+  stmt->bind(":COMMENT", comment);
+
+  stmt->bind(":CREATION_LOG_USER_NAME", cliIdentity.user.name);
+  stmt->bind(":CREATION_LOG_GROUP_NAME", cliIdentity.user.group);
+  stmt->bind(":CREATION_LOG_HOST_NAME", cliIdentity.host);
+  stmt->bind(":CREATION_LOG_TIME", now);
+
+  stmt->step();
+}
 
 //------------------------------------------------------------------------------
 // deleteMountGroup
@@ -1340,7 +1468,96 @@ void cta::catalogue::SqliteCatalogue::deleteMountGroup(const std::string &name)
 //------------------------------------------------------------------------------
 // getMountGroups
 //------------------------------------------------------------------------------
-std::list<cta::common::dataStructures::MountGroup> cta::catalogue::SqliteCatalogue::getMountGroups() const { return std::list<cta::common::dataStructures::MountGroup>();}
+std::list<cta::common::dataStructures::MountGroup>
+  cta::catalogue::SqliteCatalogue::getMountGroups() const {
+  std::list<cta::common::dataStructures::MountGroup> groups;
+  const char *const sql =
+    "SELECT "
+      "MOUNT_GROUP_NAME AS MOUNT_GROUP_NAME,"
+
+      "ARCHIVE_PRIORITY         AS ARCHIVE_PRIORITY,"
+      "MIN_ARCHIVE_FILES_QUEUED AS MIN_ARCHIVE_FILES_QUEUED,"
+      "MIN_ARCHIVE_BYTES_QUEUED AS MIN_ARCHIVE_BYTES_QUEUED,"
+      "MIN_ARCHIVE_REQUEST_AGE  AS MIN_ARCHIVE_REQUEST_AGE,"
+
+      "RETRIEVE_PRIORITY         AS RETRIEVE_PRIORITY,"
+      "MIN_RETRIEVE_FILES_QUEUED AS MIN_RETRIEVE_FILES_QUEUED,"
+      "MIN_RETRIEVE_BYTES_QUEUED AS MIN_RETRIEVE_BYTES_QUEUED,"
+      "MIN_RETRIEVE_REQUEST_AGE  AS MIN_RETRIEVE_REQUEST_AGE,"
+
+      "MAX_DRIVES_ALLOWED AS MAX_DRIVES_ALLOWED,"
+
+      "COMMENT AS COMMENT,"
+
+      "CREATION_LOG_USER_NAME  AS CREATION_LOG_USER_NAME,"
+      "CREATION_LOG_GROUP_NAME AS CREATION_LOG_GROUP_NAME,"
+      "CREATION_LOG_HOST_NAME  AS CREATION_LOG_HOST_NAME,"
+      "CREATION_LOG_TIME       AS CREATION_LOG_TIME,"
+
+      "LAST_MOD_USER_NAME  AS LAST_MOD_USER_NAME,"
+      "LAST_MOD_GROUP_NAME AS LAST_MOD_GROUP_NAME,"
+      "LAST_MOD_HOST_NAME  AS LAST_MOD_HOST_NAME,"
+      "LAST_MOD_TIME       AS LAST_MOD_TIME "
+    "FROM MOUNT_GROUP";
+  std::unique_ptr<SqliteStmt> stmt(m_conn.createStmt(sql));
+  ColumnNameToIdx  nameToIdx;
+  while(SQLITE_ROW == stmt->step()) {
+    if(nameToIdx.empty()) {
+      nameToIdx = stmt->getColumnNameToIdx();
+    }
+    common::dataStructures::MountGroup group;
+
+    group.name = stmt->columnText(nameToIdx["MOUNT_GROUP_NAME"]);
+
+    group.archive_priority = stmt->columnUint64(nameToIdx["ARCHIVE_PRIORITY"]);
+    group.archive_minFilesQueued =
+      stmt->columnUint64(nameToIdx["MIN_ARCHIVE_FILES_QUEUED"]);
+    group.archive_minBytesQueued =
+      stmt->columnUint64(nameToIdx["MIN_ARCHIVE_BYTES_QUEUED"]);
+    group.archive_minRequestAge =
+      stmt->columnUint64(nameToIdx["MIN_ARCHIVE_REQUEST_AGE"]);
+
+    group.retrieve_priority =
+      stmt->columnUint64(nameToIdx["RETRIEVE_PRIORITY"]);
+    group.retrieve_minFilesQueued =
+      stmt->columnUint64(nameToIdx["MIN_RETRIEVE_FILES_QUEUED"]);
+    group.retrieve_minBytesQueued =
+      stmt->columnUint64(nameToIdx["MIN_RETRIEVE_BYTES_QUEUED"]);
+    group.retrieve_minRequestAge =
+      stmt->columnUint64(nameToIdx["MIN_RETRIEVE_REQUEST_AGE"]);
+
+    group.maxDrivesAllowed =
+      stmt->columnUint64(nameToIdx["MAX_DRIVES_ALLOWED"]);
+
+    group.comment = stmt->columnText(nameToIdx["COMMENT"]);
+
+    common::dataStructures::UserIdentity creatorUI;
+    creatorUI.name = stmt->columnText(nameToIdx["CREATION_LOG_USER_NAME"]);
+    creatorUI.group = stmt->columnText(nameToIdx["CREATION_LOG_GROUP_NAME"]);
+
+    common::dataStructures::EntryLog creationLog;
+    creationLog.user = creatorUI;
+    creationLog.host = stmt->columnText(nameToIdx["CREATION_LOG_HOST_NAME"]);
+    creationLog.time = stmt->columnUint64(nameToIdx["CREATION_LOG_TIME"]);
+
+    group.creationLog = creationLog;
+
+    common::dataStructures::UserIdentity updaterUI;
+    updaterUI.name = stmt->columnText(nameToIdx["LAST_MOD_USER_NAME"]);
+    updaterUI.group = stmt->columnText(nameToIdx["LAST_MOD_GROUP_NAME"]);
+
+    common::dataStructures::EntryLog updateLog;
+    updateLog.user = updaterUI;
+    updateLog.host = stmt->columnText(nameToIdx["LAST_MOD_HOST_NAME"]);
+    updateLog.time = stmt->columnUint64(nameToIdx["LAST_MOD_TIME"]);
+
+    group.lastModificationLog = updateLog;
+
+    groups.push_back(group);
+  }
+
+  return groups;
+}
 
 //------------------------------------------------------------------------------
 // modifyMountGroupArchivePriority
diff --git a/catalogue/SqliteCatalogueTest.cpp b/catalogue/SqliteCatalogueTest.cpp
index 914b7db20e..b3c4fd6d32 100644
--- a/catalogue/SqliteCatalogueTest.cpp
+++ b/catalogue/SqliteCatalogueTest.cpp
@@ -635,4 +635,118 @@ TEST_F(cta_catalogue_SqliteCatalogueTest, createTape_same_twice) {
     comment), exception::Exception);
 }
 
+TEST_F(cta_catalogue_SqliteCatalogueTest, createMountGroup) {
+  using namespace cta;
+
+  catalogue::SqliteCatalogue catalogue;
+
+  ASSERT_TRUE(catalogue.getMountGroups().empty());
+
+  const std::string name = "mount_group";
+  const uint64_t archivePriority = 1;
+  const uint64_t minArchiveFilesQueued = 2;
+  const uint64_t minArchiveBytesQueued = 3;
+  const uint64_t minArchiveRequestAge = 4;
+  const uint64_t retrievePriority = 5;
+  const uint64_t minRetrieveFilesQueued = 6;
+  const uint64_t minRetrieveBytesQueued = 7;
+  const uint64_t minRetrieveRequestAge = 8;
+  const uint64_t maxDrivesAllowed = 9;
+  const std::string &comment = "create mount group";
+
+  catalogue.createMountGroup(
+    m_cliSI,
+    name,
+    archivePriority,
+    minArchiveFilesQueued,
+    minArchiveBytesQueued,
+    minArchiveRequestAge,
+    retrievePriority,
+    minRetrieveFilesQueued,
+    minRetrieveBytesQueued,
+    minRetrieveRequestAge,
+    maxDrivesAllowed,
+    comment);
+
+  const std::list<common::dataStructures::MountGroup> groups =
+    catalogue.getMountGroups();
+
+  ASSERT_EQ(1, groups.size());
+
+  const common::dataStructures::MountGroup group = groups.front();
+
+  ASSERT_EQ(name, group.name);
+
+  ASSERT_EQ(archivePriority, group.archive_priority);
+  ASSERT_EQ(minArchiveFilesQueued, group.archive_minFilesQueued);
+  ASSERT_EQ(minArchiveBytesQueued, group.archive_minBytesQueued);
+  ASSERT_EQ(minArchiveRequestAge, group.archive_minRequestAge);
+
+  ASSERT_EQ(retrievePriority, group.retrieve_priority);
+  ASSERT_EQ(minRetrieveFilesQueued, group.retrieve_minFilesQueued);
+  ASSERT_EQ(minRetrieveBytesQueued, group.retrieve_minBytesQueued);
+  ASSERT_EQ(minRetrieveRequestAge, group.retrieve_minRequestAge);
+
+  ASSERT_EQ(maxDrivesAllowed, group.maxDrivesAllowed);
+
+  ASSERT_EQ(comment, group.comment);
+
+  const common::dataStructures::EntryLog creationLog = group.creationLog;
+  ASSERT_EQ(m_cliSI.user.name, creationLog.user.name);
+  ASSERT_EQ(m_cliSI.user.group, creationLog.user.group);
+  ASSERT_EQ(m_cliSI.host, creationLog.host);
+
+  const common::dataStructures::EntryLog lastModificationLog =
+    group.lastModificationLog;
+  ASSERT_EQ(creationLog, lastModificationLog);
+}
+
+TEST_F(cta_catalogue_SqliteCatalogueTest, createMountGroup_same_twice) {
+  using namespace cta;
+
+  catalogue::SqliteCatalogue catalogue;
+
+  ASSERT_TRUE(catalogue.getMountGroups().empty());
+
+  const std::string name = "mount_group";
+  const uint64_t archivePriority = 1;
+  const uint64_t minArchiveFilesQueued = 2;
+  const uint64_t minArchiveBytesQueued = 3;
+  const uint64_t minArchiveRequestAge = 4;
+  const uint64_t retrievePriority = 5;
+  const uint64_t minRetrieveFilesQueued = 6;
+  const uint64_t minRetrieveBytesQueued = 7;
+  const uint64_t minRetrieveRequestAge = 8;
+  const uint64_t maxDrivesAllowed = 9;
+  const std::string &comment = "create mount group";
+
+  catalogue.createMountGroup(
+    m_cliSI,
+    name,
+    archivePriority,
+    minArchiveFilesQueued,
+    minArchiveBytesQueued,
+    minArchiveRequestAge,
+    retrievePriority,
+    minRetrieveFilesQueued,
+    minRetrieveBytesQueued,
+    minRetrieveRequestAge,
+    maxDrivesAllowed,
+    comment);
+
+  ASSERT_THROW(catalogue.createMountGroup(
+    m_cliSI,
+    name,
+    archivePriority,
+    minArchiveFilesQueued,
+    minArchiveBytesQueued,
+    minArchiveRequestAge,
+    retrievePriority,
+    minRetrieveFilesQueued,
+    minRetrieveBytesQueued,
+    minRetrieveRequestAge,
+    maxDrivesAllowed,
+    comment), exception::Exception);
+}
+
 } // namespace unitTests
-- 
GitLab