Example #1
0
def test_execute_outputs(test_env):
    "Specify program content type on spec and instantiation."
    obj = ["1", 2.0, {'a': 42}]

    test_env.start(1)
    with test_env.client.new_session() as s:

        # No content type
        t1a = tasks.execute(
            ["cat", Input("somefile", dataobj=pickled(obj))], stdout=Output())
        t1a.output.keep()
        # Static content-type by instantiation
        t1b = tasks.execute(
            ["cat", Input("somefile", dataobj=pickled(obj))],
            stdout=Output(content_type='pickle'))
        t1b.output.keep()
        # Stdin specification
        t1c = tasks.execute(["cat"],
                            stdin=Input("somefile", dataobj=pickled(obj)),
                            stdout=Output(content_type='pickle'))
        t1c.output.keep()
        # Auto input naming
        t1d = tasks.execute(["cat", Input(dataobj=pickled(obj))],
                            stdout=Output(content_type='pickle'))
        t1d.output.keep()

        s.submit()
        assert t1b.output.fetch().load() == obj
        assert t1c.output.fetch().load() == obj
        assert t1d.output.fetch().load() == obj
        assert t1a.output.content_type is None
        with pytest.raises(RainException):
            t1a.output.fetch().load()
Example #2
0
def test_blob_construction(fake_session):
    with fake_session as session:
        b1 = blob("abc")
        assert b1.session == session

        b2 = blob(b"xyz")
        assert b1.session == session
        assert b1.id != b2.id

        obj = [1, {'a': [4, 5]}]
        b3 = blob(obj, encode='pickle')
        assert pickle.loads(b3.data) == obj
        assert b3.content_type == 'pickle'

        b3b = pickled(obj)
        assert b3b.data == b3.data
        assert b3b.content_type == 'pickle'

        b4 = blob(obj, encode='json')
        assert json.loads(b4.data.decode()) == obj
        assert rain.common.content_type.decode_value(b4.data, "json") == obj

        txt = "asžčďďŠ"
        b5 = blob(txt, encode='text:latin2')
        assert b5.data.decode('latin2') == txt

        with pytest.raises(RainException):
            blob(123)
Example #3
0
def test_program_outputs(test_env):
    "Specify program content type on spec and instantiation."
    obj = ["1", 2.0, {'a': 42}]
    program1 = Program(["cat", Input("i")], stdout="o")
    program2 = Program(["cat", Input("i", content_type='pickle')],
                       stdout=Output(content_type='pickle'))

    test_env.start(1)
    with test_env.client.new_session() as s:
        # Dynamic content-type, forgotten by cat
        t1a = program1(i=pickled(obj))
        t1a.output.keep()
        # Static content-type by instantiation
        t1b = program1(i=pickled(obj), output=Output(content_type='pickle'))
        t1b.output.keep()
        # No content type
        t1c = program1(i=blob(pickle.dumps(obj)))
        t1c.output.keep()
        # Static content-type by Program spec
        t2 = program2(i=pickled(obj))
        t2.output.keep()

        s.submit()
        assert t1a.output.content_type is None
        with pytest.raises(RainException):
            assert t1a.output.fetch().load() == obj
        assert t1a.output.fetch().get_bytes() == pickle.dumps(obj)

        #       TODO(gavento): Needs OutputSpec and Output merging
        #        assert t1b.output.fetch().load() == obj

        assert t1c.output.content_type is None
        with pytest.raises(RainException):
            t1c.output.fetch().load()
        assert t1a.output.fetch().get_bytes() == pickle.dumps(obj)

        assert t2.output.fetch().load() == obj
Example #4
0
def test_input_detailed_specs(test_env):
    "Tests specifying content types for inputs and dynamic content types."

    obj1 = {'A': 2, 'B': [4, 5]}
    obj2 = [1.0, 2.0, True]
    obj4 = ["a", "b"]
    obj5 = {"object": 5}

    def test_gen(ctx, in1, in2, in3, in4, in5, *args, ina="bar", **kwargs):
        assert isinstance(in1, DataInstance)
        assert in1.load() == obj1
        assert in2 == obj2
        assert in3 == (42.0, "foo")
        assert in4.load() == obj4
        assert in5 == obj5
        assert len(args) == 3
        for i in args:
            assert i.content_type == "text-latin2"
            assert i.load() == "ňů"
        assert ina == "barbar"
        assert kwargs['kwA'] == ["A"]
        assert kwargs['kwB'] == ["B"]
        assert kwargs['kwC'] == ["C"]
        assert kwargs['kwD'] == ["D"]

    @remote(
        inputs={
            'in1': Input(content_type='json'),
            'in2': Input(content_type='pickle', load=True),
            'in3':
            Input(load=True),  # expects input tuple (pickle(42.0), "foo")
            # 'in4' only static type 'json'
            # 'in5' has no type and no dataobject input, only python objects
            'args': Input(content_type='text', load=False),
            'ina': Input(load=True, content_type='cbor'),
            'kwargs': Input(load=True),  # dynamic types, different
        },
        outputs=0)
    def test1(ctx, in1, in2, in3, in4, in5, *args, ina="bar", **kwargs):
        test_gen(ctx, in1, in2, in3, in4, in5, *args, ina=ina, **kwargs)

    @remote()
    def test2(
        ctx,
        in1: Input(content_type='json'),
        in2: Input(content_type='pickle', load=True),
        in3: Input(load=True),  # expects input tuple (pickle(42.0), "foo")
        in4,  # static type 'json'
        in5,  # No type and no input, only python objects,
        *args: Input(content_type='text', load=False),
        ina: Input(load=True, content_type='cbor') = "bar",  # for 'ina'
        **kwargs: Input(load=True)  # dynamic types, different
    ) -> 0:
        test_gen(ctx, in1, in2, in3, in4, in5, *args, ina=ina, **kwargs)

    @remote()
    def copied(ctx, obj):
        "simply copy the blob, but does not provide static type info"
        return obj

    test_env.start(1)
    for test in (test1, test2):
        with test_env.client.new_session() as s:
            t1 = test(copied(blob(obj1, encode='json')),
                      blob(pickle.dumps(obj2)), (pickled(42.0), "foo"),
                      blob(obj4, encode='json'),
                      obj5,
                      blob("ňů", encode="text-latin2"),
                      blob("ňů", encode="text-latin2"),
                      blob("ňů", encode="text-latin2"),
                      ina=blob("barbar", encode='cbor'),
                      kwA=pickled(["A"]),
                      kwB=blob(["B"], encode="json"),
                      kwC=blob(["C"], encode="cbor"),
                      kwD=blob(["D"], encode="arrow"))
            s.submit()
            t1.wait()