Exemplo n.º 1
0
def test_request_batch_index(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.batch_index == 0
    jussi_request = jsonrpc_from_request(dummy_request, 1, jsonrpc_request)
    assert jussi_request.batch_index == 1
Exemplo n.º 2
0
def test_upstream_id(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.upstream_id == 123

    jussi_request = jsonrpc_from_request(dummy_request, 1, jsonrpc_request)
    assert jussi_request.upstream_id == 124
Exemplo n.º 3
0
def test_upstream_headers(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.upstream_headers == {
        'x-jussi-request-id': '123',
        'x-amzn-trace-id': '123'}

    dummy_request.headers['x-amzn-trace-id'] = '1'
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.upstream_headers == {
        'x-jussi-request-id': '123',
        'x-amzn-trace-id': '1'
    }
Exemplo n.º 4
0
def upstream_request(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)

    cpy = deepcopy(jussi_request)
    cpy['id'] = 123456789012345
    assert jussi_request.to_upstream_request(as_json=False) == cpy
    assert jussi_request.to_upstream_request() == ujson.dumps(cpy,
                                                              ensure_ascii=False)

    cpy = deepcopy(jussi_request)
    cpy['id'] = 123456789012346
    jussi_request = jsonrpc_from_request(dummy_request, 1, cpy)
    assert jussi_request.to_upstream_request(as_json=False) == cpy
    assert jussi_request.to_upstream_request() == ujson.dumps(cpy,
                                                              ensure_ascii=False)
Exemplo n.º 5
0
    def jsonrpc(self) -> Optional[JrpcRequest]:
        # ignore body and json if HTTP methos is not POST
        if self.method != 'POST':
            return None

        if self._parsed_jsonrpc is _empty:
            self._parsed_jsonrpc = None
            from jussi.errors import ParseError
            from jussi.errors import InvalidRequest
            from jussi.validators import validate_jsonrpc_request
            try:
                # raise ParseError for blank/empty body
                if self.body is _empty:
                    raise ParseError(http_request=self)
                # raise ParseError if parsing fails
                try:
                    self._parsed_json = json_loads(self.body)
                except Exception as e:
                    raise ParseError(http_request=self, exception=e)

                # validate jsonrpc
                jsonrpc_request = self._parsed_json
                validate_jsonrpc_request(jsonrpc_request)

                if isinstance(jsonrpc_request, dict):
                    self._parsed_jsonrpc = jsonrpc_from_request(
                        self, 0, jsonrpc_request)
                    self.is_single_jrpc = True
                elif isinstance(jsonrpc_request, list):
                    self._parsed_jsonrpc = [
                        jsonrpc_from_request(self, batch_index, req)
                        for batch_index, req in enumerate(jsonrpc_request)
                    ]
                    self.is_batch_jrpc = True
            except ParseError as e:
                raise e
            except Exception as e:
                raise InvalidRequest(http_request=self, exception=e)
        return self._parsed_jsonrpc
Exemplo n.º 6
0
async def test_cache_group_cache_batch_jsonrpc_responses():
    batch_req = [
        jsonrpc_from_request(dummy_request, _id, {
            "id": _id,
            "jsonrpc": "2.0",
            "method": "get_block",
            "params": [_id]
        }) for _id in range(1, 10)
    ]

    batch_resp = [{
        'id': _id,
        "jsonrpc": "2.0",
        'result': {
            "previous": "000003e7c4fd3221cf407efcf7c1730e2ca54b05",
            "timestamp": "2016-03-24T16:55:30",
            "witness": "initminer",
            "transaction_merkle_root":
            "0000000000000000000000000000000000000000",
            "extensions": [],
            "witness_signature":
            "207f15578cac20ac0e8af1ebb8f463106b8849577e21cca9fc60da146d1d95df88072dedc6ffb7f7f44a9185bbf9bf8139a5b4285c9f423843720296a44d428856",
            "transactions": [],
            "block_id": "000003e8b922f4906a45af8e99d86b3511acd7a5",
            "signing_key":
            "STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
            "transaction_ids": []
        }
    } for _id in range(1, 10)]

    caches = [
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST),
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST),
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST)
    ]
    cache_group = CacheGroup(caches)

    keys = [jsonrpc_cache_key(req) for req in batch_req]
    await cache_group.set('last_irreversible_block_num', 15_000_000, 180)
    await cache_group.cache_batch_jsonrpc_response(batch_req, batch_resp)

    for i, key in enumerate(keys):
        assert cache_group._memory_cache.gets(key) == batch_resp[i]
        assert await caches[0].cache.get(key) == batch_resp[i]
        assert await caches[1].cache.get(key) == batch_resp[i]
        assert await caches[2].cache.get(key) == batch_resp[i]
        assert await cache_group.get(key) == batch_resp[i]
