def test_requests_size(port_generator, executor): port0 = port_generator() port1 = port_generator() with Flow(monitoring=True, port_monitoring=port0).add(uses=executor, port_monitoring=port1) as f: f.post('/foo', inputs=DocumentArray.empty(size=1)) resp = req.get(f'http://localhost:{port1}/') # enable on port0 assert resp.status_code == 200 assert ( f'jina_request_size_bytes_count{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 1.0' in str(resp.content)) def _get_request_bytes_size(): resp = req.get(f'http://localhost:{port1}/') # enable on port0 resp_lines = str(resp.content).split('\\n') byte_line = [ line for line in resp_lines if 'jina_request_size_bytes_sum{executor="DummyExecutor"' in line ] return float(byte_line[0][-5:]) measured_request_bytes_sum_init = _get_request_bytes_size() f.post('/foo', inputs=DocumentArray.empty(size=1)) measured_request_bytes_sum = _get_request_bytes_size() assert measured_request_bytes_sum > measured_request_bytes_sum_init
def test_document_processed_total(port_generator, executor): port0 = port_generator() port1 = port_generator() with Flow(monitoring=True, port_monitoring=port0).add(uses=executor, port_monitoring=port1) as f: resp = req.get(f'http://localhost:{port1}/') assert resp.status_code == 200 f.post( f'/foo', inputs=DocumentArray.empty(size=4)) # process 4 documents on foo resp = req.get(f'http://localhost:{port1}/') assert ( f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 4.0' # check that we count 4 documents on foo in str(resp.content)) assert not ( f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/bar",runtime_name="executor0/rep-0"}}' # check that we does not start counting documents on bar as it has not been called yet in str(resp.content)) f.post( f'/bar', inputs=DocumentArray.empty(size=5)) # process 5 documents on bar assert not ( f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/bar",runtime_name="executor0/rep-0"}} 5.0' # check that we count 5 documents on foo in str(resp.content)) assert ( f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 4.0' # check that we nothing change on bar count in str(resp.content))
def test_client_on_error_call(protocol, exception): with pytest.raises(exception): Client(host='0.0.0.0', protocol=protocol, port=12345).post( '/blah', inputs=DocumentArray.empty(10), )
def test_decorator_interface(port_generator): class DummyExecutor(Executor): @requests(on='/foo') def foo(self, docs, **kwargs): self._proces(docs) self.proces_2(docs) @monitor(name='metrics_name', documentation='metrics description') def _proces(self, docs): ... @monitor() def proces_2(self, docs): ... port = port_generator() with Flow(monitoring=True, port_monitoring=port_generator()).add(uses=DummyExecutor, monitoring=True, port_monitoring=port) as f: f.post('/foo', inputs=DocumentArray.empty(4)) resp = req.get(f'http://localhost:{port}/') assert f'jina_metrics_name_count{{runtime_name="executor0/rep-0"}} 1.0' in str( resp.content) assert ( f'jina_proces_2_seconds_count{{runtime_name="executor0/rep-0"}} 1.0' in str(resp.content))
def test_client_host_scheme(protocol): port = random_port() f = Flow(protocol='websocket' if protocol == 'ws' else protocol, port=port).add() with f: c = Client(host=f'{protocol}://localhost:{port}') c.post('/', inputs=DocumentArray.empty(2))
def test_healthcheck_logs_websocket_with_env(capfd, health_check_env): f = Flow(protocol='websocket', port=12345).add() with f: f.post('/', inputs=DocumentArray.empty()) req.get('http://localhost:12345/') out, _ = capfd.readouterr() assert '"GET / HTTP/1.1" 200 OK' not in out
def test_empty_arrays(linear_flow): docs = DocumentArray.empty(5) with linear_flow as f: resp = f.post(on='/foo', inputs=docs) for doc in resp: assert not doc.tags['listcheck_embedding'] assert not doc.tags['listcheck_tensor'] assert not doc.tags['nparraycheck_embedding'] assert not doc.tags['nparraycheck_tensor']
async def test_async_apply(): class AsyncExecutor(Executor): @requests async def foo(self, docs: DocumentArray, **kwargs): docs.apply(set_hello) return docs N = 2 da = DocumentArray.empty(N) exec = AsyncExecutor() da1 = await exec.foo(da) assert da1.texts == ['hello'] * N
def test_array_conversion(linear_flow): docs = DocumentArray.empty(5) for doc in docs: doc.embedding = torch.tensor(np.random.randn(5)) doc.tensor = torch.tensor(np.random.randn(3, 3)) with linear_flow as f: resp = f.post(on='/foo', inputs=docs) for doc in resp: assert doc.tags['nparraycheck_embedding'] assert doc.tags['nparraycheck_tensor'] assert doc.tags['listcheck_embedding'] assert doc.tags['listcheck_tensor']
def test_map_nested(): class NestedExecutor(Executor): @requests def foo(self, docs: DocumentArray, **kwargs): def bar(d: Document): d.text = 'hello' return d docs.apply(bar) return docs N = 2 da = DocumentArray.empty(N) exec = NestedExecutor() da1 = exec.foo(da) assert da1.texts == ['hello'] * N
def test_client_on_always_after_exception(protocol): class OnAlways: def __init__(self): self.is_called = False def __call__(self, response): self.is_called = True on_always = OnAlways() Client(host='0.0.0.0', protocol=protocol, port=12345).post( '/blah', inputs=DocumentArray.empty(10), on_always=on_always, ) assert on_always.is_called
def test_client_on_error_deprecation(protocol): class OnError: def __init__(self): self.is_called = False def __call__(self, response): # this is deprecated self.is_called = True on_error = OnError() Client(host='0.0.0.0', protocol=protocol, port=12345).post( '/blah', inputs=DocumentArray.empty(10), on_error=on_error, ) assert on_error.is_called
def test_sorted_response(tmpdir, shuffle_flow): tag_list = ['first', 'second', 'third', 'fourth', 'fifth'] inputs = DocumentArray.empty(6) for i in range(5): # no tag for last doc inputs[i].tags[tag_list[i]] = 1 # one-hot encoding with shuffle_flow as f: ret = f.post(on='/index', inputs=inputs) assert len(ret) == 5 for i, doc in enumerate(ret): assert doc.tags[tag_list[i]] == 1 inputs = inputs[:5] for og, returned in zip(inputs, ret): assert og.id == returned.id
def test_client_on_error_raise_exception(protocol, exception): class OnError: def __init__(self): self.is_called = False def __call__(self, response, exception_param: Optional[Exception] = None): self.is_called = True assert type(exception_param) == exception on_error = OnError() Client(host='0.0.0.0', protocol=protocol, port=12345).post( '/blah', inputs=DocumentArray.empty(10), on_error=on_error, ) assert on_error.is_called
def test_prometheus_interface(port_generator): class DummyExecutor(Executor): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.summary = Summary('a', 'A', registry=self.runtime_args.metrics_registry) @requests(on='/foo') def foo(self, docs, **kwargs): with self.summary.time(): ... port = port_generator() with Flow(monitoring=True, port_monitoring=port_generator()).add(uses=DummyExecutor, monitoring=True, port_monitoring=port) as f: f.post('/foo', inputs=DocumentArray.empty(4)) resp = req.get(f'http://localhost:{port}/') assert f'a_count 1.0' in str( # check that we count 4 documents on foo resp.content)
def test_executor_dataclass(): @dataclasses.dataclass class MyDataClassExecutor(Executor): my_field: str @requests(on=['/search']) def baz(self, docs, **kwargs): for doc in docs: doc.tags['metas_name'] = self.metas.name doc.tags['my_field'] = self.my_field f = Flow().add( uses=MyDataClassExecutor, uses_with={'my_field': 'this is my field'}, uses_metas={'name': 'test-name-updated'}, uses_requests={'/foo': 'baz'}, ) with f: res = f.post(on='/foo', inputs=DocumentArray.empty(2)) assert len(res) == 2 for r in res: assert r.tags['metas_name'] == 'test-name-updated' assert r.tags['my_field'] == 'this is my field'
import os import pytest from docarray import DocumentArray from jina import Flow @pytest.mark.parametrize('inputs', [None, DocumentArray.empty(10)]) def test_grpc_census(inputs): assert int(os.environ.get('JINA_GRPC_SEND_BYTES', 0)) == 0 assert int(os.environ.get('JINA_GRPC_RECV_BYTES', 0)) == 0 with Flow().add().add() as f: f.post( on='/', inputs=inputs, ) assert int(os.environ['JINA_GRPC_SEND_BYTES']) > 0 assert int(os.environ['JINA_GRPC_RECV_BYTES']) > 0 # add some route info, so size must be larger assert int(os.environ['JINA_GRPC_SEND_BYTES']) < int( os.environ['JINA_GRPC_RECV_BYTES']) del os.environ['JINA_GRPC_SEND_BYTES'] del os.environ['JINA_GRPC_RECV_BYTES']
def test_serve(served_exec): docs = Client(port=PORT).post(on='/foo', inputs=DocumentArray.empty(5)) assert docs.texts == ['foo' for _ in docs]
def _send_request(): f.search(inputs=DocumentArray.empty(size=1))