/*
* @project The CERN Tape Archive (CTA)
* @copyright Copyright(C) 2003-2021 CERN
* @license 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 .
*/
#include "castor/tape/tapeserver/daemon/RecallReportPacker.hpp"
#include "common/log/StringLogger.hpp"
#include "common/exception/Exception.hpp"
#include "scheduler/OStoreDB/OStoreDBFactory.hpp"
#include "objectstore/BackendVFS.hpp"
#include "scheduler/testingMocks/MockRetrieveMount.hpp"
#include "scheduler/testingMocks/MockRetrieveJob.hpp"
#include
#include
using ::testing::_;
using ::testing::Invoke;
namespace unitTests{
class castor_tape_tapeserver_daemon_RecallReportPackerTest: public ::testing::Test {
protected:
void SetUp() {
}
void TearDown() {
}
}; // class castor_tape_tapeserver_daemon_RecallReportPackerTest
class MockRetrieveJobExternalStats: public cta::MockRetrieveJob {
public:
MockRetrieveJobExternalStats(cta::RetrieveMount & rm, int & completes, int &failures):
MockRetrieveJob(rm), completesRef(completes), failuresRef(failures) {}
void asyncSetSuccessful() override {
completesRef++;
}
void transferFailed(const std::string &failureReason, cta::log::LogContext&) override {
failuresRef++;
}
private:
int & completesRef;
int & failuresRef;
};
TEST_F(castor_tape_tapeserver_daemon_RecallReportPackerTest, RecallReportPackerNominal) {
auto catalogue = cta::catalogue::DummyCatalogue();
cta::MockRetrieveMount retrieveMount(catalogue);
::testing::InSequence dummy;
std::unique_ptr job1;
int job1completes(0), job1failures(0);
{
std::unique_ptr mockJob(
new MockRetrieveJobExternalStats(retrieveMount, job1completes, job1failures));
job1.reset(mockJob.release());
}
int job2completes(0), job2failures(0);
std::unique_ptr job2;
{
std::unique_ptr mockJob(
new MockRetrieveJobExternalStats(retrieveMount, job2completes, job2failures));
job2.reset(mockJob.release());
}
cta::log::StringLogger log("dummy","castor_tape_tapeserver_RecallReportPackerNominal",cta::log::DEBUG);
cta::log::LogContext lc(log);
castor::tape::tapeserver::daemon::RecallReportPacker rrp(&retrieveMount,lc);
rrp.startThreads();
rrp.reportCompletedJob(std::move(job1));
rrp.reportCompletedJob(std::move(job2));
rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Unmounting);
rrp.reportEndOfSession();
// rrp.reportTestGoingToEnd();
rrp.waitThread();
std::string temp = log.getLog();
ASSERT_NE(std::string::npos, temp.find("Nominal RecallReportPacker::EndofSession has been reported"));
ASSERT_EQ(1,job1completes);
ASSERT_EQ(1,job2completes);
ASSERT_EQ(1,retrieveMount.completes);
}
TEST_F(castor_tape_tapeserver_daemon_RecallReportPackerTest, RecallReportPackerBadBadEnd) {
auto catalogue = cta::catalogue::DummyCatalogue();
cta::MockRetrieveMount retrieveMount(catalogue);
::testing::InSequence dummy;
std::unique_ptr job1;
int job1completes(0), job1failures(0);
{
std::unique_ptr mockJob(
new MockRetrieveJobExternalStats(retrieveMount, job1completes, job1failures));
job1.reset(mockJob.release());
}
int job2completes(0), job2failures(0);
std::unique_ptr job2;
{
std::unique_ptr mockJob(
new MockRetrieveJobExternalStats(retrieveMount, job2completes, job2failures));
job2.reset(mockJob.release());
}
int job3completes(0), job3failures(0);
std::unique_ptr job3;
{
std::unique_ptr mockJob(
new MockRetrieveJobExternalStats(retrieveMount, job3completes, job3failures));
job3.reset(mockJob.release());
}
cta::log::StringLogger log("dummy","castor_tape_tapeserver_RecallReportPackerBadBadEnd",cta::log::DEBUG);
cta::log::LogContext lc(log);
castor::tape::tapeserver::daemon::RecallReportPacker rrp(&retrieveMount,lc);
rrp.startThreads();
rrp.reportCompletedJob(std::move(job1));
rrp.reportCompletedJob(std::move(job2));
const std::string error_msg = "ERROR_TEST_MSG";
const cta::exception::Exception ex(error_msg);
rrp.reportFailedJob(std::move(job3), ex);
rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Unmounting);
rrp.reportEndOfSession();
// rrp.reportTestGoingToEnd();
rrp.waitThread();
const std::string temp = log.getLog();
ASSERT_NE(std::string::npos, temp.find(error_msg));
ASSERT_EQ(1, job1completes);
ASSERT_EQ(1, job2completes);
ASSERT_EQ(1, job3failures);
ASSERT_EQ(1, retrieveMount.completes);
}
}