Exemplo n.º 7
0
async def test_cache_group_get_single_jsonrpc_response(
        steemd_request_and_response):
    caches = [
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST),
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST),
        CacheGroupItem(build_mocked_cache(), True, True, SpeedTier.FAST)
    ]
    cache_group = CacheGroup(caches)

    cache_group = CacheGroup(caches)
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0, req)
    resp['jsonrpc'] = '2.0'
    key = jsonrpc_cache_key(req)
    assert await cache_group.get(key) is None
    await cache_group.set('last_irreversible_block_num', 15_000_000, 180)
    await cache_group.cache_single_jsonrpc_response(req, resp)
    assert await cache_group.get(key) == resp
    assert await cache_group.get_single_jsonrpc_response(req) == resp
    cache_group._memory_cache.clears()
    assert await cache_group.get_single_jsonrpc_response(req) == resp

    for cache_item in caches:
        assert await cache_item.cache.get(key) == resp
Exemplo n.º 8
0
def test_request_urn(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.urn == urn
Exemplo n.º 9
0
def test_request_params(full_urn_test_request_dict):
    jsonrpc_request, urn_parsed, urn, url, ttl, timeout = full_urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.params == jsonrpc_request.get('params', _empty)
Exemplo n.º 10
0
def test_request_method(full_urn_test_request_dict):
    jsonrpc_request, urn_parsed, urn, url, ttl, timeout = full_urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.method == jsonrpc_request['method']
Exemplo n.º 11
0
def test_request_id(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert jussi_request.id == jsonrpc_request.get('id')
Exemplo n.º 12
0
def test_cache_group_x_jussi_cache_key(steemd_request_and_response):
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0, req)
    batch_req = [req, req, req]
    assert jsonrpc_cache_key(req) == CacheGroup.x_jussi_cache_key(req)
    assert CacheGroup.x_jussi_cache_key(batch_req) == 'batch'
Exemplo n.º 13
0
from jussi.validators import is_valid_get_block_response
from jussi.validators import is_valid_non_error_jussi_response
from jussi.validators import is_valid_non_error_single_jsonrpc_response
from jussi.validators import is_valid_single_jsonrpc_response
from jussi.validators import limit_broadcast_transaction_request
from jussi.validators import limit_custom_json_op_length
from jussi.validators import limit_custom_json_account
from jussi.validators import is_broadcast_transaction_request
from jussi.validators import validate_jsonrpc_request

from .conftest import make_request
dummy_request = make_request()


request = jsonrpc_from_request(dummy_request, 0, {
    "id": "1", "jsonrpc": "2.0",
    "method": "get_block", "params": [1000]
})

request2 = jsonrpc_from_request(dummy_request, 1, {
    "id": "1", "jsonrpc": "2.0", "method": "call",
    "params": ["database_api", "get_block", [1000]]
})

response = {
    "id": 1,
    "result": {
        "previous": "000003e7c4fd3221cf407efcf7c1730e2ca54b05",
        "timestamp": "2016-03-24T16:55:30",
        "witness": "initminer",
        "transaction_merkle_root": "0000000000000000000000000000000000000000",
        "extensions": [],
Exemplo n.º 14
0
def test_is_valid_get_block_response(req, response, expected):
    if not isinstance(req, JSONRPCRequest):
        req = jsonrpc_from_request(dummy_request, 0, req)
    assert is_valid_get_block_response(req, response) is expected
Exemplo n.º 15
0
def test_request_to_json(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    assert ujson.loads(jussi_request.json()) == jussi_request.to_dict()
Exemplo n.º 16
0
def test_cache_group_is_complete_response(steemd_request_and_response):
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0, req)
    assert CacheGroup.is_complete_response(req, resp) is True
Exemplo n.º 17
0
def test_is_broadcast_transaction_true_invalid(invalid_broadcast_transaction):
    req = jsonrpc_from_request(dummy_request, 0,
                               invalid_broadcast_transaction)
    assert is_broadcast_transaction_request(req) is True
Exemplo n.º 18
0
def test_is_broadcast_transaction_false(steemd_request_and_response):
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0,
                               req)
    assert is_broadcast_transaction_request(req) is False
Exemplo n.º 19
0
def test_is_valid_jussi_response_using_steemd(steemd_request_and_response):
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0, req)
    assert is_valid_non_error_jussi_response(req, resp) is True
Exemplo n.º 20
0
def test_request_upstream(urn_test_request_dict):
    jsonrpc_request, urn, url, ttl, timeout = urn_test_request_dict
    dummy_request = make_request()
    jussi_request = jsonrpc_from_request(dummy_request, 0, jsonrpc_request)
    os.environ['JUSSI_ACCOUNT_TRANSFER_STEEMD_URL'] = 'account_transfer_url'
    assert jussi_request.upstream.url == url
Exemplo n.º 21
0
# -*- coding: utf-8 -*-

import pytest

from jussi.cache.utils import jsonrpc_cache_key
from jussi.request.jsonrpc import JSONRPCRequest
from .conftest import make_request
from jussi.request.jsonrpc import from_http_request as jsonrpc_from_request

jrpc_req_1 = jsonrpc_from_request(make_request(), 0, {
    "id": "1",
    "jsonrpc": "2.0",
    "method": "get_block",
    "params": [1000]
})
jrpc_resp_1 = {
    "id": 2,
    "result": {
        "previous": "000003e7c4fd3221cf407efcf7c1730e2ca54b05",
        "timestamp": "2016-03-24T16:55:30",
        "witness": "initminer",
        "transaction_merkle_root": "0000000000000000000000000000000000000000",
        "extensions": [],
        "witness_signature":
        "207f15578cac20ac0e8af1ebb8f463106b8849577e21cca9fc60da146d1d95df88072dedc6ffb7f7f44a9185bbf9bf8139a5b4285c9f423843720296a44d428856",
        "transactions": [],
        "block_id": "000003e8b922f4906a45af8e99d86b3511acd7a5",
        "signing_key": "STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        "transaction_ids": []
    }
}
Exemplo n.º 22
0
def test_limit_broadcast_transaction_request(steemd_request_and_response):
    req, resp = steemd_request_and_response
    req = jsonrpc_from_request(dummy_request, 0, req)
    limit_broadcast_transaction_request(req)
Exemplo n.º 23
0
def test_is_get_block_header_request(req, expected):
    if not isinstance(req, JSONRPCRequest):
        req = jsonrpc_from_request(dummy_request, 0, req)
    assert is_get_block_header_request(req) is expected
Exemplo n.º 24
0
def test_valid_limit_broadcast_transaction_request(valid_broadcast_transaction):
    req = jsonrpc_from_request(dummy_request, 0, valid_broadcast_transaction)
    limit_broadcast_transaction_request(
        req, limits=TEST_UPSTREAM_CONFIG['limits'])
Exemplo n.º 25
0
def test_invalid_limit_broadcast_transaction_request(invalid_broadcast_transaction):
    req = jsonrpc_from_request(dummy_request, 0, invalid_broadcast_transaction)
    with pytest.raises(JsonRpcError):
        limit_broadcast_transaction_request(
            req, limits=TEST_UPSTREAM_CONFIG['limits'])
Exemplo n.º 26
0
# -*- coding: utf-8 -*-
import pytest

from jussi.cache.ttl import TTL
from jussi.cache.utils import irreversible_ttl
from jussi.request.jsonrpc import JSONRPCRequest
from jussi.request.jsonrpc import from_http_request as jsonrpc_from_request
from .conftest import make_request
dummy_request = make_request()


ttl_rpc_req = jsonrpc_from_request(dummy_request, 0, {"id": "1", "jsonrpc": "2.0",
                                                      "method": "get_block", "params": [1000]})
rpc_resp = {
    "id": 1,
    "result": {
        "previous": "000003e7c4fd3221cf407efcf7c1730e2ca54b05",
        "timestamp": "2016-03-24T16:55:30",
        "witness": "initminer",
        "transaction_merkle_root": "0000000000000000000000000000000000000000",
        "extensions": [],
        "witness_signature": "207f15578cac20ac0e8af1ebb8f463106b8849577e21cca9fc60da146d1d95df88072dedc6ffb7f7f44a9185bbf9bf8139a5b4285c9f423843720296a44d428856",
        "transactions": [],
        "block_id": "000003e8b922f4906a45af8e99d86b3511acd7a5",
        "signing_key": "STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        "transaction_ids": []}}

non_ttl_rpc_req = jsonrpc_from_request(dummy_request, 0, {"id": "1", "jsonrpc": "2.0",
                                                          "method": "sbds.method", "params": [1000]})

Exemplo n.º 27
0
from time import perf_counter

from jussi.cache.backends.max_ttl import SimplerMaxTTLMemoryCache
from jussi.cache import CacheGroupItem
from jussi.cache import SpeedTier
from jussi.cache.cache_group import CacheGroup
from jussi.cache.utils import jsonrpc_cache_key

from .conftest import make_request
from .conftest import build_mocked_cache
from jussi.request.jsonrpc import from_http_request as jsonrpc_from_request
dummy_request = make_request()

jrpc_req_1 = jsonrpc_from_request(dummy_request, 0, {
    "id": "1",
    "jsonrpc": "2.0",
    "method": "get_block",
    "params": [1000]
})

jrpc_resp_1 = {
    "id": 2,
    "result": {
        "previous": "000003e7c4fd3221cf407efcf7c1730e2ca54b05",
        "timestamp": "2016-03-24T16:55:30",
        "witness": "initminer",
        "transaction_merkle_root": "0000000000000000000000000000000000000000",
        "extensions": [],
        "witness_signature":
        "207f15578cac20ac0e8af1ebb8f463106b8849577e21cca9fc60da146d1d95df88072dedc6ffb7f7f44a9185bbf9bf8139a5b4285c9f423843720296a44d428856",
        "transactions": [],
        "block_id": "000003e8b922f4906a45af8e99d86b3511acd7a5",