def icatconfig(setupicat, testConfig, request):
    client, conf, config = getConfig(ids="mandatory")
    mainbase = request.config.getini('mainstoragebase')
    archivebase = request.config.getini('archivestoragebase')
    conf.cmdargs.append("--mainStorageBase=%s" % mainbase)
    conf.cmdargs.append("--archiveStorageBase=%s" % archivebase)
    incomingbase = request.config.getini('incomingbase')
    proposaldir = os.path.join(incomingbase, testProposalNo.replace('/', '_'))
    os.mkdir(proposaldir)
    conf.proposaldir = proposaldir

    def cleanup():
        shutil.rmtree(proposaldir)
        client.login(conf.auth, conf.credentials)
        query = Query(client,
                      "Dataset",
                      conditions={"name": "LIKE '%s-%%'" % testDatasetPrefix})
        wipe_data(client, query)
        query.setLimit((0, 500))
        while True:
            objs = client.search(query)
            if not objs:
                break
            client.deleteMany(objs)
        client.logout()

    if testConfig.cleanup:
        request.addfinalizer(cleanup)
    return (conf, config)
Пример #2
0
def test_download(tmpdirsec, client, case, method):
    conf = getConfig(confSection=case['dluser'])
    if len(case['dfs']) > 1:
        zfname = os.path.join(tmpdirsec.dir, "%s.zip" % case['dsname'])
        print("\nDownload %s to file %s" % (case['dsname'], zfname))
        args = conf.cmdargs + [ '--outputfile', zfname, 
                                case['invname'], case['dsname'], method ]
        callscript("downloaddata.py", args)
        zf = zipfile.ZipFile(zfname, 'r')
        zinfos = zf.infolist()
        assert len(zinfos) == len(case['dfs'])
        for df in case['dfs']:
            zi = None
            for i in zinfos:
                if i.filename.endswith(df['dfname']):
                    zi = i
                    break
            assert zi is not None
            assert "%x" % (zi.CRC & 0xffffffff) == df['testfile'].crc32
            assert zi.file_size == df['testfile'].size
    elif len(case['dfs']) == 1:
        df = case['dfs'][0]
        dfname = os.path.join(tmpdirsec.dir, "dl_%s" % df['dfname'])
        print("\nDownload %s to file %s" % (case['dsname'], dfname))
        args = conf.cmdargs + [ '--outputfile', dfname, 
                                case['invname'], case['dsname'], method ]
        callscript("downloaddata.py", args)
        assert filecmp.cmp(df['testfile'].fname, dfname)
    else:
        raise RuntimeError("No datafiles for dataset %s" % case['dsname'])
Пример #3
0
def test_add_relateddatafile(data, user, rdfname):
    client, conf = getConfig(confSection=user)
    client.login(conf.auth, conf.credentials)
    rdfdata = data['related_datafiles'][rdfname]
    rdf = client.new("relatedDatafile")
    initobj(rdf, rdfdata)
    rdf.sourceDatafile = get_datafile(client, rdfdata['source'])
    rdf.destDatafile = create_datafile(client, data, rdfdata['dest'])
    rdf.create()
Пример #4
0
def test_add_publication(data, user, pubname):
    client, conf = getConfig(confSection=user)
    client.login(conf.auth, conf.credentials)
    pubdata = data['publications'][pubname]
    publication = client.new("publication")
    initobj(publication, pubdata)
    query = "Investigation [name='%s']" % pubdata['investigation']
    publication.investigation = client.assertedSearch(query)[0]
    publication.create()
Пример #5
0
def client(setupicat, request):
    conf = getConfig(ids="mandatory")
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    def cleanup():
        query = "SELECT df FROM Datafile df WHERE df.location IS NOT NULL"
        client.deleteData(client.search(query))
    request.addfinalizer(cleanup)
    return client
Пример #6
0
def test_add_relateddatafile(data, user, rdfname):
    conf = getConfig(confSection=user)
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    rdfdata = data['related_datafiles'][rdfname]
    rdf = client.new("relatedDatafile")
    initobj(rdf, rdfdata)
    rdf.sourceDatafile = get_datafile(client, rdfdata['source'])
    rdf.destDatafile = create_datafile(client, data, rdfdata['dest'])
    rdf.create()
def test_clone_ids(setupicat):
    """Same as above, but configure ids this time.
    """
    client, conf = getConfig(ids="mandatory")
    clone = client.clone()
    assert isinstance(clone, icat.client.Client)
    assert clone.url == client.url
    assert clone.ids.url == client.ids.url
    assert clone.kwargs == client.kwargs
    assert clone.apiversion == client.apiversion
def test_clone_minimal(setupicat):
    """Clone a simple client.  Not logged in, no ids.
    """
    client, conf = getConfig(ids=False)
    clone = client.clone()
    assert isinstance(clone, icat.client.Client)
    assert clone.url == client.url
    assert clone.ids is None
    assert clone.kwargs == client.kwargs
    assert clone.apiversion == client.apiversion
Пример #9
0
def test_add_publication(data, user, pubname):
    conf = getConfig(confSection=user)
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    pubdata = data['publications'][pubname]
    publication = client.new("publication")
    initobj(publication, pubdata)
    query = "Investigation [name='%s']" % pubdata['investigation']
    publication.investigation = client.assertedSearch(query)[0]
    publication.create()
Пример #10
0
def client(setupicat, request):
    conf = getConfig(ids="mandatory")
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)

    def cleanup():
        query = "SELECT df FROM Datafile df WHERE df.location IS NOT NULL"
        client.deleteData(client.search(query))

    request.addfinalizer(cleanup)
    return client
Пример #11
0
def test_check_summary_user(tmpdirsec, user):
    """Check the number of objects from a user's point of view.

    This checks which objects a given user may see and thus whether
    the (read) access rules work as expected.
    """
    summary = os.path.join(tmpdirsec, "summary.%s" % user)
    ref = refsummary[user]
    _, conf = getConfig(confSection=user)
    with open(summary, "wt") as out:
        callscript("icatsummary.py", conf.cmdargs, stdout=out)
    assert filecmp.cmp(ref, summary), "ICAT content was not as expected"
def test_client_sslContext_kwarg(setupicat):
    """Set the `sslContext` keyword argument to the Client constructor.
    Issue #34.
    """
    _, conf = getConfig()
    kwargs = getClientKWargs(conf)
    sslverify = kwargs.pop('checkCert', True)
    cafile = kwargs.pop('caFile', None)
    capath = kwargs.pop('caPath', None)
    kwargs['sslContext'] = create_ssl_context(sslverify, cafile, capath)
    client = icat.Client(conf.url, **kwargs)
    client.login(conf.auth, conf.credentials)
Пример #13
0
def test_check_summary_user(tmpdirsec, user):
    """Check the number of objects from a user's point of view.

    This checks which objects a given user may see and thus whether
    the (read) access rules work as expected.
    """
    summary = os.path.join(tmpdirsec.dir, "summary.%s" % user)
    ref = refsummary[user]
    conf = getConfig(confSection=user)
    with open(summary, "wt") as out:
        callscript("icatsummary.py", conf.cmdargs, stdout=out)
    assert filecmp.cmp(ref, summary), "ICAT content was not as expected"
Пример #14
0
def test_get_icat_version():
    """Query the version from the test ICAT server.

    This implicitly tests that the test ICAT server is properly
    configured and that we can connect to it.
    """

    client, conf, _ = getConfig(needlogin=False, ids=False)
    # python-icat supports ICAT server 4.2 or newer.  But actually, we
    # just want to check that client.apiversion is set and supports
    # comparison with version strings.
    assert client.apiversion >= '4.2'
    print("\nConnect to %s\nICAT version %s\n" % (conf.url, client.apiversion))
