Skip to content
Snippets Groups Projects
Commit 2820301b authored by felmer's avatar felmer
Browse files

SP-1061, SWE-36: Some refactoring and extension of framework. Assertion part...

SP-1061, SWE-36: Some refactoring and extension of framework. Assertion part of test_ev.py extended.

SVN: 30246
parent 14e6afa9
No related branches found
No related tags found
No related merge requests found
......@@ -13,6 +13,7 @@ DATAMOVER_PROJECT = 'datamover'
PLAYGROUND = 'targets/playground'
TEMPLATES = 'templates'
TEST_DATA = 'testData'
PSQL_EXE = 'psql'
class TestCase(object):
......@@ -256,6 +257,33 @@ class _Controller(object):
self.installPath = installPath
print "Controller created for instance '%s'. Installation path: %s" % (instanceName, installPath)
def assertEmptyFolder(self, pathRelativeToInstallPath):
"""
Asserts that the specified path (relative to the installation path) is an empty folder.
"""
relativePath = "%s/%s" % (self.installPath, pathRelativeToInstallPath)
files = self._getFiles(relativePath)
if len(files) == 0:
print "Empty folder as expected: %s" % relativePath
else:
self.testCase.fail("%s isn't empty. It contains the following files:\n %s" % (relativePath, files))
def assertFiles(self, folderPathRelativeToInstallPath, expectedFiles):
"""
Asserts that the specified path (relative to the installation path) contains the specified files.
"""
relativePath = "%s/%s" % (self.installPath, folderPathRelativeToInstallPath)
files = self._getFiles(relativePath)
self.testCase.assertEquals("Files in %s" % relativePath, expectedFiles, sorted(files))
def _getFiles(self, relativePath):
if not os.path.isdir(relativePath):
self.testCase.fail("Doesn't exist or isn't a folder: %s" % relativePath)
files = os.listdir(relativePath)
return files
class ScriptBasedServerController(_Controller):
def __init__(self, testCase, testName, installPath, instanceName, startCommand, stopCommand):
super(ScriptBasedServerController, self).__init__(testCase, testName, installPath, instanceName)
......@@ -325,7 +353,7 @@ class DatamoverController(_Controller):
def drop(self, testDataSetName):
""" Drops the specified test data set into incoming folder. """
util.copyFromTo("testData", "%s/data/incoming" % self.installPath, testDataSetName)
util.copyFromTo(TEST_DATA, "%s/data/incoming" % self.installPath, testDataSetName)
class ScreeningTestClient(object):
......@@ -347,6 +375,26 @@ class ScreeningTestClient(object):
log.write("%s\n" % line)
return output
class DataSet(object):
def __init__(self, resultSetRow):
self.id = resultSetRow[0]
self.dataStore = resultSetRow[1]
self.experimentCode = resultSetRow[2]
self.code = resultSetRow[3]
self.type = resultSetRow[4]
self.location = resultSetRow[5]
self.producer = resultSetRow[6]
self.productionTimeStamp = resultSetRow[7]
self.parents = []
self.children = []
def __str__(self):
parents = [d.id for d in self.parents]
children = [d.id for d in self.children]
return "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" % (self.id, self.dataStore, self.code, self.type,
self.location, parents, children, self.experimentCode,
self.producer, self.productionTimeStamp)
class OpenbisController(_Controller):
"""
Class to control AS and DSS of an installed openBIS instance.
......@@ -390,6 +438,9 @@ class OpenbisController(_Controller):
""" Sets the code of the Data Store Server. """
self.dssProperties['data-store-server-code'] = code
def getDataStoreServerCode(self):
return self.dssProperties['data-store-server-code']
def setDataStoreServerPort(self, port):
""" Sets the port of the Data Store Server. """
self.dssProperties['port'] = port
......@@ -408,33 +459,56 @@ class OpenbisController(_Controller):
else:
self.testCase.fail("Path doesn't exist: %s" % relativePath)
def assertEmptyFolder(self, pathRelativeToInstallPath):
def assertDataSetContent(self, pathToOriginal, dataSet):
path = "%s/data/store/1/%s/original" % (self.installPath, dataSet.location)
path = "%s/%s" % (path, os.listdir(path)[0])
numberOfDifferences = util.getNumberOfDifferences(pathToOriginal, path)
if numberOfDifferences > 0:
self.testCase.fail("%s differences found." % numberOfDifferences)
def assertNumberOfDataSets(self, expectedNumberOfDataSets, dataSets):
"""
Asserts that the specified path (relative to the installation path) is an empty folder.
Asserts that the specified number of data sets from the specified list of DataSet instances
are in the data store.
"""
relativePath = "%s/%s" % (self.installPath, pathRelativeToInstallPath)
if not os.path.isdir(relativePath):
self.testCase.fail("Doesn't exist or isn't a folder: %s" % relativePath)
files = os.listdir(relativePath)
if len(files) == 0:
print "Empty folder as expected: %s" % relativePath
else:
self.testCase.fail("%s isn't empty. It contains the following files:\n %s" % (relativePath, files))
def assertNumberOfDataSets(self, expectedNumberOfDataSets):
"""
Asserts that the specified number of data sets are in the store and in the database.
Some meta data of all data sets are returned.
"""
metaData = self.queryDatabase("openbis", "select e.code,data.code,t.code,location from data"
+ " join external_data as ed on ed.data_id = data.id"
+ " join data_set_types as t on data.dsty_id = t.id"
+ " join experiments as e on data.expe_id = e.id")
util.printResultSet(metaData)
self.testCase.assertEquals('number of data sets', expectedNumberOfDataSets, len(metaData));
for row in metaData:
self.assertFileExist("data/store/1/%s/original" % row[3])
return metaData
count = 0
for dataSet in dataSets:
if dataSet.dataStore != self.getDataStoreServerCode():
continue
count += 1
self.assertFileExist("data/store/1/%s/original" % dataSet.location)
self.testCase.assertEquals("Number of data sets in data store %s" % self.getDataStoreServerCode(),
expectedNumberOfDataSets, count)
def getDataSets(self):
"""
Returns all data sets as a list (ordered by data set ids) of instances of class DataSet.
"""
resultSet = self.queryDatabase('openbis',
"select data.id,ds.code,e.code,data.code,t.code,location,"
+ " data.data_producer_code,data.production_timestamp from data"
+ " join external_data as ed on ed.data_id = data.id"
+ " join data_set_types as t on data.dsty_id = t.id"
+ " join experiments as e on data.expe_id = e.id"
+ " join data_stores as ds on data.dast_id = ds.id order by data.id")
dataSets = []
dataSetsById = {}
for row in resultSet:
dataSet = DataSet(row)
dataSets.append(dataSet)
dataSetsById[dataSet.id] = dataSet
relationships = self.queryDatabase('openbis',
"select data_id_parent, data_id_child from data_set_relationships"
+ " order by data_id_parent, data_id_child")
for parent_id, child_id in relationships:
parent = dataSetsById[parent_id]
child = dataSetsById[child_id]
parent.children.append(child)
child.parents.append(parent)
print "All data sets:\nid,dataStore,code,type,location,experiment,parents,children\n"
for dataSet in dataSets:
print dataSet
return dataSets
def createTestDatabase(self, databaseType):
"""
......
import filecmp
import os
import os.path
import re
......@@ -137,6 +138,18 @@ def printResultSet(resultSet):
"""
for row in resultSet:
print row
def getNumberOfDifferences(fileOrFolder1, fileOrFolder2):
"""
Gets and reports differences in file system structures between both arguments.
"""
result = filecmp.dircmp(fileOrFolder1, fileOrFolder2, ignore=['.svn'])
result.report()
return len(result.left_only) + len(result.right_only) + len(result.diff_files)
def getContent(path):
with open(path, "r") as f:
return [ l.rstrip() for l in f.readlines()]
class LogMonitor():
"""
......
......@@ -4,6 +4,7 @@ import shutil
import settings
import systemtest.testcase
import systemtest.util as util
from systemtest.testcase import TEST_DATA
class TestCase(systemtest.testcase.TestCase):
......@@ -51,26 +52,67 @@ class TestCase(systemtest.testcase.TestCase):
openbis2.waitUntilDataSetRegistrationFinished()
def executeInDevMode(self):
openbis1 = self.createOpenbisController(instanceName='openbis1', dropDatabases=False)
openbis2 = self.createOpenbisController(instanceName='openbis2', dropDatabases=False)
datamover1 = self.createDatamoverController("datamover1")
datamover1.setPrefixForIncoming('microX_200801011213_')
datamover1.setTreatIncomingAsRemote(True)
datamover1.setOutgoingTarget('../openbis1/data/incoming-raw')
datamover1.setExtraCopyDir('data/extra_local_copy')
datamover2 = self.createDatamoverController("datamover2")
datamover2.setOutgoingTarget('../openbis1/data/incoming-analysis')
dummyImageAnalyser = self.createScriptBasedServerController('dummy-img-analyser')
"""
openbis1.allUp()
openbis2.dssUp()
datamover1.start()
datamover2.start()
dummyImageAnalyser.start()
"""
openbis1.assertNumberOfDataSets(6)
openbis2.assertNumberOfDataSets(1)
datamover1.assertEmptyFolder('data/incoming')
datamover1.assertEmptyFolder('data/extra_local_copy')
datamover2.assertEmptyFolder('data/incoming')
openbis1.assertFiles('data/incoming-raw',
['.MARKER_is_finished_microX_200801011213_3VCP1', '.faulty_paths',
'microX_200801011213_3VCP1'])
openbis1.assertEmptyFolder('data/incoming-analysis')
openbis2.assertEmptyFolder('data/incoming')
dataCompletedLog = util.getContent("%s/data-completed-info.txt" % datamover1.installPath)
self.assertEquals("data completion log",
['Data complete: /data/incoming/3VCP1', 'Data complete: /data/incoming/3VCP1',
'Data complete: /data/incoming/3VCP3', 'Data complete: /data/incoming/UnknownPlate'],
[l.replace(datamover1.installPath, '') for l in dataCompletedLog])
dataSets = openbis1.getDataSets()
openbis1.assertNumberOfDataSets(5, dataSets)
openbis2.assertNumberOfDataSets(1, dataSets)
self.assertEquals("Experiments", ['EXP1'] * 6, [d.experimentCode for d in dataSets])
self.assertEquals("Producers", ['microX'] * 2, [d.producer for d in dataSets if d.code.startswith('MIC')])
self.assertEquals("Production timestamp", ['2008-01-01 12:13:00+01'] * 2,
[d.productionTimeStamp for d in dataSets if d.code.startswith('MIC')])
dataSet1 = self.getDataSetByCode(dataSets, 'MICROX-3VCP1')
openbis1.assertDataSetContent("%s/%s" % (TEST_DATA, '3VCP1'), dataSet1)
dataSet2 = self.getDataSetByCode(dataSets, 'MICROX-3VCP3')
openbis1.assertDataSetContent("%s/%s" % (TEST_DATA, '3VCP3'), dataSet2)
child = dataSet1.children[0]
self.assertEquals("data set type", 'HCS_IMAGE', child.type)
self.assertEquals("child of %s" % dataSet2.code, child, dataSet2.children[0])
count = 0
for dataSet in dataSets:
if dataSet.type != 'HCS_IMAGE_ANALYSIS_DATA':
continue
count += 1
path = "%s/data/store/1/%s/original" % (openbis1.installPath, dataSet.location)
code = os.listdir(path)[0].split('_')[-1]
openbis1.assertDataSetContent("%s/%s" % (TEST_DATA, code), dataSet)
self.assertEquals("number of analysis data sets", 3, count)
self.assertUnidentified(openbis1, 'HCS_IMAGE')
self.assertUnidentified(openbis1, 'HCS_IMAGE_ANALYSIS_DATA')
content = util.getContent("%s/data/store/1/%s/original/nemo.exp1_MICROX-3VCP1.MICROX-3VCP3.txt"
% (openbis2.installPath, dataSets[-1].location))
self.assertEquals("parent data set content", ['hello world'], content)
self.assertDropBoxDrop(openbis2, 'drop-box1')
self.assertDropBoxDrop(openbis2, 'drop-box2')
def assertDropBoxDrop(self, openbisController, dropbox):
path = "%s/data/%s" % (openbisController.installPath, dropbox)
content = util.getContent("%s/%s" % (path, os.listdir(path)[0]))
self.assertEquals("Content of %s" % dropbox, ['hello world'], content)
def assertUnidentified(self, openbisController, type):
path = "%s/data/store/1/unidentified/DataSetType_%s" % (openbisController.installPath, type)
n = util.getNumberOfDifferences("%s/UnknownPlate" % TEST_DATA, "%s/%s" % (path, os.listdir(path)[0]))
if n > 0:
self.fail("unidentified data set of type %s not as expected" % type)
def getDataSetByCode(self, dataSets, code):
for dataSet in dataSets:
if dataSet.code == code:
return dataSet
self.fail("No data set with code %s found." % code)
TestCase(settings, __file__).runTest()
\ No newline at end of file
......@@ -16,7 +16,7 @@ class TestCase(systemtest.testcase.TestCase):
openbisController.assertEmptyFolder('data/incoming-analysis');
openbisController.assertEmptyFolder('data/incoming-images-merged-channels');
openbisController.assertEmptyFolder('data/incoming-images-split-channels');
openbisController.assertNumberOfDataSets(3)
openbisController.assertNumberOfDataSets(3, openbisController.getDataSets())
self.assertSpotSizes(openbisController, [['24', '16'], ['24', '16']])
self.assertFeatureVectorLabel(openbisController, 'HITRATE', 'Hit Rate')
self.assertFeatureVectorLabel(openbisController, 'CELLNUMBER', 'cellNumber')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment