May 30, 4-5 AM (3)
May 30, 5-6 AM (43)
May 30, 6-7 AM (22)
May 30, 7-8 AM (63)
May 30, 8-9 AM (45)
May 30, 9-10 AM (35)
May 30, 10-11 AM (20)
May 30, 11-12 PM (30)
May 30, 12-1 PM (42)
May 30, 1-2 PM (53)
May 30, 2-3 PM (57)
May 30, 3-4 PM (48)
May 30, 4-5 PM (11)
May 30, 5-6 PM (12)
May 30, 6-7 PM (13)
May 30, 7-8 PM (7)
May 30, 8-9 PM (6)
May 30, 9-10 PM (2)
May 30, 10-11 PM (19)
May 30, 11-12 AM (17)
May 31, 12-1 AM (18)
May 31, 1-2 AM (4)
May 31, 2-3 AM (7)
May 31, 3-4 AM (27)
May 31, 4-5 AM (11)
May 31, 5-6 AM (16)
May 31, 6-7 AM (19)
May 31, 7-8 AM (68)
May 31, 8-9 AM (66)
May 31, 9-10 AM (33)
May 31, 10-11 AM (32)
May 31, 11-12 PM (33)
May 31, 12-1 PM (52)
May 31, 1-2 PM (36)
May 31, 2-3 PM (34)
May 31, 3-4 PM (31)
May 31, 4-5 PM (35)
May 31, 5-6 PM (39)
May 31, 6-7 PM (23)
May 31, 7-8 PM (27)
May 31, 8-9 PM (17)
May 31, 9-10 PM (13)
May 31, 10-11 PM (14)
May 31, 11-12 AM (12)
Jun 01, 12-1 AM (9)
Jun 01, 1-2 AM (15)
Jun 01, 2-3 AM (13)
Jun 01, 3-4 AM (21)
Jun 01, 4-5 AM (39)
Jun 01, 5-6 AM (15)
Jun 01, 6-7 AM (47)
Jun 01, 7-8 AM (99)
Jun 01, 8-9 AM (23)
Jun 01, 9-10 AM (45)
Jun 01, 10-11 AM (27)
Jun 01, 11-12 PM (28)
Jun 01, 12-1 PM (39)
Jun 01, 1-2 PM (38)
Jun 01, 2-3 PM (39)
Jun 01, 3-4 PM (45)
Jun 01, 4-5 PM (27)
Jun 01, 5-6 PM (7)
Jun 01, 6-7 PM (20)
Jun 01, 7-8 PM (32)
Jun 01, 8-9 PM (10)
Jun 01, 9-10 PM (14)
Jun 01, 10-11 PM (19)
Jun 01, 11-12 AM (20)
Jun 02, 12-1 AM (17)
Jun 02, 1-2 AM (7)
Jun 02, 2-3 AM (9)
Jun 02, 3-4 AM (13)
Jun 02, 4-5 AM (42)
Jun 02, 5-6 AM (36)
Jun 02, 6-7 AM (15)
Jun 02, 7-8 AM (19)
Jun 02, 8-9 AM (8)
Jun 02, 9-10 AM (86)
Jun 02, 10-11 AM (80)
Jun 02, 11-12 PM (53)
Jun 02, 12-1 PM (72)
Jun 02, 1-2 PM (51)
Jun 02, 2-3 PM (67)
Jun 02, 3-4 PM (34)
Jun 02, 4-5 PM (36)
Jun 02, 5-6 PM (44)
Jun 02, 6-7 PM (35)
Jun 02, 7-8 PM (18)
Jun 02, 8-9 PM (15)
Jun 02, 9-10 PM (12)
Jun 02, 10-11 PM (10)
Jun 02, 11-12 AM (14)
Jun 03, 12-1 AM (1)
Jun 03, 1-2 AM (3)
Jun 03, 2-3 AM (0)
Jun 03, 3-4 AM (1)
Jun 03, 4-5 AM (2)
Jun 03, 5-6 AM (4)
Jun 03, 6-7 AM (7)
Jun 03, 7-8 AM (2)
Jun 03, 8-9 AM (3)
Jun 03, 9-10 AM (3)
Jun 03, 10-11 AM (8)
Jun 03, 11-12 PM (6)
Jun 03, 12-1 PM (2)
Jun 03, 1-2 PM (8)
Jun 03, 2-3 PM (10)
Jun 03, 3-4 PM (1)
Jun 03, 4-5 PM (8)
Jun 03, 5-6 PM (18)
Jun 03, 6-7 PM (0)
Jun 03, 7-8 PM (5)
Jun 03, 8-9 PM (2)
Jun 03, 9-10 PM (2)
Jun 03, 10-11 PM (14)
Jun 03, 11-12 AM (11)
Jun 04, 12-1 AM (1)
Jun 04, 1-2 AM (5)
Jun 04, 2-3 AM (6)
Jun 04, 3-4 AM (3)
Jun 04, 4-5 AM (1)
Jun 04, 5-6 AM (2)
Jun 04, 6-7 AM (2)
Jun 04, 7-8 AM (7)
Jun 04, 8-9 AM (2)
Jun 04, 9-10 AM (1)
Jun 04, 10-11 AM (3)
Jun 04, 11-12 PM (2)
Jun 04, 12-1 PM (6)
Jun 04, 1-2 PM (3)
Jun 04, 2-3 PM (7)
Jun 04, 3-4 PM (14)
Jun 04, 4-5 PM (3)
Jun 04, 5-6 PM (16)
Jun 04, 6-7 PM (24)
Jun 04, 7-8 PM (10)
Jun 04, 8-9 PM (13)
Jun 04, 9-10 PM (5)
Jun 04, 10-11 PM (13)
Jun 04, 11-12 AM (48)
Jun 05, 12-1 AM (14)
Jun 05, 1-2 AM (6)
Jun 05, 2-3 AM (5)
Jun 05, 3-4 AM (13)
Jun 05, 4-5 AM (9)
Jun 05, 5-6 AM (6)
Jun 05, 6-7 AM (24)
Jun 05, 7-8 AM (22)
Jun 05, 8-9 AM (93)
Jun 05, 9-10 AM (48)
Jun 05, 10-11 AM (53)
Jun 05, 11-12 PM (76)
Jun 05, 12-1 PM (46)
Jun 05, 1-2 PM (51)
Jun 05, 2-3 PM (46)
Jun 05, 3-4 PM (26)
Jun 05, 4-5 PM (36)
Jun 05, 5-6 PM (18)
Jun 05, 6-7 PM (50)
Jun 05, 7-8 PM (27)
Jun 05, 8-9 PM (14)
Jun 05, 9-10 PM (7)
Jun 05, 10-11 PM (11)
Jun 05, 11-12 AM (20)
Jun 06, 12-1 AM (7)
Jun 06, 1-2 AM (6)
Jun 06, 2-3 AM (8)
Jun 06, 3-4 AM (28)
Jun 06, 4-5 AM (6)
3,790 commits this week May 30, 2023 - Jun 06, 2023
local root peers: initialise local root var
This patch fixes a bug where results `TVar` was never initialised if all
local root peers were provided with their IP addresses, and thus the
node didn't try to connect to any of its local root peers.

We add `LocalRootPeersResult` to `TestTraceEvent` which is used to track
values committed to the `TVar` which holds local root peers with
resolved dns names.  It is more robust to use `traceTVarIO` than to
relay on `TraceLocalRootPeers` events, as  we can force the latter to be
traced even if there's no dns name to be resolved.  This captures the
case where local root peers contains only IP addresses.
local root peers: initialise local root var
This patch fixes a bug where results `TVar` was never initialised if all
local root peers were provided with their IP addresses, and thus the
node didn't try to connect to any of its local root peers.

We add `LocalRootPeersResult` to `TestTraceEvent` which is used to track
values committed to the `TVar` which holds local root peers with
resolved dns names.  It is more robust to use `traceTVarIO` than to
relay on `TraceLocalRootPeers` events, as  we can force the latter to be
traced even if there's no dns name to be resolved.  This captures the
case where local root peers contains only IP addresses.
Merge #3862
3862: Make API error expectations compiler-checkable. r=jonathanknowles a=jonathanknowles

Follow-on from https://github.com/input-output-hk/cardano-wallet/pull/3824 ([ADP-2269](https://input-output.atlassian.net/browse/ADP-2269)).

## Summary

This PR replaces `expectErrorCode`, which creates expectations based on string comparisons, with `expectErrorInfo`, which creates expectations based on `ApiErrorInfo` objects.

This has two advantages:
- expectation expressions can be checked statically by the compiler.
- it's possible to express richer expectations based on internal fields of errors (not all errors are just simple values -- some have nested records), using combinators provided by `hspec`.

## Context

In our test suite we test at least two kinds of mapping:

- The mapping between API types and their serialised JSON representations: for all API types, the JSON encoding should be consistent with the OpenAPI specification, and the round trip property `(decode . encode == id)` should hold for all values.
- The mapping from (API call, inputs, state) to API response values: i.e, that API calls return the responses we expect, given appropriate inputs and the current (implicit) wallet state.

Up until now, the approach we've used in `cardano-wallet` is to separate the above two concerns into **different test suites**, i.e., to:

- test expectations about our JSON serialisation logic in specialised tests for just that purpose (JSON golden round trip tests and the test suite for the OpenAPI spec).
- within other test suites (such as the integration test suite), **assume** the correctness of our JSON serialisation logic, and express expectations in terms of ordinary (decoded) Haskell values.

API errors have, up until now, been a sort of exception to this separation of concerns, because until recently we didn't have a good way to create structured errors.

But since merging #3557, which provides support for structured errors and the accompanying [decodeErrorInfo](https://github.com/input-output-hk/cardano-wallet/blob/504774f0f08f4ec74fa91106bc004d8e7b97f875/lib/wallet/integration/src/Test/Integration/Framework/DSL.hs#L559) function, we've gradually been converting expectations about API errors to use the same style as we use for ordinary values returned by the API, which is to express expectations in terms of ordinary Haskell expressions, and to avoid writing expectations in terms of hard-coded strings.

For example, for ordinary (non-error) API responses, we typically write expectations like this:
https://github.com/input-output-hk/cardano-wallet/blob/7af6d54d21443146320eab04452eefb75b3d553e/lib/wallet/integration/src/Test/Integration/Scenario/API/Shelley/Transactions.hs#L297-L299

Co-authored-by: Jonathan Knowles <[email protected]>