Пример #15
0
def client(setupicat, testConfig, request):
    client, conf, _ = getConfig(ids="mandatory")
    client.login(conf.auth, conf.credentials)
    def cleanup():
        query = Query(client, "Dataset", conditions={
            "name": "LIKE '%s-%%'" % testDatasetName
        })
        wipe_data(client, query)
        client.deleteMany(client.search(query))
        client.logout()
    if testConfig.cleanup:
        request.addfinalizer(cleanup)
    createDatasets(client, testConfig)
    return client
Пример #16
0
def test_add_study(data, user, studyname):
    client, conf = getConfig(confSection=user)
    client.login(conf.auth, conf.credentials)
    studydata = data['studies'][studyname]
    study = client.new("study")
    initobj(study, studydata)
    query = "User [name='%s']" % data['users'][studydata['user']]['name']
    study.user = client.assertedSearch(query)[0]
    for invname in studydata['investigations']:
        query = "Investigation [name='%s']" % invname
        si = client.new("studyInvestigation")
        si.investigation = client.assertedSearch(query)[0]
        study.studyInvestigations.append(si)
    study.create()
Пример #17
0
def test_get_icat_version():
    """Query the version from the test ICAT server.

    This implicitly tests that the test ICAT server is properly
    configured and that we can connect to it.
    """

    conf = getConfig(needlogin=False)
    client = icat.Client(conf.url, **conf.client_kwargs)
    # python-icat supports ICAT server 4.2 or newer.  But actually, we
    # just want to check that client.apiversion is set and supports
    # comparison with version strings.
    assert client.apiversion >= '4.2'
    print("\nConnect to %s\nICAT version %s\n" % (conf.url, client.apiversion))
Пример #18
0
def test_get_ids_version():
    """Query the version from the test IDS server.

    This implicitly tests that the test ICAT and IDS servers are
    properly configured and that we can connect to them.
    """

    client, conf, _ = getConfig(needlogin=False, ids="mandatory")
    # python-icat supports all publicly released IDS server version,
    # e.g. 1.0.0 or newer.  But actually, we just want to check that
    # client.apiversion is set and supports comparison with version
    # strings.
    assert client.ids.apiversion >= '1.0.0'
    print("\nConnect to %s\nIDS version %s\n" 
          % (conf.idsurl, client.ids.apiversion))
Пример #19
0
def test_add_study(data, user, studyname):
    pytest.skip("Study disabled, see Issue icatproject/icat.server#155")
    conf = getConfig(confSection=user)
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    studydata = data['studies'][studyname]
    study = client.new("study")
    initobj(study, studydata)
    query = "User [name='%s']" % studydata['user']
    study.user = client.assertedSearch(query)[0]
    for invname in studydata['investigations']:
        query = "Investigation [name='%s']" % invname
        si = client.new("studyInvestigation")
        si.investigation = client.assertedSearch(query)[0]
        study.studyInvestigations.append(si)
    study.create()
def test_client_set_transport(setupicat):
    """Try setting a custom transport in the client using set_options().
    See Issue #33 why this is relevant.
    """
    _, conf = getConfig()
    kwargs = getClientKWargs(conf)
    client = icat.Client(conf.url, **kwargs)
    proxy = {}
    if conf.http_proxy:
        proxy['http'] = config.http_proxy
    if conf.https_proxy:
        proxy['https'] = config.https_proxy
    transport = MyHTTPSTransport(client.sslContext, proxy=proxy)
    client.set_options(transport=transport)
    client.login(conf.auth, conf.credentials)
    assert transport.sendCounter >= 1
Пример #21
0
def test_get_ids_version():
    """Query the version from the test IDS server.

    This implicitly tests that the test ICAT and IDS servers are
    properly configured and that we can connect to them.
    """

    conf = getConfig(needlogin=False, ids="mandatory")
    client = icat.Client(conf.url, **conf.client_kwargs)
    # python-icat supports all publicly released IDS server version,
    # e.g. 1.0.0 or newer.  But actually, we just want to check that
    # client.apiversion is set and supports comparison with version
    # strings.
    assert client.ids.apiversion >= '1.0.0'
    print("\nConnect to %s\nIDS version %s\n" 
          % (conf.idsurl, client.ids.apiversion))
