Skip to content

Commit

Permalink
Improve server/client data helpers
Browse files Browse the repository at this point in the history
Improve surf mode, and add dump mode to helpers
functions.

Also, implements the possibility to track the
provisions processed for every server data
event.

Issue: #118
  • Loading branch information
testillano authored and Eduardo Ramos Testillano (eramedu) committed Mar 26, 2024
1 parent 1881224 commit 8db62c0
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 102 deletions.
14 changes: 6 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4291,10 +4291,9 @@ Usage: server_data [-h|--help]; Inspects server data events (http://localhost:80
Displayed keys (method/uri) could be limited (5 by default, -1: no limit).
[--clean] [query filters] ; Removes server data events. Admits additional query filters to narrow the
selection.
[--surf] ; Interactive sorted server data navigation.
Usage: server_data_sequence [-h|--help] [value (available values by default)]; Extract server sequence document from json
retrieved in previous server_data() call.
[--surf] ; Interactive sorted (regardless method/uri) server data navigation.
[--dump] ; Dumps all sequences detected for server data under 'server-data-sequences'
directory.
=== Traffic client ===
Usage: client_endpoint [-h|--help] [--clean] [file]; Cleans/gets/updates current client endpoint configuration
(http://localhost:8074/admin/v1/client-endpoint).
Expand All @@ -4316,10 +4315,9 @@ Usage: client_data [-h|--help]; Inspects client data events (http://localhost:80
(5 by default, -1: no limit).
[--clean] [query filters] ; Removes client data events. Admits additional query filters to narrow
the selection.
[--surf] ; Interactive sorted client data navigation.
Usage: client_data_sequence [-h|--help] [value (available values by default)]; Extract client sequence document from json
retrieved in previous client_data() call.
[--surf] ; Interactive sorted (regardless endpoint/method/uri) client data navigation.
[--dump] ; Dumps all sequences detected for client data under 'client-data-sequences'
directory.
=== Schemas ===
Usage: schema_schema [-h|--help]; Gets the schema configuration schema
(http://localhost:8074/admin/v1/schema/schema).
Expand Down
4 changes: 2 additions & 2 deletions ct/src/server-data_operation/sdo_get_data_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def test_001_i_want_to_get_internal_data_on_admin_interface(h2ac_admin, h2ac_tra

# Check server data
response = h2ac_admin.get(ADMIN_SERVER_DATA_URI)
responseBodyRef = [{'method': 'GET', 'events': [{'previousState': 'initial', 'receptionTimestampUs': 1623552535012124, 'responseBody': {'foo': 'bar-1'}, 'responseDelayMs': 0, 'responseHeaders': {'content-type': 'application/json', 'x-version': '1.0.0'}, 'responseStatusCode': 200, 'serverSequence': 32, 'state': 'initial'}], 'uri': '/app/v1/foo/bar/1'}]
responseBodyRef = [{'method': 'GET', 'events': [{'previousState': 'initial', 'receptionTimestampUs': 1623552535012124, 'responseBody': {'foo': 'bar-1'}, 'responseDelayMs': 0, 'responseHeaders': {'content-type': 'application/json', 'x-version': '1.0.0'}, 'responseStatusCode': 200, 'serverSequence': 32, 'state': 'initial'}], 'uri': '/app/v1/foo/bar/1', 'provisionUri': '/app/v1/foo/bar/1'}]
# Response will be something like: [{"method":"GET","events":[{"responseBody":{"foo":"bar-1"},"receptionTimestampUs":1623439423163143,"state":"initial"}],"uri":"/app/v1/foo/bar/1"}]
# We have a variable field 'receptionTimestampUs' and we don't know its real value.
# So, we will remove it from both reference and response python dictionaries:
Expand All @@ -47,7 +47,7 @@ def test_002_i_want_to_get_speficic_internal_data_on_admin_interface(h2ac_admin,

# Check server data
response = h2ac_admin.get(ADMIN_SERVER_DATA_URI + "?requestMethod=GET&requestUri=/app/v1/foo/bar/2")
responseBodyRef = { "method": "GET", "events": [{'previousState': 'initial', 'responseBody': {'foo': 'bar-2'}, 'responseDelayMs': 0, 'responseHeaders': {'content-type': 'application/json', 'x-version': '1.0.0'}, 'responseStatusCode': 200, 'state': 'initial'}], "uri": "/app/v1/foo/bar/2" }
responseBodyRef = { "method": "GET", "events": [{'previousState': 'initial', 'responseBody': {'foo': 'bar-2'}, 'responseDelayMs': 0, 'responseHeaders': {'content-type': 'application/json', 'x-version': '1.0.0'}, 'responseStatusCode': 200, 'state': 'initial'}], "uri": "/app/v1/foo/bar/2", "provisionUri": "/app/v1/foo/bar/2" }
# serverSequence and receptionTimestampUs have been removed from reference and also will be removed from response as they are not predictable:
# hyper does not add headers on traffic as curl does, so we don't have to remove 'headers' key.
del response["body"]["events"][0]["serverSequence"] # depends on the server sequence since the h2agent was started
Expand Down
2 changes: 2 additions & 0 deletions src/http2/MyTrafficHttp2Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ ss << "TRAFFIC REQUEST RECEIVED"

// Store event context information
if (server_data_) {
normalizedKey.setProvisionUri(provision->getRequestUri()); // additional context
getMockServerData()->loadEvent(normalizedKey, inState, (hasVirtualMethod ? provision->getOutState():outState), receptionTimestampUs, statusCode, req.header(), headers, requestBodyDataPart, responseBody, receptionId, responseDelayMs, server_data_key_history_ /* history enabled */);

// Virtual storage:
Expand All @@ -348,6 +349,7 @@ ss << "TRAFFIC REQUEST RECEIVED"
}

h2agent::model::DataKey foreignKey(outStateMethod /* foreign method */, outStateUri /* foreign uri */);
foreignKey.setProvisionUri(provision->getRequestUri()); // additional context
getMockServerData()->loadEvent(foreignKey, inState, outState, receptionTimestampUs, statusCode, req.header(), headers, requestBodyDataPart, responseBody, receptionId, responseDelayMs, server_data_key_history_ /* history enabled */, method /* virtual method origin*/, normalizedUri /* virtual uri origin */);
}
}
Expand Down
10 changes: 10 additions & 0 deletions src/model/AdminServerProvision.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,16 @@ class AdminServerProvision

// getters:

/**
* Gets the provision request uri which could be a regular expression
* or a full-matched URI string
*
* @return Provision request URI
*/
const admin_server_provision_key_t &getRequestUri() const {
return request_uri_;
}

/**
* Gets the provision key as '<in-state>|<request-method>|<request-uri>'
*
Expand Down
9 changes: 9 additions & 0 deletions src/model/keys.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class DataKey {
std::string client_endpoint_id_{};
std::string method_{};
std::string uri_{};
std::string provision_uri_{}; // for requests

mock_events_key_t key_{};
int nkeys_;
Expand Down Expand Up @@ -152,6 +153,7 @@ class DataKey {
void keyToJson(nlohmann::json &doc) const {
doc["method"] = method_;
doc["uri"] = uri_;
if (!provision_uri_.empty()) doc["provisionUri"] = provision_uri_;
if (getNKeys() == 3) {
doc["clientEndpointId"] = client_endpoint_id_;
}
Expand All @@ -174,6 +176,13 @@ class DataKey {

return (complete() || empty());
}

/**
* Set provision URI (additional context data for requests in mock server mode)
*/
void setProvisionUri(const std::string &provisionUri) {
provision_uri_ = provisionUri;
}
};

/**
Expand Down
Loading

0 comments on commit 8db62c0

Please sign in to comment.