Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
dCache
cta
Commits
3daf202b
Commit
3daf202b
authored
Sep 04, 2015
by
Daniele Kruse
Browse files
Going further with DataTransferSessionTest
parent
7b0d81fd
Changes
1
Hide whitespace changes
Inline
Side-by-side
tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp
View file @
3daf202b
...
...
@@ -419,29 +419,35 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
}
}
/*
TEST_F
(
castor_tape_tapeserver_daemon_DataTransferSessionTest
,
DataTransferSessionNoSuchDrive
)
{
// TpcpClients only supports 32 bits session number
// This number has to be less than 2^31 as in addition there is a mix
// of signed and unsigned numbers
// As the current ids in prod are ~30M, we are far from overflow (Feb 2013)
// 1) prepare the client and run it in another thread
uint32_t volReq = 0xBEEF;
// 0) Prepare the logger for everyone
castor
::
log
::
StringLogger
logger
(
"tapeServerUnitTest"
);
// 1) prepare the fake scheduler
std
::
string
vid
=
"V12345"
;
// cta::MountType::Enum mountType = cta::MountType::RETRIEVE;
std
::
string
density
=
"8000GC"
;
client::ClientSimulator sim(volReq, vid, density,
castor::tape::tapegateway::READ_TP, castor::tape::tapegateway::READ);
client::ClientSimulator::ipPort clientAddr = sim.getCallbackAddress();
clientRunner simRun(sim);
simRun.start();
// 3) Prepare the necessary environment (logger, plus system wrapper),
// construct and run the session.
castor::log::StringLogger logger("tapeServerUnitTest");
castor
::
tape
::
System
::
mockWrapper
mockSys
;
mockSys
.
delegateToFake
();
mockSys
.
disableGMockCallsCounting
();
mockSys
.
fake
.
setupForVirtualDriveSLC6
();
//delete is unnecessary
//pointer with ownership will be passed to the application,
//which will do the delete
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
]
=
new
castor
::
tape
::
tapeserver
::
drive
::
FakeDrive
;
// 4) Create the scheduler
cta
::
MockNameServer
ns
;
cta
::
MockRemoteNS
rns
;
cta
::
MockSchedulerDatabase
db
;
cta
::
Scheduler
scheduler
(
ns
,
db
,
rns
);
// Always use the same requester
const
cta
::
SecurityIdentity
requester
;
DriveConfig
driveConfig
(
"T10D6116"
,
"T10KD6"
,
"/dev/noSuchTape"
,
"manual"
);
DataTransferConfig
castorConf
;
castorConf
.
bufsz
=
1024
;
...
...
@@ -452,43 +458,45 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
castor
::
mediachanger
::
MediaChangerFacade
mc
(
acs
,
mmc
,
rmc
);
castor
::
messages
::
TapeserverProxyDummy
initialProcess
;
castor
::
server
::
ProcessCapDummy
capUtils
;
cta::MockNameServer ns;
cta::MockRemoteNS rns;
cta::MockSchedulerDatabase db;
cta::Scheduler scheduler(ns, db, rns);
DataTransferSession
sess
(
"tapeHost"
,
logger
,
mockSys
,
driveConfig
,
mc
,
initialProcess
,
capUtils
,
castorConf
,
scheduler
);
sess.execute();
simRun.wait();
ASSERT_NO_THROW
(
sess
.
execute
());
std
::
string
temp
=
logger
.
getLog
();
temp += "";
ASSERT_NE
(
std
::
string
::
npos
,
logger
.
getLog
().
find
(
"Drive not found on this path"
));
ASSERT_EQ(SEINTERNAL, sim.m_sessionErrorCode);
}
TEST_F
(
castor_tape_tapeserver_daemon_DataTransferSessionTest
,
DataTransferSessionFailtoMount
)
{
// This test is the same as the previous one, with
// wrong parameters set for the recall, so that we fail
// to recall the first file and cancel the second.
// 0) Prepare the logger for everyone
castor
::
log
::
StringLogger
logger
(
"tapeServerUnitTest"
);
// 1) prepare the client and run it in another thread
uint32_t volReq = 0xBEEF;
// 1) prepare the fake scheduler
std
::
string
vid
=
"V12345"
;
// cta::MountType::Enum mountType = cta::MountType::RETRIEVE;
std
::
string
density
=
"8000GC"
;
client::ClientSimulator sim(volReq, vid, density,
castor::tape::tapegateway::TAPE_GATEWAY,
castor::tape::tapegateway::READ);
client::ClientSimulator::ipPort clientAddr = sim.getCallbackAddress();
clientRunner simRun(sim);
simRun.start();
// 3) Prepare the necessary environment (logger, plus system wrapper),
// construct and run the session.
castor
::
tape
::
System
::
mockWrapper
mockSys
;
mockSys
.
delegateToFake
();
mockSys
.
disableGMockCallsCounting
();
mockSys
.
fake
.
setupForVirtualDriveSLC6
();
//delete is unnecessary
//pointer with ownership will be passed to the application,
//which will do the delete
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
]
=
new
castor
::
tape
::
tapeserver
::
drive
::
FakeDrive
;
// 4) Create the scheduler
cta
::
MockNameServer
ns
;
cta
::
MockRemoteNS
rns
;
cta
::
MockSchedulerDatabase
db
;
cta
::
Scheduler
scheduler
(
ns
,
db
,
rns
);
// Always use the same requester
const
cta
::
SecurityIdentity
requester
;
// List to remember the path of each remote file so that the existance of the
// files can be tested for at the end of the test
std
::
list
<
std
::
string
>
remoteFilePaths
;
//delete is unnecessary
//pointer with ownership will be passed to the application,
...
...
@@ -498,24 +506,63 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
// We can prepare files for reading on the drive
{
// Label the tape
castor
::
tape
::
tapeFile
::
LabelSession
ls
(
*
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
],
"V12345"
);
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
]
->
rewind
();
// And write to it
castor::tape::tapeserver::
client::ClientInterface
::VolumeInfo volInfo;
castor
::
tape
::
tapeserver
::
daemon
::
VolumeInfo
volInfo
;
volInfo
.
vid
=
"V12345"
;
// Prepare a non-empty files to recall list to pass the empty session
// detection
castor
::
tape
::
tapeFile
::
WriteSession
ws
(
*
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
],
volInfo
,
0
,
true
);
// Write a few files on the virtual tape and modify the archive name space
// so that it is in sync
uint8_t
data
[
1000
];
castor
::
tape
::
SCSI
::
Structures
::
zeroStruct
(
&
data
);
for
(
int
fseq
=
1
;
fseq
<=
10
;
fseq
++
)
{
// Create a path to a remote destination file
std
::
ostringstream
remoteFilePath
;
remoteFilePath
<<
"file:"
<<
m_tmpDir
<<
"/test"
<<
fseq
;
remoteFilePaths
.
push_back
(
remoteFilePath
.
str
());
// Create an entry in the archive namespace
std
::
ostringstream
archiveFilePath
;
archiveFilePath
<<
"/test"
<<
fseq
;
const
mode_t
archiveFileMode
=
0655
;
const
uint64_t
archiveFileSize
=
256
*
1024
;
ns
.
createFile
(
requester
,
archiveFilePath
.
str
(),
archiveFileMode
,
archiveFileSize
);
// TODO
// We need to add the tape file entry to the name server with at least one entry
// pointing beyond the end of data
// Write the file to tape
std
::
unique_ptr
<
cta
::
RetrieveJob
>
ftr
(
new
MockRetrieveJob
());
std
::
unique_ptr
<
cta
::
ArchiveJob
>
ftm_temp
(
new
MockArchiveJob
());
ftr
->
tapeFileLocation
.
fSeq
=
fseq
;
ftm_temp
->
tapeFileLocation
.
fSeq
=
fseq
;
ftr
->
archiveFile
.
fileId
=
1000
+
fseq
;
// Set the recall destination (/dev/null)
ftr->archiveFile.path = "/dev/null";
// Record the file for recall, with an out of tape fSeq
ftr->setFseq(ftr->fseq() + 1000);
sim.addFileToRecall(ftr, 1000);
ftm_temp
->
archiveFile
.
fileId
=
1000
+
fseq
;
castor
::
tape
::
tapeFile
::
WriteFile
wf
(
&
ws
,
*
ftm_temp
,
archiveFileSize
);
ftr
->
tapeFileLocation
.
blockId
=
wf
.
getPosition
();
ftr
->
remotePathAndStatus
.
path
=
remoteFilePath
.
str
();
// Write the data (one block)
wf
.
write
(
data
,
sizeof
(
data
));
// Close the file
wf
.
close
();
// Schedule the retrieval of the file
std
::
list
<
std
::
string
>
archiveFilePaths
;
archiveFilePaths
.
push_back
(
archiveFilePath
.
str
());
scheduler
.
queueRetrieveRequest
(
requester
,
archiveFilePaths
,
remoteFilePath
.
str
());
}
}
DriveConfig
driveConfig
(
"T10D6116"
,
"T10KD6"
,
"/dev/tape_T10D6116"
,
"manual"
);
...
...
@@ -531,48 +578,42 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
castor
::
mediachanger
::
MediaChangerFacade
mc
(
acs
,
mmc
,
rmc
);
castor
::
server
::
ProcessCap
capUtils
;
castor
::
messages
::
TapeserverProxyDummy
initialProcess
;
cta::MockNameServer ns;
cta::MockRemoteNS rns;
cta::MockSchedulerDatabase db;
cta::Scheduler scheduler(ns, db, rns);
DataTransferSession
sess
(
"tapeHost"
,
logger
,
mockSys
,
driveConfig
,
mc
,
initialProcess
,
capUtils
,
castorConf
,
scheduler
);
sess.execute();
simRun.wait();
ASSERT_NO_THROW
(
sess
.
execute
());
std
::
string
temp
=
logger
.
getLog
();
temp
+=
""
;
ASSERT_EQ
(
"V12345"
,
sess
.
getVid
());
// The session is now failing (internal error is reported)
ASSERT_EQ(1015, sim.m_sessionErrorCode);
}
TEST_F
(
castor_tape_tapeserver_daemon_DataTransferSessionTest
,
DataTransferSessionEmptyOnVolReq
)
{
// This test is the same as the previous one, with
// wrong parameters set for the recall, so that we fail
// to recall the first file and cancel the second.
// 0) Prepare the logger for everyone
castor
::
log
::
StringLogger
logger
(
"tapeServerUnitTest"
);
// 1) prepare the client and run it in another thread
uint32_t volReq = 0xBEEF;
// 1) prepare the fake scheduler
std
::
string
vid
=
"V12345"
;
// cta::MountType::Enum mountType = cta::MountType::RETRIEVE;
std
::
string
density
=
"8000GC"
;
client::ClientSimulator sim(volReq, vid, density,
castor::tape::tapegateway::TAPE_GATEWAY,
castor::tape::tapegateway::READ, client::ClientSimulator::EmptyOnVolReq);
client::ClientSimulator::ipPort clientAddr = sim.getCallbackAddress();
clientRunner simRun(sim);
simRun.start();
// 3) Prepare the necessary environment (logger, plus system wrapper),
// construct and run the session.
castor
::
tape
::
System
::
mockWrapper
mockSys
;
mockSys
.
delegateToFake
();
mockSys
.
disableGMockCallsCounting
();
mockSys
.
fake
.
setupForVirtualDriveSLC6
();
// The drive will not even be opened. so no need for one.
mockSys
.
fake
.
m_pathToDrive
[
"/dev/nst0"
]
=
NULL
;
// 4) Create the scheduler
cta
::
MockNameServer
ns
;
cta
::
MockRemoteNS
rns
;
cta
::
MockSchedulerDatabase
db
;
cta
::
Scheduler
scheduler
(
ns
,
db
,
rns
);
// Always use the same requester
const
cta
::
SecurityIdentity
requester
;
DriveConfig
driveConfig
(
"T10D6116"
,
"T10KD6"
,
"/dev/tape_T10D6116"
,
"manual"
);
DataTransferConfig
castorConf
;
castorConf
.
bufsz
=
1024
*
1024
;
// 1 MB memory buffers
...
...
@@ -586,23 +627,16 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
castor
::
mediachanger
::
MediaChangerFacade
mc
(
acs
,
mmc
,
rmc
);
castor
::
server
::
ProcessCap
capUtils
;
castor
::
messages
::
TapeserverProxyDummy
initialProcess
;
cta::MockNameServer ns;
cta::MockRemoteNS rns;
cta::MockSchedulerDatabase db;
cta::Scheduler scheduler(ns, db, rns);
DataTransferSession
sess
(
"tapeHost"
,
logger
,
mockSys
,
driveConfig
,
mc
,
initialProcess
,
capUtils
,
castorConf
,
scheduler
);
sess.execute();
simRun.wait();
ASSERT_NO_THROW
(
sess
.
execute
());
std
::
string
temp
=
logger
.
getLog
();
temp
+=
""
;
ASSERT_EQ
(
""
,
sess
.
getVid
());
// Currently, failures are reported by files and recall sessions do not fail.
ASSERT_EQ(0, sim.m_sessionErrorCode);
// We should not have logged any error
ASSERT_EQ
(
std
::
string
::
npos
,
logger
.
getLog
().
find
(
"LVL=E"
));
}
/*
class TempFileForData {
public:
TempFileForData(size_t size): m_size(size) {
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment