From caa68bb0de034597cef7d739f0bb9a06280e7449 Mon Sep 17 00:00:00 2001 From: Gekctek Date: Sun, 22 Dec 2024 21:09:56 -0800 Subject: [PATCH] http outcall mocking --- src/PocketIC/API.xml | 48 +++++++-------- src/PocketIC/IPocketIcHttpClient.cs | 46 +++++---------- src/PocketIC/PocketIc.cs | 55 +++++++++++++++++- src/PocketIC/PocketIcHttpClient.cs | 43 +++++++++----- .../CanisterWasmModules/http_outcall.wasm | Bin 0 -> 146261 bytes .../src/http_outcall/.gitignore | 2 + .../src/http_outcall/dfx.json | 16 +++++ .../src/http_outcall/main.mo | 27 +++++++++ test/PocketIC.Tests/PocketIc.Tests.cs | 42 +++++++++++++ .../PocketIcHttpClient.Tests.cs | 1 + 10 files changed, 209 insertions(+), 71 deletions(-) create mode 100644 test/PocketIC.Tests/CanisterWasmModules/http_outcall.wasm create mode 100644 test/PocketIC.Tests/CanisterWasmModules/src/http_outcall/.gitignore create mode 100644 test/PocketIC.Tests/CanisterWasmModules/src/http_outcall/dfx.json create mode 100644 test/PocketIC.Tests/CanisterWasmModules/src/http_outcall/main.mo diff --git a/src/PocketIC/API.xml b/src/PocketIC/API.xml index 11f54aa..0e2594d 100644 --- a/src/PocketIC/API.xml +++ b/src/PocketIC/API.xml @@ -91,13 +91,6 @@ The id of the PocketIC instance The current timestamp - - - Gets pending canister HTTP requests - - The id of the PocketIC instance - The pending canister HTTP request - Gets the cycles balance of a canister @@ -214,15 +207,22 @@ The id of the IC instance + + + Gets pending canister HTTP Outcall requests (not http calls to a canister) + + The id of the PocketIC instance + The pending canister HTTP request + - Mocks a response to a canister HTTP request + Mocks a response to a canister HTTP Outcall request (not an http call to a canister) The id of the IC instance The id of the HTTP request The subnet id of the canister The response to send - Additional responses to send + Optional Additional responses to send @@ -591,21 +591,6 @@ Optional maximum size for the response - - - HTTP header for canister requests/responses - - - - - The header name - - - - - The header value - - HTTP methods supported for canister HTTP calls @@ -1219,6 +1204,21 @@ Optional effective principal for the call, defaults to canister id A raw candid argument from the response + + + Executes an update call on a canister with a raw CandidArg and raw CandidArg response with a single HTTP outcall mock response. + If there are multiple outcalls, only one will be mocked, and if there are none, an exception will be thrown. + NOTE: If you want more advanced outcall mocking, use the directly + + The principal making the call + The target canister ID + The method name to call + The raw candid argument for the call + The HTTP outcall mock response + Optional additional HTTP outcall mock responses + Optional effective principal for the call, defaults to canister id + A raw candid argument from the response + Awaits an update call response for a given request id, from the method diff --git a/src/PocketIC/IPocketIcHttpClient.cs b/src/PocketIC/IPocketIcHttpClient.cs index af39be1..6822e40 100644 --- a/src/PocketIC/IPocketIcHttpClient.cs +++ b/src/PocketIC/IPocketIcHttpClient.cs @@ -1,3 +1,4 @@ +using System.Net; using EdjCase.ICP.Agent.Responses; using EdjCase.ICP.Candid.Models; @@ -111,13 +112,6 @@ Task QueryCallAsync( /// The current timestamp Task GetTimeAsync(int instanceId); - /// - /// Gets pending canister HTTP requests - /// - /// The id of the PocketIC instance - /// The pending canister HTTP request - Task GetCanisterHttpAsync(int instanceId); - /// /// Gets the cycles balance of a canister /// @@ -249,20 +243,28 @@ Task SubmitIngressMessageAsync( /// The id of the IC instance Task TickAsync(int instanceId); + + /// + /// Gets pending canister HTTP Outcall requests (not http calls to a canister) + /// + /// The id of the PocketIC instance + /// The pending canister HTTP request + Task> GetCanisterHttpAsync(int instanceId); + /// - /// Mocks a response to a canister HTTP request + /// Mocks a response to a canister HTTP Outcall request (not an http call to a canister) /// /// The id of the IC instance /// The id of the HTTP request /// The subnet id of the canister /// The response to send - /// Additional responses to send + /// Optional Additional responses to send Task MockCanisterHttpResponseAsync( int instanceId, ulong requestId, Principal subnetId, CanisterHttpResponse response, - List additionalResponses + List? additionalResponses = null ); /// @@ -683,7 +685,7 @@ public class CanisterHttpRequest /// /// The HTTP headers for the request /// - public required List Headers { get; set; } + public required List<(string Key, string Value)> Headers { get; set; } /// /// The body of the request @@ -696,22 +698,6 @@ public class CanisterHttpRequest public required ulong? MaxResponseBytes { get; set; } } -/// -/// HTTP header for canister requests/responses -/// -public class CanisterHttpHeader -{ - /// - /// The header name - /// - public required string Name { get; set; } - - /// - /// The header value - /// - public required string Value { get; set; } -} - /// /// HTTP methods supported for canister HTTP calls /// @@ -734,7 +720,7 @@ public enum CanisterHttpMethod /// /// Base class for HTTP responses to canister HTTP requests /// -public class CanisterHttpResponse { } +public abstract class CanisterHttpResponse { } /// /// Successful HTTP response to a canister HTTP request @@ -744,12 +730,12 @@ public class CanisterHttpReply : CanisterHttpResponse /// /// The HTTP status code /// - public required ushort Status { get; set; } + public required HttpStatusCode Status { get; set; } /// /// The response headers /// - public required List Headers { get; set; } + public required List<(string Name, string Value)> Headers { get; set; } /// /// The response body diff --git a/src/PocketIC/PocketIc.cs b/src/PocketIC/PocketIc.cs index 98359ae..51f3dbe 100644 --- a/src/PocketIC/PocketIc.cs +++ b/src/PocketIC/PocketIc.cs @@ -788,6 +788,60 @@ public async Task UpdateCallRawAsynchronousAsync( ); } + + /// + /// Executes an update call on a canister with a raw CandidArg and raw CandidArg response with a single HTTP outcall mock response. + /// If there are multiple outcalls, only one will be mocked, and if there are none, an exception will be thrown. + /// NOTE: If you want more advanced outcall mocking, use the directly + /// + /// The principal making the call + /// The target canister ID + /// The method name to call + /// The raw candid argument for the call + /// The HTTP outcall mock response + /// Optional additional HTTP outcall mock responses + /// Optional effective principal for the call, defaults to canister id + /// A raw candid argument from the response + public async Task UpdateCallRawWithHttpOutcallMockAsync( + Principal sender, + Principal canisterId, + string method, + CandidArg arg, + CanisterHttpResponse response, + List? additionalResponses = null, + EffectivePrincipal? effectivePrincipal = null + ) + { + effectivePrincipal ??= EffectivePrincipal.Canister(canisterId); + RequestId requestId = await this.HttpClient.SubmitIngressMessageAsync( + this.InstanceId, + sender, + canisterId, + method, + arg, + effectivePrincipal + ); + await this.TickAsync(2); + List outcalls = await this.HttpClient.GetCanisterHttpAsync(this.InstanceId); + if (outcalls.Count < 1) + { + throw new Exception("No outcalls found"); + } + CanisterHttpRequest outcall = outcalls[0]; + + + await this.HttpClient.MockCanisterHttpResponseAsync( + this.InstanceId, + outcall.RequestId, + outcall.SubnetId, + response, + additionalResponses + ); + + return await this.HttpClient.AwaitIngressMessageAsync(this.InstanceId, requestId, effectivePrincipal); + } + + /// /// Awaits an update call response for a given request id, from the method /// @@ -908,7 +962,6 @@ public static async Task CreateAsync( candidConverter ); } - } /// diff --git a/src/PocketIC/PocketIcHttpClient.cs b/src/PocketIC/PocketIcHttpClient.cs index 2045111..df6d26e 100644 --- a/src/PocketIC/PocketIcHttpClient.cs +++ b/src/PocketIC/PocketIcHttpClient.cs @@ -245,8 +245,9 @@ public async Task GetTimeAsync(int instanceId) } return ICTimestamp.FromNanoSeconds(response!["nanos_since_epoch"].Deserialize()!); } + /// - public async Task GetCanisterHttpAsync(int instanceId) + public async Task> GetCanisterHttpAsync(int instanceId) { JsonNode? response = await this.GetJsonAsync($"/instances/{instanceId}/read/get_canister_http"); @@ -254,21 +255,28 @@ public async Task GetCanisterHttpAsync(int instanceId) { throw new Exception("There was no json response from the server"); } + return response + .AsArray() + .Select(r => DeserializeCanisterHttpRequest(r!)) + .ToList(); + } + + private static CanisterHttpRequest DeserializeCanisterHttpRequest(JsonNode node) + { return new CanisterHttpRequest { - Body = response!["body"].Deserialize()!, - Headers = response!["headers"]!.AsObject()!.Select(kv => new CanisterHttpHeader - { - Name = kv.Key, - Value = kv.Value.Deserialize()! - }).ToList(), - Url = response!["url"].Deserialize()!, - SubnetId = Principal.FromBytes(response!["subnet_id"].Deserialize()!), - HttpMethod = Enum.Parse(response!["http_method"].Deserialize()!), - MaxResponseBytes = response!["max_response_bytes"].Deserialize()!, - RequestId = response!["request_id"].Deserialize()! + Body = node["body"].Deserialize()!, + Headers = node["headers"]!.AsArray() + !.Select(h => (h!["name"].Deserialize()!, h!["value"].Deserialize()!)) + .ToList(), + Url = node["url"].Deserialize()!, + SubnetId = Principal.FromBytes(node["subnet_id"]!["subnet_id"].Deserialize()!), + HttpMethod = Enum.Parse(node["http_method"].Deserialize()!, ignoreCase: true), + MaxResponseBytes = node["max_response_bytes"].Deserialize()!, + RequestId = node["request_id"].Deserialize()! }; } + /// public async Task GetCyclesBalanceAsync(int instanceId, Principal canisterId) { @@ -583,18 +591,21 @@ public async Task MockCanisterHttpResponseAsync( ulong requestId, Principal subnetId, CanisterHttpResponse response, - List additionalResponses + List? additionalResponses = null ) { var request = new JsonObject { ["request_id"] = JsonValue.Create(requestId), - ["subnet_id"] = JsonValue.Create(subnetId.Raw), + ["subnet_id"] = new JsonObject(new Dictionary + { + ["subnet_id"] = Convert.ToBase64String(subnetId.Raw) + }), ["response"] = PocketIcHttpClient.SerializeCanisterHttpResponse(response), ["additional_responses"] = JsonValue.Create( additionalResponses - .Select(r => PocketIcHttpClient.SerializeCanisterHttpResponse(r)) - .ToArray() + ?.Select(r => PocketIcHttpClient.SerializeCanisterHttpResponse(r)) + .ToArray() ?? [] ) }; await this.PostJsonAsync($"/instances/{instanceId}/update/mock_canister_http", request); diff --git a/test/PocketIC.Tests/CanisterWasmModules/http_outcall.wasm b/test/PocketIC.Tests/CanisterWasmModules/http_outcall.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ab713fd57e1c3e2f971ce4d18f7e36f3edecaf0e GIT binary patch literal 146261 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 + + let http_response : IC.http_request_result = await IC.http_request(http_request); + + http_response.body; + }; + +}; diff --git a/test/PocketIC.Tests/PocketIc.Tests.cs b/test/PocketIC.Tests/PocketIc.Tests.cs index 5b6304b..f7388b0 100644 --- a/test/PocketIC.Tests/PocketIc.Tests.cs +++ b/test/PocketIC.Tests/PocketIc.Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net; using System.Threading; using System.Threading.Tasks; using EdjCase.ICP.Agent.Agents; @@ -207,4 +208,45 @@ await pocketIc.UpdateCallNoResponseAsync( Assert.Equal(InstanceStatus.Deleted, instances[instanceId.Value].Status); } } + + + [Fact] + public async Task Test_MockHttp() + { + SubnetConfig nnsSubnet = SubnetConfig.New(); + + IPocketIcHttpClient httpClient = new PocketIcHttpClient(new System.Net.Http.HttpClient(), this.url, TimeSpan.FromSeconds(5)); + // Create new pocketic instance for test, then dispose it + await using (PocketIc pocketIc = await PocketIc.CreateAsync(httpClient, nnsSubnet: nnsSubnet)) + { + + byte[] wasmModule = File.ReadAllBytes("CanisterWasmModules/http_outcall.wasm"); + + Principal canisterId = await pocketIc.CreateAndInstallCanisterAsync( + wasmModule, + CandidArg.Empty(), + cyclesAmount: 1_000_000_000_000 + ); + + CanisterHttpReply httpResponse = new CanisterHttpReply + { + Body = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + Headers = new List<(string, string)> + { + ("Content-Type", "application/octet-stream") + }, + Status = HttpStatusCode.OK + }; + CandidArg response = await pocketIc.UpdateCallRawWithHttpOutcallMockAsync( + Principal.Anonymous(), + canisterId, + "http_outcall", + CandidArg.Empty(), + httpResponse + ); + + byte[] returnedBytes = response.ToObjects(); + Assert.Equal(httpResponse.Body, returnedBytes); + } + } } diff --git a/test/PocketIC.Tests/PocketIcHttpClient.Tests.cs b/test/PocketIC.Tests/PocketIcHttpClient.Tests.cs index b1f71c6..e655a98 100644 --- a/test/PocketIC.Tests/PocketIcHttpClient.Tests.cs +++ b/test/PocketIC.Tests/PocketIcHttpClient.Tests.cs @@ -81,6 +81,7 @@ public async Task Test() // bool validSignature = await client.VerifySignatureAsync(message, publicKey, subnetPublicKey, signature); // Assert.True(validSignature); + // Delete the instance await client.DeleteInstanceAsync(instanceId);