class TestHdfList(TestCase): def setup_method(self, method): TestCase.setup_method(self, method) self.mox = Mox() def hdfpath(self): tmpdir = self.tmpdir() return path(tmpdir) / "test.h5" def testLocking(self, monkeypatch): lock1 = threading.RLock() hdflist2 = HdfList() lock2 = threading.RLock() tmp = str(self.hdfpath()) # Using HDFLIST hdf1 = HdfStorage(tmp, lock1) # There are multiple guards against opening the same HDF5 file # PyTables includes a check monkeypatch.setattr(storage_module, 'HDFLIST', hdflist2) with pytest.raises(ValueError) as exc_info: HdfStorage(tmp, lock2) assert exc_info.value.message.startswith( "The file '%s' is already opened. " % tmp) monkeypatch.undo() # HdfList uses portalocker, test by mocking tables.open_file if hasattr(tables, "open_file"): self.mox.StubOutWithMock(tables, 'open_file') tables.file._FILE_OPEN_POLICY = 'default' tables.open_file(tmp, mode='w', title='OMERO HDF Measurement Storage', rootUEP='/').AndReturn(open(tmp)) self.mox.ReplayAll() else: self.mox.StubOutWithMock(tables, 'openFile') tables.openFile(tmp, mode='w', title='OMERO HDF Measurement Storage', rootUEP='/').AndReturn(open(tmp)) monkeypatch.setattr(storage_module, 'HDFLIST', hdflist2) with pytest.raises(omero.LockTimeout) as exc_info: HdfStorage(tmp, lock2) print exc_info.value assert ( exc_info.value.message == 'Cannot acquire exclusive lock on: %s' % tmp) monkeypatch.undo() hdf1.cleanup() self.mox.UnsetStubs() self.mox.VerifyAll()
class AbstractCLITest(ITest): def setup_method(self, method): super(AbstractCLITest, self).setup_method(method) self.cli = CLI() self.cli.register("sessions", SessionsControl, "TEST") def setup_mock(self): self.mox = Mox() def teardown_mock(self): self.mox.UnsetStubs() self.mox.VerifyAll()
class AbstractCLITest(ITest): @classmethod def setup_class(cls): super(AbstractCLITest, cls).setup_class() cls.cli = CLI() cls.cli.register("sessions", SessionsControl, "TEST") def setup_mock(self): self.mox = Mox() def teardown_mock(self): self.mox.UnsetStubs() self.mox.VerifyAll()
class AbstractCLITest(ITest): warnings.warn("Deprecated in 5.4.2." "Use omero.testlib.cli", DeprecationWarning) @classmethod def setup_class(cls): super(AbstractCLITest, cls).setup_class() cls.cli = CLI() cls.cli.register("sessions", SessionsControl, "TEST") def setup_mock(self): self.mox = Mox() def teardown_mock(self): self.mox.UnsetStubs() self.mox.VerifyAll()
class TxBase(object): def setup_method(self, method): self.mox = Mox() self.client = self.mox.CreateMock(BaseClient) self.sf = self.mox.CreateMock(ServiceFactoryPrx) self.query = self.mox.CreateMock(IQueryPrx) self.update = self.mox.CreateMock(IUpdatePrx) self.client.sf = self.sf self.cli = MockCLI() self.cli._client = self.client self.cli.set("tx.state", TxState(self.cli)) def teardown_method(self, method): self.mox.UnsetStubs() self.mox.VerifyAll() def queries(self, obj): self.sf.getQueryService().AndReturn(self.query) self.query.get(IgnoreArg(), IgnoreArg(), IgnoreArg()).AndReturn(obj) def saves(self, obj): self.sf.getUpdateService().AndReturn(self.update) self.update.saveAndReturnObject(IgnoreArg()).AndReturn(obj)
class TestDatabase(object): def setup_method(self, method): self.cli = CLI() self.cli.register("db", DatabaseControl, "TEST") self.args = ["db"] dir = path(__file__) / ".." / ".." / ".." / ".." / ".." / ".." /\ ".." / "dist" # FIXME: should not be hard-coded dir = dir.abspath() cfg = dir / "etc" / "omero.properties" cfg = cfg.abspath() self.cli.dir = dir self.data = {} for line in cfg.text().split("\n"): line = line.strip() for x in ("version", "patch"): key = "omero.db." + x if line.startswith(key): self.data[x] = line[len(key) + 1:] self.file = create_path() self.script_file = "%(version)s__%(patch)s.sql" % self.data if os.path.isfile(self.script_file): os.rename(self.script_file, self.script_file + '.bak') assert not os.path.isfile(self.script_file) self.mox = Mox() self.mox.StubOutWithMock(getpass, 'getpass') self.mox.StubOutWithMock(__builtin__, "raw_input") def teardown_method(self, method): self.file.remove() if os.path.isfile(self.script_file): os.remove(self.script_file) if os.path.isfile(self.script_file + '.bak'): os.rename(self.script_file + '.bak', self.script_file) self.mox.UnsetStubs() self.mox.VerifyAll() def password(self, string, strict=True): self.cli.invoke("db password " + string % self.data, strict=strict) def testHelp(self): self.args += ["-h"] self.cli.invoke(self.args, strict=True) @pytest.mark.parametrize('subcommand', DatabaseControl().get_subcommands()) def testSubcommandHelp(self, subcommand): self.args += [subcommand, "-h"] self.cli.invoke(self.args, strict=True) def testBadVersionDies(self): with pytest.raises(NonZeroReturnCode): self.cli.invoke("db script NONE NONE pw", strict=True) def testPasswordIsAskedForAgainIfDiffer(self): self.expectPassword("ome") self.expectConfirmation("bad") self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.password("") def testPasswordIsAskedForAgainIfEmpty(self): self.expectPassword("") self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.password("") @pytest.mark.parametrize('no_salt', ['', '--no-salt']) @pytest.mark.parametrize('user_id', ['', '0', '1']) @pytest.mark.parametrize('password', ['', 'ome']) def testPassword(self, user_id, password, no_salt, capsys): args = "" if user_id: args += "--user-id=%s " % user_id if no_salt: args += "%s " % no_salt if password: args += "%s" % password else: self.expectPassword("ome", id=user_id) self.expectConfirmation("ome", id=user_id) self.mox.ReplayAll() self.password(args) out, err = capsys.readouterr() assert out.strip() == self.password_output(user_id, no_salt) @pytest.mark.parametrize('file_arg', ['', '-f', '--file']) @pytest.mark.parametrize('no_salt', ['', '--no-salt']) @pytest.mark.parametrize('password', ['', '--password ome']) def testScript(self, no_salt, file_arg, password, capsys): """ Recommended usage of db script """ args = "db script " + password if no_salt: args += " %s" % no_salt if file_arg: args += " %s %s" % (file_arg, str(self.file)) output = self.file else: output = self.script_file if not password: self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.cli.invoke(args, strict=True) out, err = capsys.readouterr() assert 'Using %s for version' % self.data['version'] in err assert 'Using %s for patch' % self.data['patch'] in err if password: assert 'Using password from commandline' in err with open(output) as f: lines = f.readlines() for line in lines: if line.startswith('insert into password values (0'): assert line.strip() == self.script_output(no_salt) @pytest.mark.parametrize('file_arg', ['', '-f', '--file']) @pytest.mark.parametrize('no_salt', ['', '--no-salt']) @pytest.mark.parametrize( 'pos_args', ['%s %s %s', '--version %s --patch %s --password %s']) def testScriptDeveloperArgs(self, pos_args, no_salt, file_arg, capsys): """ Deprecated and developer usage of db script """ arg_values = ('VERSION', 'PATCH', 'PASSWORD') args = "db script " + pos_args % arg_values if no_salt: args += " %s" % no_salt if file_arg: args += " %s %s" % (file_arg, str(self.file)) self.file else: self.script_file self.mox.ReplayAll() with pytest.raises(NonZeroReturnCode): self.cli.invoke(args, strict=True) out, err = capsys.readouterr() assert 'Using %s for version' % (arg_values[0]) in err assert 'Using %s for patch' % (arg_values[1]) in err assert 'Using password from commandline' in err assert 'Invalid Database version/patch' in err def password_ending(self, user, id): if id and id != '0': rv = "user %s: " % id else: rv = "%s user: "******"password for OMERO " + rv def expectPassword(self, pw, user="******", id=None): getpass.getpass("Please enter %s" % self.password_ending(user, id)).AndReturn(pw) def expectConfirmation(self, pw, user="******", id=None): getpass.getpass("Please re-enter %s" % self.password_ending(user, id)).AndReturn(pw) def password_output(self, user_id, no_salt): update_msg = "UPDATE password SET hash = \'%s\'" \ " WHERE experimenter_id = %s;" if not user_id: user_id = "0" return update_msg % (hash_map[(user_id, no_salt)], user_id) def script_output(self, no_salt): root_password_msg = "insert into password values (0,\'%s\');" return root_password_msg % (hash_map[("0", no_salt)])
class TestDatabase(object): def setup_method(self, method): self.cli = CLI() self.cli.register("db", DatabaseControl, "TEST") dir = path(__file__) / ".." / ".." / ".." / ".." / ".." / ".." /\ ".." / "dist" # FIXME: should not be hard-coded dir = dir.abspath() cfg = dir / "etc" / "omero.properties" cfg = cfg.abspath() self.cli.dir = dir self.data = {} for line in cfg.text().split("\n"): line = line.strip() for x in ("version", "patch"): key = "omero.db." + x if line.startswith(key): self.data[x] = line[len(key) + 1:] self.file = create_path() self.script_file = "%(version)s__%(patch)s.sql" % self.data if os.path.isfile(self.script_file): os.rename(self.script_file, self.script_file + '.bak') assert not os.path.isfile(self.script_file) self.mox = Mox() self.mox.StubOutWithMock(getpass, 'getpass') self.mox.StubOutWithMock(__builtin__, "raw_input") def teardown_method(self, method): self.file.remove() if os.path.isfile(self.script_file): os.remove(self.script_file) if os.path.isfile(self.script_file + '.bak'): os.rename(self.script_file + '.bak', self.script_file) self.mox.UnsetStubs() self.mox.VerifyAll() def password(self, string, strict=True): self.cli.invoke("db password " + string % self.data, strict=strict) def testBadVersionDies(self): with pytest.raises(NonZeroReturnCode): self.cli.invoke("db script NONE NONE pw", strict=True) def testPasswordIsAskedForAgainIfDiffer(self): self.expectPassword("ome") self.expectConfirmation("bad") self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.password("") def testPasswordIsAskedForAgainIfEmpty(self): self.expectPassword("") self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.password("") @pytest.mark.parametrize('no_salt', ['', '--no-salt']) @pytest.mark.parametrize('user_id', ['', '0', '1']) @pytest.mark.parametrize('password', ['', 'ome']) def testPassword(self, user_id, password, no_salt, capsys): args = "" if user_id: args += "--user-id=%s " % user_id if no_salt: args += "%s " % no_salt if password: args += "%s" % password else: self.expectPassword("ome", id=user_id) self.expectConfirmation("ome", id=user_id) self.mox.ReplayAll() self.password(args) out, err = capsys.readouterr() assert out.strip() == self.password_output(user_id, no_salt) @pytest.mark.parametrize('file_arg', ['', '-f', '--file']) @pytest.mark.parametrize('no_salt', ['', '--no-salt']) @pytest.mark.parametrize('pos_input', [ "", "%(version)s", "%(version)s %(patch)s", "%(version)s %(patch)s ome" ]) def testScript(self, pos_input, no_salt, file_arg): args = "db script " args += pos_input if no_salt: args += " %s" % no_salt if file_arg: args += " %s %s" % (file_arg, str(self.file)) output = self.file else: output = self.script_file if "version" not in pos_input or "patch" not in pos_input: self.expectVersion(self.data["version"]) self.expectPatch(self.data["patch"]) if "ome" not in pos_input: self.expectPassword("ome") self.expectConfirmation("ome") self.mox.ReplayAll() self.cli.invoke(args % self.data, strict=True) with open(output) as f: lines = f.readlines() for line in lines: if line.startswith('insert into password values (0'): assert line.strip() == self.script_output(no_salt) def password_ending(self, user, id): if id and id != '0': rv = "user %s: " % id else: rv = "%s user: "******"password for OMERO " + rv def expectPassword(self, pw, user="******", id=None): getpass.getpass("Please enter %s" % self.password_ending(user, id)).AndReturn(pw) def expectConfirmation(self, pw, user="******", id=None): getpass.getpass("Please re-enter %s" % self.password_ending(user, id)).AndReturn(pw) def expectVersion(self, version): raw_input("Please enter omero.db.version [%s]: " % self.data["version"]).AndReturn(version) def expectPatch(self, patch): raw_input("Please enter omero.db.patch [%s]: " % self.data["patch"]).AndReturn(patch) def password_output(self, user_id, no_salt): update_msg = "UPDATE password SET hash = \'%s\'" \ " WHERE experimenter_id = %s;" if not user_id: user_id = "0" return update_msg % (hash_map[(user_id, no_salt)], user_id) def script_output(self, no_salt): root_password_msg = "insert into password values (0,\'%s\');" return root_password_msg % (hash_map[("0", no_salt)])