Пример #22
0
def test_add_study(data, user, studyname):
    pytest.skip("Study disabled, see Issue icatproject/icat.server#155")
    conf = getConfig(confSection=user)
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    studydata = data['studies'][studyname]
    study = client.new("study")
    initobj(study, studydata)
    query = "User [name='%s']" % studydata['user']
    study.user = client.assertedSearch(query)[0]
    for invname in studydata['investigations']:
        query = "Investigation [name='%s']" % invname
        si = client.new("studyInvestigation")
        si.investigation = client.assertedSearch(query)[0]
        study.studyInvestigations.append(si)
    study.create()
def test_equality_client(client):
    """Test that objects that belong to different clients are never equal.

    There used to be a bug such that the client was not taken into
    account, fixed in c9a1be6.
    """
    # Get a second client that is connected to the same server.
    client2, _ = getConfig(needlogin=False)
    u1 = client.new("user", id=728, name="u_a")
    u2 = client2.new("user", id=728, name="u_a")
    # u1 and u2 have all attributes, including the id the same.
    assert u1.id == u2.id
    assert u1.name == u2.name
    # But they belong to different client instances and thus, they are
    # still not equal.
    assert u1 != u2
    assert not (u1 == u2)
Пример #24
0
def test_equality_client(client):
    """Test that objects that belong to different clients are never equal.

    There used to be a bug such that the client was not taken into
    account, fixed in c9a1be6.
    """
    # Get a second client that is connected to the same server.
    conf = getConfig(needlogin=False)
    client2 = icat.Client(conf.url, **conf.client_kwargs)
    u1 = client.new("user", id=728, name="u_a")
    u2 = client2.new("user", id=728, name="u_a")
    # u1 and u2 have all attributes, including the id the same.
    assert u1.id == u2.id
    assert u1.name == u2.name
    # But they belong to different client instances and thus, they are
    # still not equal.
    assert u1 != u2
    assert not (u1 == u2)
Пример #25
0
def icatconfig(setupicat, testConfig, request):
    client, conf, config = getConfig(ids="mandatory")
    client.login(conf.auth, conf.credentials)
    mainbase = request.config.getini('mainstoragebase')
    archivebase = request.config.getini('archivestoragebase')
    conf.cmdargs.append("--mainStorageBase=%s" % mainbase)
    conf.cmdargs.append("--archiveStorageBase=%s" % archivebase)
    incomingbase = request.config.getini('incomingbase')
    proposaldir = os.path.join(incomingbase, testProposalNo.replace('/', '_'))
    os.mkdir(proposaldir)
    conf.proposaldir = proposaldir

    def cleanup():
        os.rmdir(proposaldir)
        client.logout()

    if testConfig.cleanup:
        request.addfinalizer(cleanup)
    return (client, conf, config)
Пример #26
0
def test_login(user):
    """Login to the ICAT server.
    """

    client, conf = getConfig(confSection=user)
    sessionId = client.login(conf.auth, conf.credentials)
    assert sessionId
    assert sessionId == client.sessionId
    username = client.getUserName()
    assert username == "%s/%s" % (conf.auth, user)
    print("\nLogged in as %s to %s." % (user, conf.url))
    client.logout()
    assert client.sessionId is None

    # Verify that the logout was effective, e.g. that the sessionId is
    # invalidated.
    with tmpSessionId(client, sessionId):
        with pytest.raises(icat.exception.ICATSessionError):
            username = client.getUserName()
Пример #27
0
def test_upload(tmpdirsec, client, case):
    f = DummyDatafile(tmpdirsec.dir, 
                      case['dfname'], case['size'], case['mtime'])
    print("\nUpload file %s" % case['dfname'])
    conf = getConfig(confSection=case['uluser'])
    args = conf.cmdargs + [case['invname'], case['dsname'], 
                           case['dfformat'], f.fname]
    callscript("addfile.py", args)
    query = Query(client, "Datafile", conditions={
        "name": "= '%s'" % case['dfname'],
        "dataset.name": "= '%s'" % case['dsname'],
        "dataset.investigation.name": "= '%s'" % case['invname'],
    })
    df = client.assertedSearch(query)[0]
    assert df.location is not None
    assert df.fileSize == f.size
    assert df.checksum == f.crc32
    if f.mtime:
        assert df.datafileModTime == f.mtime
    case['testfile'] = f
Пример #28
0
def icatconfig(setupicat, testConfig, request):
    client, conf, config = getConfig(ids="mandatory")

    def cleanup():
        client.login(conf.auth, conf.credentials)
        query = Query(client,
                      "Dataset",
                      conditions={"name": "LIKE '%s-%%'" % testDatasetName})
        wipe_data(client, query)
        query.setLimit((0, 500))
        while True:
            objs = client.search(query)
            if not objs:
                break
            client.deleteMany(objs)
        client.logout()

    if testConfig.cleanup:
        request.addfinalizer(cleanup)
    return (client, conf, config)
Пример #29
0
def test_login(user):
    """Login to the ICAT server.
    """

    conf = getConfig(confSection=user)
    client = icat.Client(conf.url, **conf.client_kwargs)
    sessionId = client.login(conf.auth, conf.credentials)
    assert sessionId
    assert sessionId == client.sessionId
    username = client.getUserName()
    assert username == user
    print("\nLogged in as %s to %s." % (user, conf.url))
    client.logout()
    assert client.sessionId is None

    # Verify that the logout was effective, e.g. that the sessionId is
    # invalidated.
    with tmpSessionId(client, sessionId):
        with pytest.raises(icat.exception.ICATSessionError):
            username = client.getUserName()
Пример #30
0
def test_upload(tmpdirsec, client, case):
    f = DummyDatafile(tmpdirsec.dir, case['dfname'], case['size'],
                      case['mtime'])
    print("\nUpload file %s" % case['dfname'])
    conf = getConfig(confSection=case['uluser'])
    args = conf.cmdargs + [
        case['invname'], case['dsname'], case['dfformat'], f.fname
    ]
    callscript("addfile.py", args)
    query = Query(client,
                  "Datafile",
                  conditions={
                      "name": "= '%s'" % case['dfname'],
                      "dataset.name": "= '%s'" % case['dsname'],
                      "dataset.investigation.name": "= '%s'" % case['invname'],
                  })
    df = client.assertedSearch(query)[0]
    assert df.location is not None
    assert df.fileSize == f.size
    assert df.checksum == f.crc32
    if f.mtime:
        assert df.datafileModTime == f.mtime
    case['testfile'] = f
def test_clone_login(setupicat):
    """Clone a client that is logged in.

    The clone should not share the session.  Original client and clone
    should be able to login and out without interfering the other.
    """
    client, conf = getConfig()
    client.login(conf.auth, conf.credentials)
    clone = client.clone()
    assert clone.url == client.url
    assert clone.kwargs == client.kwargs
    assert clone.apiversion == client.apiversion
    assert clone.sessionId is None, "the clone must not inherit the session"
    # The clone may start it's own session
    clone.login(conf.auth, conf.credentials)
    assert clone.sessionId
    assert clone.sessionId != client.sessionId
    # both are still logged in as the same user
    assert clone.getUserName() == client.getUserName()
    # Now logout the clone.  This must not affect the client's session.
    clone.logout()
    assert clone.sessionId is None
    assert client.sessionId
Пример #32
0
def test_addjob(user, jobname):
    _, conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, jobname]
    callscript("add-job.py", args)
Пример #33
0
def test_addinvdata(user, invname):
    _, conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, invname]
    callscript("add-investigation-data.py", args)
Пример #34
0
def test_create_sampletype(user, sample):
    _, conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, sample]
    callscript("create-sampletype.py", args)
Пример #35
0
def client():
    conf = getConfig(needlogin=False)
    client = icat.Client(conf.url, **conf.client_kwargs)
    return client
