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()
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)
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
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()