@@ -13,9 +13,10 @@ Success::
1313 . public key and canister ranges for all subnets
1414 . public keys of nodes on the subnet
1515 . no public keys of nodes on other subnets
16- . Malformed status requests are rejected by /api/{v2,v3}/canister/.../read_state
16+ . Malformed status requests are rejected by /api/{v2,v3}/canister/.../read_state and /api/{v2,v3}/subnet/.../read_state
1717. Status requests for non-existent requests contain an absence proof by /api/{v2,v3}/canister/.../read_state
18- . /api/{v2,v3}/canister/.../read_state requests of invalid paths are rejected
18+ and /api/v3/subnet/.../read_state
19+ . /api/{v2,v3}/canister/.../read_state and /api/{v2,v3}/subnet/.../read_state requests of invalid paths are rejected
1920. A canister's public metadata sections can be read by
2021 . The canister controller
2122 . The anonymous identity
@@ -27,11 +28,13 @@ Success::
2728 . module_hash is absent for empty canisters;
2829 . module_hash is a blob for non-empty canisters;
2930 . controllers are always present for existing canisters and consist of a list of principals
30- . /api/{v2,v3}/canister/.../read_state requests for the full paths /request_status/R/status and /request_status/R/reply succeed
31- . /api/{v2,v3}/canister/.../read_state requests for the path /request_status/R are rejected with 403 if signed by a different
32- principal than who made the original request with request ID R;
33- . /api/{v2,v3}/canister/.../read_state requests for two paths /request_status/R and /request_status/S with two different request
34- IDs R and S are rejected with 400 (while requesting each of the two paths in isolation would succeed);
31+ . /api/{v2,v3}/canister/.../read_state and /api/v3/subnet/.../read_state requests for the full paths
32+ /request_status/R/status and /request_status/R/reply succeed
33+ . /api/{v2,v3}/canister/.../read_state and /api/v3/subnet/.../read_state requests for the path /request_status/R
34+ are rejected with 403 if signed by a different principal than who made the original request with request ID R;
35+ . /api/{v2,v3}/canister/.../read_state and /api/v3/subnet/.../read_state requests for two paths /request_status/R
36+ and /request_status/S with two different request IDs R and S are rejected with 400
37+ (while requesting each of the two paths in isolation would succeed);
3538. Read state requests at `/api/{v2,v3}/subnet/{subnet_id}/read_state` for the path `/canister_ranges/{subnet_id}`
3639 succeed and return a correct list of canister ranges assigned to the subnet.
3740. Read state requests at `/api/{v2,v3}/canister/{canister_id}/read_state` for the path `/canister_ranges/{subnet_id}`
@@ -271,7 +274,7 @@ fn test_subnet_path(env: TestEnv, endpoint: Endpoint) {
271274 let ( app_subnet, other_app_subnet) = get_both_app_subnets ( & env) ;
272275 let app_subnet_id = app_subnet. subnet_id ;
273276
274- // Query the `/subnet` enpoint of the app subnet
277+ // Query the `/subnet` endpoint of the app subnet
275278 let path = vec ! [ "subnet" . into( ) ] ;
276279 let cert = read_state ( & env, vec ! [ path] , endpoint) . expect ( "Valid request" ) ;
277280
@@ -348,26 +351,25 @@ fn test_invalid_request_rejected(env: TestEnv, endpoint: Endpoint) {
348351 let path = vec ! [ "request_status" . into( ) , invalid_request_id. into( ) ] ;
349352 let error = read_state ( & env, vec ! [ path] , endpoint) . expect_err ( "Invalid request" ) ;
350353 match endpoint {
351- Endpoint :: CanisterReadState ( _version ) => {
354+ Endpoint :: CanisterReadState ( _ ) | Endpoint :: SubnetReadState ( read_state :: Version :: V3 ) => {
352355 assert_matches ! (
353356 error,
354357 AgentError :: HttpError ( error) if error. status == StatusCode :: BAD_REQUEST . as_u16( ) ,
355358 "Invalid request id"
356359 )
357360 }
358- Endpoint :: SubnetReadState ( _version ) => {
361+ Endpoint :: SubnetReadState ( read_state :: Version :: V2 ) => {
359362 assert_matches ! (
360363 error,
361364 AgentError :: HttpError ( error) if error. status == StatusCode :: NOT_FOUND . as_u16( ) ,
362- "request_status is not allowed on subnet read_state endpoint"
365+ "request_status is not allowed on subnet read_state V2 endpoint"
363366 )
364367 }
365368 }
366369 }
367370}
368371
369- fn test_absent_request ( env : TestEnv , version : read_state:: Version ) {
370- let endpoint = Endpoint :: CanisterReadState ( version) ;
372+ fn test_absent_request ( env : TestEnv , endpoint : Endpoint ) {
371373 for absent_request_id in [ & [ 0 ; 32 ] , & [ 8 ; 32 ] , & [ 255 ; 32 ] ] {
372374 let path = vec ! [ "request_status" . into( ) , absent_request_id. into( ) ] ;
373375 let cert = read_state ( & env, vec ! [ path] , endpoint) . expect ( "Valid request" ) ;
@@ -722,8 +724,7 @@ fn make_update_call(agent: &Agent, canister_id: &Principal) -> (RequestId, Vec<u
722724 ( request_id, result)
723725}
724726
725- fn test_request_path ( env : TestEnv , version : read_state:: Version ) {
726- let endpoint = Endpoint :: CanisterReadState ( version) ;
727+ fn test_request_path ( env : TestEnv , endpoint : Endpoint ) {
727728 let node = get_first_app_node ( & env) ;
728729 let effective_canister_id = node. effective_canister_id ( ) ;
729730 let agent = node. build_default_agent ( ) ;
@@ -760,8 +761,7 @@ fn test_request_path(env: TestEnv, version: read_state::Version) {
760761 assert_eq ! ( value. to_vec( ) , result) ;
761762}
762763
763- fn test_request_path_access ( env : TestEnv , version : read_state:: Version ) {
764- let endpoint = Endpoint :: CanisterReadState ( version) ;
764+ fn test_request_path_access ( env : TestEnv , endpoint : Endpoint ) {
765765 let node = get_first_app_node ( & env) ;
766766 let effective_canister_id = node. effective_canister_id ( ) ;
767767 let agent = node. build_default_agent ( ) ;
@@ -809,7 +809,7 @@ fn test_request_path_access(env: TestEnv, version: read_state::Version) {
809809}
810810
811811/// Queries the `api/{v2,v3}/canister/{canister_id}/read_state` endpoint for the canister ranges,
812- /// and makes sure the requests fails.
812+ /// and makes sure the request fails.
813813fn test_canister_canister_ranges_paths ( env : TestEnv , version : read_state:: Version ) {
814814 let endpoint = Endpoint :: CanisterReadState ( version) ;
815815 let subnet = get_first_app_subnet ( & env) ;
@@ -827,7 +827,7 @@ fn test_canister_canister_ranges_paths(env: TestEnv, version: read_state::Versio
827827 assert_matches ! ( err, AgentError :: HttpError ( payload) if payload. status == 404 ) ;
828828}
829829
830- /// Queries the `api/{v2,v3}/subnet/{subnet_id}/read_state` endpoint for the canister ranges.
830+ /// Queries the `api/{v2,v3}/subnet/{subnet_id}/read_state` endpoint for the canister ranges
831831/// and compares the result with the canister ranges obtained from the registry.
832832fn test_subnet_canister_ranges_paths ( env : TestEnv , version : read_state:: Version ) {
833833 let endpoint = Endpoint :: SubnetReadState ( version) ;
@@ -1096,18 +1096,16 @@ fn main() -> Result<()> {
10961096 . add_test ( systest ! ( test_subnet_canister_ranges_paths; read_state:: Version :: V3 ) )
10971097 . add_test ( systest ! ( test_canister_canister_ranges_paths; read_state:: Version :: V2 ) )
10981098 . add_test ( systest ! ( test_canister_canister_ranges_paths; read_state:: Version :: V3 ) )
1099- // Only /api/{v2,v3}/canister/read_state endpoints are tested because paths with
1100- // /request_status prefix are not supported by /api/{v2,v3}/subnet/read_state
1101- . add_test ( systest ! ( test_request_path; read_state:: Version :: V2 ) )
1102- . add_test ( systest ! ( test_request_path; read_state:: Version :: V3 ) )
1103- // Only /api/{v2,v3}/canister/read_state endpoints are tested because paths with
1104- // /request_status prefix are not supported by /api/{v2,v3}/subnet/read_state
1105- . add_test ( systest ! ( test_request_path_access; read_state:: Version :: V2 ) )
1106- . add_test ( systest ! ( test_request_path_access; read_state:: Version :: V3 ) )
1107- // Only /api/{v2,v3}/canister/read_state endpoints are tested because paths with
1108- // /request_status prefix are not supported by /api/{v2,v3}/subnet/read_state
1109- . add_test ( systest ! ( test_absent_request; read_state:: Version :: V2 ) )
1110- . add_test ( systest ! ( test_absent_request; read_state:: Version :: V3 ) )
1099+ // paths with /request_status prefix are not supported by /api/v2/subnet/read_state
1100+ . add_test ( systest ! ( test_request_path; Endpoint :: CanisterReadState ( read_state:: Version :: V2 ) ) )
1101+ . add_test ( systest ! ( test_request_path; Endpoint :: CanisterReadState ( read_state:: Version :: V3 ) ) )
1102+ . add_test ( systest ! ( test_request_path; Endpoint :: SubnetReadState ( read_state:: Version :: V3 ) ) )
1103+ . add_test ( systest ! ( test_request_path_access; Endpoint :: CanisterReadState ( read_state:: Version :: V2 ) ) )
1104+ . add_test ( systest ! ( test_request_path_access; Endpoint :: CanisterReadState ( read_state:: Version :: V3 ) ) )
1105+ . add_test ( systest ! ( test_request_path_access; Endpoint :: SubnetReadState ( read_state:: Version :: V3 ) ) )
1106+ . add_test ( systest ! ( test_absent_request; Endpoint :: CanisterReadState ( read_state:: Version :: V2 ) ) )
1107+ . add_test ( systest ! ( test_absent_request; Endpoint :: CanisterReadState ( read_state:: Version :: V3 ) ) )
1108+ . add_test ( systest ! ( test_absent_request; Endpoint :: SubnetReadState ( read_state:: Version :: V3 ) ) )
11111109 // Only /api/{v2,v3}/canister/read_state endpoints are tested because paths with
11121110 // /canister prefix are not supported by /api/{v2,v3}/subnet/read_state
11131111 . add_test ( systest ! ( test_canister_path; read_state:: Version :: V2 ) )
0 commit comments