Пример #36
0
    assert df.location is not None
    assert df.fileSize == f.size
    assert df.checksum == f.crc32
    if f.mtime:
        assert df.datafileModTime == f.mtime
    case['testfile'] = f


@pytest.fixture(scope='function', params=["getData", "getPreparedData"])
def method(request):
    return request.param


@pytest.mark.parametrize(("case"), markeddatasets)
def test_download(tmpdirsec, client, case, method):
    conf = getConfig(confSection=case['dluser'])
    if len(case['dfs']) > 1:
        zfname = os.path.join(tmpdirsec.dir, "%s.zip" % case['dsname'])
        print("\nDownload %s to file %s" % (case['dsname'], zfname))
        args = conf.cmdargs + [
            '--outputfile', zfname, case['invname'], case['dsname'], method
        ]
        callscript("downloaddata.py", args)
        zf = zipfile.ZipFile(zfname, 'r')
        zinfos = zf.infolist()
        assert len(zinfos) == len(case['dfs'])
        for df in case['dfs']:
            zi = None
            for i in zinfos:
                if i.filename.endswith(df['dfname']):
                    zi = i
Пример #37
0
def test_create_investigation(invname):
    _, conf = getConfig(confSection="useroffice")
    args = conf.cmdargs + [testinput, invname]
    callscript("create-investigation.py", args)
Пример #38
0
def test_create_investigation(invname):
    conf = getConfig(confSection="useroffice")
    args = conf.cmdargs + [testinput, invname]
    callscript("create-investigation.py", args)
Пример #39
0
def client():
    conf = getConfig(needlogin=False)
    client = icat.Client(conf.url, **conf.client_kwargs)
    return client
Пример #40
0
def test_addjob(user, jobname):
    conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, jobname]
    callscript("add-job.py", args)
Пример #41
0
def client(setupicat):
    client, conf = getConfig()
    client.login(conf.auth, conf.credentials)
    return client
def client(setupicat):
    client, conf = getConfig(confSection="nbour")
    client.login(conf.auth, conf.credentials)
    return client
Пример #43
0
def test_getversion():
    """Get version info from the ICAT server.
    """
    conf = getConfig(needlogin=False)
    callscript("getversion.py", conf.cmdargs)
Пример #44
0
def test_login(user):
    """Login to the ICAT server.
    """
    conf = getConfig(confSection=user)
    callscript("login.py", conf.cmdargs)
Пример #45
0
def test_addinvdata(user, invname):
    conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, invname]
    callscript("add-investigation-data.py", args)
Пример #46
0
def test_getversion():
    """Get version info from the ICAT server.
    """
    _, conf = getConfig(needlogin=False)
    callscript("getversion.py", conf.cmdargs)
Пример #47
0
def test_create_sampletype(user, sample):
    conf = getConfig(confSection=user)
    args = conf.cmdargs + [testinput, sample]
    callscript("create-sampletype.py", args)
Пример #48
0
def test_login(user):
    """Login to the ICAT server.
    """
    _, conf = getConfig(confSection=user)
    callscript("login.py", conf.cmdargs)
Пример #49
0
def conf(setupicat):
    return getConfig(confSection="acord", ids="mandatory")
Пример #50
0
def conf(setupicat):
    return getConfig(confSection="acord", ids="mandatory")
Пример #51
0
def client(setupicat):
    conf = getConfig()
    client = icat.Client(conf.url, **conf.client_kwargs)
    client.login(conf.auth, conf.credentials)
    return client
Пример #52
0
def client(setupicat):
    client, conf = getConfig(confSection="acord", ids="mandatory")
    client.login(conf.auth, conf.credentials)
    return client
Пример #53
0
def cmdargs(setupicat):
    _, conf = getConfig(confSection="acord", ids="mandatory")
    return conf.cmdargs + ["-f", "XML"]
Пример #54
0
def checker():
    conf = getConfig(needlogin=False)
    client = icat.Client(conf.url, **conf.client_kwargs)
    return ICATChecker(client)