aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Nicolas "Pixel" Noble <pixel@nobis-crew.org>2016-12-29 01:38:26 +0100
committerGravatar Nicolas "Pixel" Noble <pixel@nobis-crew.org>2017-01-04 22:10:14 +0100
commit203860ac23b6229096c0e9d9c04f12cd607c1938 (patch)
tree43cdba091ef2ea2421a0633b4241e40135ec551a /test
parent19014deb841f25d14827147d4812b1ddcce2b693 (diff)
parentddebfa65f2bdff332902adf73606bc050014b498 (diff)
Merge remote-tracking branch 'google/master' into bazel-take-2
Diffstat (limited to 'test')
-rw-r--r--test/core/bad_client/bad_client.c23
-rw-r--r--test/core/bad_client/bad_client.h2
-rw-r--r--test/core/bad_client/tests/large_metadata.c18
-rw-r--r--test/core/bad_ssl/servers/cert.c10
-rw-r--r--test/core/channel/channel_args_test.c14
-rw-r--r--test/core/channel/channel_stack_test.c15
-rw-r--r--test/core/client_channel/lb_policies_test.c456
-rw-r--r--test/core/client_channel/resolvers/dns_resolver_connectivity_test.c9
-rw-r--r--test/core/client_channel/resolvers/dns_resolver_test.c4
-rw-r--r--test/core/client_channel/resolvers/sockaddr_resolver_test.c9
-rw-r--r--test/core/client_channel/set_initial_connect_string_test.c34
-rw-r--r--test/core/compression/message_compress_test.c158
-rw-r--r--test/core/end2end/bad_server_response_test.c30
-rw-r--r--test/core/end2end/connection_refused_test.c38
-rw-r--r--test/core/end2end/cq_verifier.c33
-rw-r--r--test/core/end2end/cq_verifier.h2
-rw-r--r--test/core/end2end/dualstack_socket_test.c18
-rw-r--r--test/core/end2end/end2end_nosec_tests.c24
-rw-r--r--test/core/end2end/end2end_test_utils.c51
-rw-r--r--test/core/end2end/end2end_tests.c24
-rw-r--r--test/core/end2end/end2end_tests.h11
-rw-r--r--test/core/end2end/fake_resolver.c90
-rw-r--r--test/core/end2end/fixtures/h2_census.c8
-rw-r--r--test/core/end2end/fixtures/h2_compress.c8
-rw-r--r--test/core/end2end/fixtures/h2_fake_resolver.c128
-rw-r--r--test/core/end2end/fixtures/h2_fakesec.c8
-rw-r--r--test/core/end2end/fixtures/h2_fd.c11
-rw-r--r--test/core/end2end/fixtures/h2_full+pipe.c8
-rw-r--r--test/core/end2end/fixtures/h2_full+trace.c8
-rw-r--r--test/core/end2end/fixtures/h2_full.c8
-rw-r--r--test/core/end2end/fixtures/h2_http_proxy.c8
-rw-r--r--test/core/end2end/fixtures/h2_load_reporting.c8
-rw-r--r--test/core/end2end/fixtures/h2_oauth2.c8
-rw-r--r--test/core/end2end/fixtures/h2_proxy.c8
-rw-r--r--test/core/end2end/fixtures/h2_sockpair+trace.c14
-rw-r--r--test/core/end2end/fixtures/h2_sockpair.c14
-rw-r--r--test/core/end2end/fixtures/h2_sockpair_1byte.c17
-rw-r--r--test/core/end2end/fixtures/h2_ssl.c8
-rw-r--r--test/core/end2end/fixtures/h2_ssl_cert.c73
-rw-r--r--test/core/end2end/fixtures/h2_ssl_proxy.c8
-rw-r--r--test/core/end2end/fixtures/h2_uds.c8
-rw-r--r--test/core/end2end/fixtures/http_proxy.c89
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer.c226
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0077816beb340a2ef87cc57c18e0ce0d1e6e23fcbin0 -> 95 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/00a1b8e686014202baacdc052a38d392dff11432bin0 -> 111 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/00c7c2cc7f90842e766645310e4a439e7b188473bin0 -> 314 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/00f89898cb8f3e3c20e7be1d8c7a1544fb81ea5ebin0 -> 266 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0173fb5c52d97d0d63266a529bf2f6442894b0c6bin0 -> 667 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/020d06c319b6e511021d21316ba283bca9b40dc9bin0 -> 163 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0598f8881c26b7e9562cdc4c3f86749dd49598d6bin0 -> 123 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/071b85ef412067e7db9188bee7c92e4fd661e021bin0 -> 307 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0768af66da5e344f21337df8eb0a1c8c955f4244bin0 -> 472 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/077202f145bfc7dff77e820cbe6ac6e4ae76e1edbin0 -> 708 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/07e7bbb0005535e901b7f50e13cba9d5da51c2a5bin0 -> 230 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/08a6761ed9d5298fc0d0fe9e75196f7527e488d4bin0 -> 23 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/092575ab527ffb459d2e1eed593902820bb462c0bin0 -> 384 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/09985e738bf04fb7827367f2ae70f4697ff5aaf0bin0 -> 397 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/099d967555bfc237238c93f9d884c004c773b33bbin0 -> 298 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0b08fc5a8eb4a23766be7b3082308959955d4b13bin0 -> 175 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0c088a8261de0bf3b996cc1e7889399acb03fd5abin0 -> 372 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0c10483d4f5018b899483bcf23094f9119919ca4bin0 -> 37 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0c653a4b68bd77eec050b66ff2d8eae13001c505bin0 -> 113 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0df8bd9c41fb5d8ce8a0f2f28ca16be96bd9997ebin0 -> 671 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0e0ecc8214b5083b75216857b967621c0648afc9bin0 -> 374 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0e5aa755fff40b487617e01f6812d85ad310b727bin0 -> 342 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/0f10d36e818e41f1737245c2bb8cb83a69421cb1bin0 -> 29 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/10ee46dc1973472ead36ec4b8a1ea90200637c73bin0 -> 689 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/13b2e7a9d9f07a9e06ed96957c56e968f3b6070dbin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/13c269dc54b84acbf75b78db730c25311a61c4abbin0 -> 115 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/140219fcde79e1de47129172abaef4e06e72534dbin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/16b69b968a140abb00dd5c79ea7d0c1b23510fe7bin0 -> 414 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/16f798191df0c173217cdcb4ec8edd3e4f7fb99bbin0 -> 464 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/17381a0515458a92bc8248051b600da4020a1207bin0 -> 198 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/17647336806cf94a0224516f3d8caa22367c7c5abin0 -> 97 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/17c7024889cc97a8afd3133b55a147ba75d17188bin0 -> 302 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/194027acca76bf2e874aa672b4491f0b7fe32187bin0 -> 409 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/1a6119919790570e3c15bb371648fc7929c72ea2bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/1abcbb03796c6512f5b8a977532fbcf6368b45b0bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/1c1a1980a1959423766c5a26ac79d07264224278bin0 -> 577 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/1d505e827d0036b3d8eab87439d31da5f901aed1bin0 -> 182 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/1dd9698ad85c7ab577bbc9b36180ef2641d8525cbin0 -> 114 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/217785067a28a2dcdf7c5cea9ef8c10817889aa7bin0 -> 63 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/21af47d84b1aa84e8b4021765203c8951239fe41bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/22d23ae7b0a9c4ac6ffefe6b6b47bb5f54226ae1bin0 -> 342 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2339fcca7f93814c587aba47fff2210875a41f49bin0 -> 33 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/239b03041efe9bf24982b0ecbb66d5abea4a28d0bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/24d630240f673498d784cecb66d73e9b1d981493bin0 -> 584 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2533c4ed207eed715756142667128f6eb01309e0bin0 -> 170 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/255ab618b474a659914f5167f6e89ae3f1376788bin0 -> 706 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2577397157d02cde4544e70fd6c3ff68704dd13bbin0 -> 117 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/25c8a5f8fbaf47c8a398a284008d90d088c652b2bin0 -> 279 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/26b6654b4efb469d4c8202dfc2ddafe4fc15e2d1bin0 -> 72 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2806c68471ca16df5356ef6a3379ea46c73c57ccbin0 -> 272 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2835dc7045dff8fd93a6e50bfd8775a50fce7599bin0 -> 663 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/28f73943647c3bfbd96e8d1a6188c428b15fdf12bin0 -> 140 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/29f39c36ffc68643789cd59ab9311a899fd9cfa6bin0 -> 165 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2afc0ae3e27ba7ab7ea26d656a01da4d85e0bbeabin0 -> 114 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2b6a001c2274e347cbfc6fe2e3bf4f7d7e79f5febin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2bc40826844d2232d9d36699432a30b4b1e5dd3abin0 -> 191 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2bcd71048dec1df45e36fde6deeb8f04bbd01cd4bin0 -> 178 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2bfa23d5d476e4266cba3979f81a9ebdc26993e1bin0 -> 667 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2c5b259108eb1a9735d7a89609d96bc043914cdbbin0 -> 107 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2d742d21ecbf421506ecf19b23d6075feca4350bbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2dd76fc710e3e78eaf4e5069fa227de678d0830dbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2f8262de35a8314655d55f10ca46db441577ba36bin0 -> 107 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2f9dd3b98b22bf2d4af5c2922977c8bb5699c367bin0 -> 282 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/2ff0986c252d462149597fd83bd5753926d343a0bin0 -> 164 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3037118f9983abef4c9757742269f00cc90c0609bin0 -> 170 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/312b8910d1965fbfb09f0cb73e7e9d28316677bbbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/321e6127d6f5619c88e31037f7fdec581acf75e8bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/33306900f08f0b618c2bf4ba6f6144be9d19cb97bin0 -> 550 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/34052cc2fa2be6543184db85d0b9ad33ae17029cbin0 -> 181 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/351c6aabe840d69a16ca0f630c6c5a11d42cb85cbin0 -> 50 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/35623259c0d5d73d23ea52efc3e4bd808c119440bin0 -> 182 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/35b84f9f429e72230f0e9f6400ae5052c961fb27bin0 -> 445 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3606c0748089f53e252b577ff7ab2df203d098ffbin0 -> 253 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/364f0605fd2d145db6ee6c7b01affb8833379db4bin0 -> 120 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/371d4ed270fb3cc3858a33fc0a857da2a21e6478bin0 -> 188 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/37b8a63d83441e64e279457d0e8318581ad3a7e6bin0 -> 378 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/37c26aa03db5daa01d7233f3c9fc474f81a724d1bin0 -> 30 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/39330aec49922885cf84803d7a5ee61d5948ee66bin0 -> 376 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3a07fd9ba009b9a57e298343e815abab13a16f5cbin0 -> 192 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3a74f1be7106c7dea533a34bd8a88974f69a5d71bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3abac3ec4db280fe9b8893b5f42986508dd87201bin0 -> 72 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3adaa0aea970123baa8ddb2560842c43bd19eb3fbin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3adc410756f3e9cb929570bd5e5107663e8eed80bin0 -> 446 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3c2b6ebd2cd3fa2ea216ed01c4a7275ecbaa40c0bin0 -> 110 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3c94ad60589b22d99dd03f98b37c609c180a755dbin0 -> 177 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3d48a5c5a6188238bffee78f07b7cf6bb854258dbin0 -> 110 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3d770d35de84de36ce4ed5b22f782edc99ecc634bin0 -> 74 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3e0407abf398a7c40a34df7ed33ff23de02a2a6bbin0 -> 74 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3e539f323c6ddea1bd3e34599a3c47b4457acdcfbin0 -> 281 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3ed3fbcdae0ab5b185d6e7f1f46c2440f656e8d6bin0 -> 121 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3ef10f7eba289d88e82f3678434ecc1218a47ee3bin0 -> 663 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ab27065d2a4fed7d011af384e03150b72eda5bin0 -> 165 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ee68f1f22eabcd01c2a7c1c6c8ccc299aa97dbin0 -> 443 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/3fbf231b2182dc58d2cdf1c62f01a8b709752505bin0 -> 79 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/40b500d38927c62c6966039b8557f810b3c19dc1bin0 -> 107 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/427392659bf3a945097c6c754a17d8c15e23816fbin0 -> 318 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/42b3c2bc6a11cea9d3ac86fbb8411360da676268bin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/42bcf462c3b918f07c52e87bcea6fd69a1f291b1bin0 -> 65 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/42e6fb19dac07a0cbe747dfc8f1c90bae1d58cecbin0 -> 326 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/43d52b36766d71176a2fc9f2a4be385bd2638570bin0 -> 80 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/44e696d37d7c113cf070d19871d5cc4e24a861d2bin0 -> 737 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/44ec5dcc4133f1786084202bf41d877702ce9277bin0 -> 330 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/463a882b12f48bf803b650e95f3968a28732fc02bin0 -> 428 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/464ad6f3ca7fdcaf80dd97478b6aa3b7005db6f2bin0 -> 820 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/467971d589278cc348786054add9f1efda2fef9ebin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/47062580b496ad925d4d2faf1baec14bfe69a95bbin0 -> 277 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/484ba3a787c8dab704c5d451e834044b46e35cddbin0 -> 527 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/48b3180434c4a21b334d7032ded763ef62b501bcbin0 -> 71 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/48ca1abe666bbf83a81d5c3be2d72017131ca4bfbin0 -> 25 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/494f747fe7c326002c3fb676c35d5dca2e28fd89bin0 -> 101 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/49ff30e0f070fe37b642dd0d361c5cbca139f223bin0 -> 228 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4a4ed32b4433e3cd99a4cd3cea00551074d07c9dbin0 -> 143 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4a7f8838cbf48e54b6649e62a32d4f0173ada959bin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4aac2683fc841a2b5da166889c54c01aa2ab9c6cbin0 -> 315 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4b08cbe9580dee1321fca514e74fbdd0022ec574bin0 -> 688 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4b538eda0a7ad5d38b9d95867b7c181cbe84589bbin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4df3330a4c9a861ed98d0c5a19f7388ab1c9840dbin0 -> 197 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4e4e5902e6d79c5d57bbf631863ab51b8b07943abin0 -> 78 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/4eb0173ccf074ec6d8c1943f3ab2464184262426bin0 -> 209 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/50125f617f85b033f72e4938f227fc771083e9d1bin0 -> 183 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/507b8ecbb9fd3eea9084087bce22a94cca8a7c41bin0 -> 560 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/509fa48e02986acab87796b1976e78a6ec243b79bin0 -> 430 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/51a2c3035dc5359f9887b588b922faa6789c7ea7bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5259807dc13effc44f0785be11f5dc0c0f35a659bin0 -> 96 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/531c6bd636d1d022ecdabf41243c1f036162bd8bbin0 -> 40 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5347599c4246a004f9cbecfa78d39168237b6394bin0 -> 376 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5356dcd6b1d0487f9723663f8a3dc955b7e09273bin0 -> 355 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/53d637a3f0b9fc07dee0de089080e5c105381eb1bin0 -> 170 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/55c1b1bd6e532928ad47cadd8e5c5363849d7df5bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/568af7c1199c646c500e287b50abada8ac0ff2dabin0 -> 197 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/56be7398f856423e2252d1a4e31103ebaebcc15bbin0 -> 467 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/56fb970061e8b61059130c0ac642bd0ceb0ea26dbin0 -> 337 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5748d19bd88d2495f0ced135e70b5bb4fe0b4148bin0 -> 115 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/587d211412b8405e82245f511007083dd60b7477bin0 -> 308 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/58f2f1f487dcd6cc6f2126835ec647c73f0d371abin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/58f87cac2d3f564f1afe4ca85637e47b758796a5bin0 -> 314 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5928c7d56230ac7c10860c64ebfa6aa243f2966c1
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5a3dbe637791a9a7c5005b985c1cc3e7066f8f50bin0 -> 99 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5ad89e10b538191d22187503233223d2e520d80fbin0 -> 130 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5b1d5721f3828cb73647cbf8c9e6b456a505a00bbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5b8bc6a61171513d5c9a96cb340e0a435c524017bin0 -> 165 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5bcde4a99b8ad54a5b8ba9b5131842c6c7c0ef19bin0 -> 78 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5cd1f23514773a7c5dd30be268b6fcfd1ace84b3bin0 -> 71 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5d8bc49f1deb0199a806113ab049df418a9d9316bin0 -> 137 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5da04bc3d5b4889de2f12508ef13bcb490787854bin0 -> 25 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/5fe822a742cf2f5328cec86c0972b0c7b4bd4460bin0 -> 311 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6016f65e62600b73d18ca8548591034fcddf440cbin0 -> 86 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/61614f406af22aa805e6a2cfb24519ffd058d575bin0 -> 73 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6196eb700471a9678e3e68526ab65bf4346c5badbin0 -> 376 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/622a3505d10767b795fc2c2922c0d5305d9b84e6bin0 -> 315 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/63626e71d4e8e15905f13933f5b88d89073b3411bin0 -> 178 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/63b74d17bfbd015bb55dda59a05101bee001369cbin0 -> 282 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/63d83cb5580d3222eb5e2d7982f7f995634ba5c1bin0 -> 363 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/64ce7e5553de2c081991af4fc386bffdd8d2e210bin0 -> 57 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/65afd7305e481da5ffc44a6a66eb3117744ae77dbin0 -> 99 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/65d8075993dbb2ed83dea46cd76e974352916eacbin0 -> 107 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/663e7fc276b902cd6efb5bc944c4c7af90ca916dbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6730972339225220310ac8c09c0f776ae465fc87bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6810347353fd417add645af90476310bbf572788bin0 -> 120 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6839920a4e7e998a8f30e6679934b91a819bebc9bin0 -> 218 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/68d88fa596ebee37d7c0251c0abcd844b452cf28bin0 -> 151 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6a0c934ac351b40c8815d7812a2bb1b0ca30940fbin0 -> 522 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6ae9bab625e9ac8210953a7363167d6deaf194ecbin0 -> 226 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6b6a9a2ecc635bd8d76b00b64aeb6297e04683b6bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6bddcd6ce1ff68320e3cc62bc215acf04de36ed2bin0 -> 663 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6c3c3119fabe838b2600e24651931f3012338e3bbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6cb9930369caf7584015d3a17c37e144d23b79cebin0 -> 206 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6f72c05f90d289ad239cff682d8e911cbbb416dcbin0 -> 145 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6f93d27e20d9158285cdc0193757daa2e34190b1bin0 -> 695 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/6fc72a2c1ff9a11539ae35b197a79786496c22571
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7025657232cd9bcb8fcd6edebdff268cf8e74db8bin0 -> 115 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7108fee873f0120d41f469944cf1e24bd33ad684bin0 -> 377 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/713f66791d0f23b7b7b0ec9c40b6d51f7b214c9abin0 -> 317 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/71ef778b5cb623be033026d5a6968e49a9581dc2bin0 -> 208 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/72205156cfb4fe412e4838b771dc9c9a8f1441d1bin0 -> 237 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/72b0bead5c0425173f696ff8efd7c726dcc4ecf8bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/72c747d699af2733d0b93e6fa7afa0f88d05eed7bin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7365085e946d2c950beafa73b8631b82010acaedbin0 -> 25 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/73b467524ba4f55fd030be6b0602389b9af4fa1abin0 -> 388 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/73c6386046061350e70fbd846e7dba1428a43857bin0 -> 163 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7436e1a9a62ad1f40320da321698477ed8f2b577bin0 -> 625 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7515e494e0ac5d2d3b53151b3d10bfcf81578c99bin0 -> 667 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/75652d3d4f913e10f7edef130e3d82a03b82247fbin0 -> 549 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/75aa409bfe540a3ad31f8bc504131eb41128404dbin0 -> 517 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/764deb515100de2b3d375d2689fd2c9e55eb8cd6bin0 -> 839 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7697d76245fff3d4a58fb04745c2a6197c9eeb54bin0 -> 311 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/76ecc734e931672cb80c9b9e31ebe5ec552bb126bin0 -> 400 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/76fc91359df03ef449e35588909eb949e05d50d5bin0 -> 305 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/77662d88e025c080212dd2dc4dd2030810926f40bin0 -> 160 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/77dfcf5329baff3430c0bb270ee43fcf6b216238bin0 -> 96 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/798e448161e03d40712655f913464a276b6d6129bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/79b2bfe9fcf1eab62e921dcc2f64b778d34802d8bin0 -> 161 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/79da19253d7fea59733d2a5276bb393918f014d1bin0 -> 193 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7a17b28c4e274868a9f9a8430ddd12d07221396ebin0 -> 430 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7a5a769942efac79863bb154cf1e7574e6d98e22bin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7aabe800afb737ea6e5e6068d89c76fdbfd448d0bin0 -> 331 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7ac32e7febefac7cda0a019b2b9276b97bb91c4abin0 -> 191 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7b1ad173c2ce60dd9f82143be5db1cbd317f8a6ebin0 -> 311 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7b747e0fabbfae7ecb4e9e8261121aaa42a21cc2bin0 -> 311 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7bd868f9aba4f89259c14358aff16d00114b2897bin0 -> 164 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7c9b85db0b4648d13fd8a0de2de9bebdba555fa8bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/7fe27d0f43c09c4070f479163e1479440c4bc7ccbin0 -> 325 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/801f08f6085a2986fb868d326c71bdcb16df1481bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8102033256a24f00a59a0f23640d379eaeaba37dbin0 -> 226 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/815f39659d787ccae06bc7d1e0564525c27b9b79bin0 -> 50 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/816a1c7d02100fb495ab698923f8f4e550583e91bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/820b97903732cf20dae26cdba0717220fa042a49bin0 -> 240 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/829a44d34a4c591b8808aa5eb283869e0fece45bbin0 -> 124 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/83371e1fa4720aae8035d7dc955d376678e102efbin0 -> 183 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/83566906d8ca1b2296d7d9042e1196a1cf69ab9cbin0 -> 24 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/83b2491b16c26c0dbb6aef5a9df10a3fa83beea2bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/83b62e268ed5ffc26a1a97562e087791f46d3552bin0 -> 122 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/83df07a7e069d0932a221e28a2d47e449ca37c3fbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/840959b26ce65b833d488ebb7b1d8431839fe701bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/84316630fa8962f4753dda6e6c75625c47d19675bin0 -> 226 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/858a8d611419ced08aa85e89b75ff7baa1d9a791bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/86bac2d397ae2c0c178171f1f9daf7a8603c6d7abin0 -> 298 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/87489d217ddd2fa2803947a38d66a9935f64fe63bin0 -> 651 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/879979038a496564beb9a0ae1d70cb20c7e6db75bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/882b03ed3abc37b43412e8396cdf3fb8b0eeb931bin0 -> 365 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/885a929a4baa3d32ce354f4815476530122ff85dbin0 -> 181 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8892fb3ac741bd31d9181ea72dd948e1ee0b1b21bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/88cfd0e937486a6488e0e9f1fcd7ffeafcb4d6fbbin0 -> 318 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/89d8350297ce5dfc2a69e6e96afc86dba2bc3548bin0 -> 74 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8a93c1f4fb3540901374100ee96dfb892bbbd767bin0 -> 72 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8b00c51372acb33d4714fd7e012749bf44cf7b3bbin0 -> 189 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8b37d35809a85ae26de6537b3a48da7b7b62bea8bin0 -> 663 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/8d1242821c2d5fc81c8e0b397d91cf75cb1b5f2cbin0 -> 245 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/904edc7bb14e4da0172f3d58a74c8abf141da9fbbin0 -> 25 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/90a94b19bcf5aed7bfee94764acc906e889e47f8bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/910246d4e894dbf88b09e9c1994e0f7bd563bcc5bin0 -> 409 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/913614cd0ae1b1210d2f1bc354b876080726f7a8bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/91434e8bf241b54d98e0f664a12ecf5c9d144a8dbin0 -> 107 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9234bc18b3034e133fc3111f977f10d91f9d59b4bin0 -> 71 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/92931bee49467ae7468775488a8c1651795f1b18bin0 -> 333 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9597f6d2dbabda14eea4977e2156e3ace4ede00abin0 -> 443 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/982b2be980211b25a087a27ea5125f3788b5aa97bin0 -> 110 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9855bcd261c7b4e11d17bf4f7d4d527b53d3b71ebin0 -> 50 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/99c05d9bb9dd3b8205330e5265bc7dd94bcf87debin0 -> 39 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9af196d78bf8651de03ee495e4d115be490794cfbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9af5a1b29196f103190ab18c92704f7082c6b271bin0 -> 839 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9b48fd4471f6d515bed4bffa94a639365d395b99bin0 -> 305 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9bdad64c1862a8d642f398bf7bb62e22a1cd4270bin0 -> 374 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9db023b0a0d183149764d21e7f8b2b2990530848bin0 -> 427 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9e8e83f61559c6dcc7e870f7ccb3ab13f1224229bin0 -> 376 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9e92e4e30e68bf65fb59e9f34ed4967463212df9bin0 -> 164 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9eeac17d6b28b8ab214d4164a49576ce500316ddbin0 -> 112 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9ef6a972458b736cdcb1b875bf896104b3a1c74cbin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/9fc918600ddb20914d93a0b979646b49530ce46dbin0 -> 111 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a0290b63e02c1785b3cc80863343076a7f3e1a7bbin0 -> 349 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a083ea58077e52898ae8a9a4dedee4cf8de89229bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a1446ccd5f12ac05d1cd4fcbad5ce1d3a6cc7e96bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a2b9d39f9d1aa03f26b41f780c7a4f5ff826e6e1bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a2eb6f5e20c5171e7144f177d296eb00181ce461bin0 -> 128 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a3469cc29207d27c818b2299bab7e7c5dde3ffaabin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a3c40637baff1a88fe081a0768bfae5dc3942006bin0 -> 250 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a404f3f4dbe1521cc977ed94ea50c49dbd6e32a2bin0 -> 110 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a5089985010ccfa7630185464308aa5247f55de1bin0 -> 164 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a660e999019a7dd3e950b51d6fa8f453390fb504bin0 -> 301 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a675a6268dee809602632cddca94ea708473bba1bin0 -> 200 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a736ade657d046ea859cf50fe1ef044e02ca38e5bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a85197b7cf312c8df9701404af23088f8681313dbin0 -> 115 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a89d59f59e43670ca3e8baf454fea723ae295653bin0 -> 72 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a8be97dcf19ed2a7786763b4edfb48ca7f2790f6bin0 -> 69 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a8c9f7043c578e48be49661be5207ceb9ec1b61fbin0 -> 70 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/a9772b34aba5938ee56f517134db801a158f2849bin0 -> 323 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ab48d54113cb27083943467533d1872ec13da0e7bin0 -> 215 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ac386c17e9e82472939d4052ff7959aeb1d5dea0bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ac59c58dd4b05b6e3c4bae4db3b39f44d12a60db1
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ac7b2971ff39a368145148524511dd68df83d522bin0 -> 183 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/adf1ecc62e1089054db8af9e380cd77323b62970bin0 -> 24 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/aee8da0d3f1d4f3c54bfefb5d53df17c6740fb37bin0 -> 113 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/af321dcdfe085aae585cf48f59b51233b60df59bbin0 -> 301 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/afd047f5586f07990fa2efd6c67d3a7c55099c53bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/afd6dab057fcf62e73429067d983a5f442f3a70ebin0 -> 26 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b129aaeced0d135d8431960a3b3f85bef20f552bbin0 -> 193 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b2d1b3137b5ecdc255a76bf6206ed21ea927b6b0bin0 -> 303 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b3776ef844b4910a2cd6d149dc13fb57bd523ac3bin0 -> 694 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b378146c4a1b41bd16319156c653534f1e391c7dbin0 -> 471 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b536cad032468c127123ee059efe977f7fe6894dbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b5efe698d1ee1d878ef6db9a19d5f7c951514faebin0 -> 590 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b70abef1bf2c649cf31720136a099a88cff8d562bin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b7ad6cf88b52c0d558ef6a122c67b7807a659f36bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b7ce7c97e81ecd2db09491172235b43340f4b352bin0 -> 426 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b86f7032cb6eae67d834bde583597ba802f5d252bin0 -> 129 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b8f18df0db1484d024e41f58d15e8afb710b35eebin0 -> 275 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/b94cf6089a6e37c5aaac27741d61f71bbb7eeee7bin0 -> 110 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ba73b25c18f6fa6aeca8fca834852d3750b079d1bin0 -> 510 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ba8c20002a96d94f326dcc9a83c58241d35091c3bin0 -> 132 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/bab597264c721da916f0245906c4c471547aba89bin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/bae341809e6f5bfa1d24064e2d5adc2c793f4240bin0 -> 174 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/bb36649f74dfe7113fd1391f24d490ceae8f9b21bin0 -> 234 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/bccdc1e95be1de56746e95d167a24ba805f9172abin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/be53fc99a0c00fb2172b6960389a78b2e2a55b4cbin0 -> 181 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c059728bdb63747b6ebb3e345ac4c5ec5f8363afbin0 -> 374 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c08401badfe37023ba5e0e751d022616fcbefcbbbin0 -> 183 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c2006fdf68d2a4cc0b31410d00e4dfca59315e85bin0 -> 297 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c200cd4190048ba3b72b76274b2976b04110efc9bin0 -> 95 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c27d7d33b13570c014385799dddf1d8805fc1735bin0 -> 137 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c39dab787a7c73972a3cbd69fef3775f55c90639bin0 -> 78 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c467053b901e28634f7e7891ea361961d94b097bbin0 -> 174 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c54b7c1255412a6d4e9608d14fbdb235a7a86d9dbin0 -> 112 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c5590a6799d6633ba08cc1f75e1a7d0a54d37e68bin0 -> 299 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c58819f4e12e3ee2ce3adb89b6f93567db2d5c8abin0 -> 759 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c5dbc50d9174bde5542b2bb18c63f6583a23ff13bin0 -> 179 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c5f36039c543bb52b1b2ad235934790c4c34dccdbin0 -> 429 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c5f3e7e54fb624b5f5436e1101fb8dd74d2dac19bin0 -> 611 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c604f2a6f2a3c2f38e8cf0ce99c78e2750a83454bin0 -> 305 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c60e077197a6659e362fba14ff9e4eacee647674bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c649b5285bd40e0614cb8b8b4001b80c3d3cb4a5bin0 -> 650 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c6932577ed27915bf469939c61b1283354308a68bin0 -> 160 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c8ccc96fa43f1446ca99e81e7440a3542b3a6ee2bin0 -> 446 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c8e01950d56d7c8d08a5cce94c6306c03a135219bin0 -> 307 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c8e12ea9590ffbf0d6a10a582338856fa217ff6dbin0 -> 339 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/c90aaaf79d46aeaf533e62dab54506d8ab2a3e5fbin0 -> 227 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ca54a837cfaf7edc71961ff1fe52d4c3cd86675ebin0 -> 103 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cae359a6dabcf11786350360c2cd2aebf0b7a094bin0 -> 196 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cba1122fd86ce20b417cb34edc294f19f1303faabin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cbace6de751ef04cd6c12f74f37c5bb3e3b0b219bin0 -> 741 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cbd7f8b4148a1cac0c012afd3c73baade2dc572cbin0 -> 534 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cbde71efff4119c58459a93b2e1692182521b960bin0 -> 375 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cc1b857893cf971cf7783d53d25693e642b03effbin0 -> 650 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cd5982304e5979e6056a77c4053b232e0963e0e5bin0 -> 669 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ce72561eada7f9b9e8b0f0e658ccebb4f5b983d6bin0 -> 314 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ce95d2fc5b099365cd781aa7e2b297ac92a215b3bin0 -> 70 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/cf3fd86be6611e52e7a3faefd2d1e0082c3a8859bin0 -> 542 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0597bbdd657fa4ed14443994c9147a1a7bbc205fbin0 -> 21 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0f6e7b5dd0ad53297bd9daa497dbf851b5385b16bin0 -> 495 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-113a1e09a1c0787f1be875c6cdcf4415f8155ee3bin0 -> 453 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-168a72ed6115591c637fe99f50cac5e6bf7ded79bin0 -> 31 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17ad251e24eaa152ded652bfe04d656fdcad28c4bin0 -> 180 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17c0775f8b51f7b8742602e4321ac5827e64e3ebbin0 -> 165 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-1bf04a83c67f216c7643d69677da5e6cbc708d88bin0 -> 254 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-23a35ebad0178cc632fd62f6852d2f6fa5d1fe32bin0 -> 137 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-24bb600e0530fcce70d21fece0cd70056ed8a6b9bin0 -> 153 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-278279ec7b937b1c944029bc57ae0ff0fbb13415bin0 -> 176 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-2cc124fe461b11185467384aebe18711f28bcfb7bin0 -> 184 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-3699c47aaa794b48df814bd3b5a982c377063bc7bin0 -> 294 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-404a40c85b887a53235484f4620da325872eca49bin0 -> 283 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4195e7f3655955a8b386d1b17ab855c08ebec548bin0 -> 237 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-41ad52e1376596e9ac3c22be039975e223645b4abin0 -> 494 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-42d2e80906545a50b4b5b37278132b764296c031bin0 -> 495 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-43f9633b24fd27f1bbe8884ec506197e52001797bin0 -> 375 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-454e9d66253c206916e1bea69bdaabd8bb8c982cbin0 -> 199 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-497e1c1554a8e021ba6c02ffdd2a4d809669c60fbin0 -> 484 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-49c4f247eb2aaa8f4474aec363e203e557948bc2bin0 -> 122 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4af36327fb381a5e5af2072f038a10e36368bdd3bin0 -> 135 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4d51faa099fbe0900fcf30461a6be12dc80dde16bin0 -> 206 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e19149430212fc0ed7be30854bfe538572d33b6bin0 -> 493 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e297b6205976cf94c8ccbcbf12277efb8ade986bin0 -> 257 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e6ec3d9abdaf620dad4cd2f2c206c29e8d9ecc8bin0 -> 513 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-50e18d167be26c8e19877d88e9b53591f4c8b029bin0 -> 522 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5827f4af3145108483e4f410e1427e7a41c4d3ccbin0 -> 119 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5854cfbb68190f86a40492c5ca8e15c0fc062168bin0 -> 237 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59e58120d4f37a833a79e68372c4eaf361a92240bin0 -> 179 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59f857e19c386154d65c48a72cf1e4e69aefd1babin0 -> 206 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5ba35fa4177ca59450b597dd1a2d48f8a68959ddbin0 -> 210 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5c52df7b4025baa05218c14a3cd535914445c42fbin0 -> 180 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-603222da20c147a532188e80fc1a26e4e8bc4beebin0 -> 192 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f1b8715edddbf0aa17fe9ee0fbf02ff7c92807cbin0 -> 522 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f5c899196cb31232d2d6694be43e1ac0a662f48bin0 -> 438 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6fad807070626f184704ea082667ebe780369f74bin0 -> 496 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-775a43af5d81808d1ccbcc43aec12ce14aed8a53bin0 -> 335 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-787fc772315a87e40b63fbc25fb703a87581f0e7bin0 -> 265 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7a4ce28ac085ce3763fe91e24bdd92914d134a3fbin0 -> 364 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7c6eb73a27b693a346f309370e965d0d62048503bin0 -> 479 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7dd4bf6d825fb4e9a43506aff001119c7e8f00acbin0 -> 345 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-83f6929c001d26c25c5d0f63ba0bcc099b9959bcbin0 -> 409 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-85fd89292e43c2a2338f86e46d10fffb6f85ed88bin0 -> 177 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-864c58c601ce89a5191fc6e665dff0812a6e4bfbbin0 -> 671 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-8c44d14673d21592ff930297b2307096d9f7136fbin0 -> 121 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9137b1dc16097e720a1837a2117f43b940180f3dbin0 -> 82 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-91964f1b7d1bc2460d93775fb64c7e6f737ce634bin0 -> 323 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-949b13ffa41b1c202fd74d4c9cd45e840aa9d0f6bin0 -> 337 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-95e740aca3d281f30929d51a628cdfab4ca863adbin0 -> 282 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9b205954747d5f120b36e004116fa2fe22cd5105bin0 -> 32 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9c2cf43a9cdba7a35485fadb0b0424a88f7d7b8abin0 -> 374 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9f50180d69973cd2187ecba50fc2894edf6a341ebin0 -> 170 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9fd80ce4eeb83cdea4eedd9995ffc53d640e692ebin0 -> 263 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a15f2c17a8fa204f3183fd7422876f28ef7c85eebin0 -> 111 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a21d5f69a1433ba0580840405fbd66f3b3569104bin0 -> 400 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a2ff9a686f9775c715870fa2f25b600471ca8c01bin0 -> 410 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a6ec7e9fef2e54036de257f5e7da3e87ea1f39f2bin0 -> 21 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ab3ecf04012140fdabae0d037189eedb24516d04bin0 -> 204 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b39ce8e62e5c9e046d67e946436609e01f067a53bin0 -> 240 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b479e66d221f3db92c31b6b6aace69599f648d51bin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-bd17ab1e7e9328739f455641e8dfa11951ac742abin0 -> 466 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c0413dd6857d1ed3e5484df5e70656356f3c997abin0 -> 556 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c1a4c1aa8b4f1b081993f93ca92a1136a7302be5bin0 -> 421 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c42d2add77ba492df95cfaf2e4e08e56818368cebin0 -> 343 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ccb9f8221fd8fcacc5fb4a3c251fc06104027dddbin0 -> 802 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d5b0e587cafc10b7878bc691b6fcb7c1164e7558bin0 -> 122 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d61454675241d9df9049f5bd57f47326059d7132bin0 -> 165 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ddac3b604ee6d4a51161a267b688a3b72fb6768dbin0 -> 134 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-decf36e136646eb3ab44fc4c5f327ccd99ddea88bin0 -> 176 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-e4d4b51cc7731d12daee738c4b81158a03302ebbbin0 -> 279 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eb5d258a429fa9c20f8513211a33100abd5f8f3fbin0 -> 189 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ee032544a2c1487469cc17f870043f4d513999f7bin0 -> 187 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eec019a7a40f5d8f8c0e9c72215286f442a9b150bin0 -> 283 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-f0c7e2cc8f8587bcab636a63191b2fd37e0cf8aebin0 -> 665 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/crash-fc088cee74d4e8dd791291b5575fc0fe9fe7378dbin0 -> 388 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d0541179f78beb9037070ca52969526b83eb608abin0 -> 332 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d05a854e44c9c6f0dd0c58e6bd305e6fe48c32f5bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d2a63dcb354906d4d67104ba2a1f5e97a6196183bin0 -> 65 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d33e33320e5165dac72007845a86a9709d75c42ebin0 -> 129 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d48c4a56dc90b16a14dbf9934fc3ce7c9706104ebin0 -> 288 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d4a7be7c4a826d8151d5d7c1c781143baf90ff28bin0 -> 185 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d53b67bdedf136125bbee00d136720efa23898dcbin0 -> 304 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d63dab7d78a0a58c37631e488b1eeb7c2bb67e34bin0 -> 287 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d73ee327123be0e9bc72485b5517dd1bf691e249bin0 -> 65 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/d7e298c12f97064ebe494593ecbe26df96f7f84dbin0 -> 28 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dc6db500586253e4b9b0adeb20214327990d790d1
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dcb9a8007d2693d35911dfcde7ae960adbeb2601bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dcf71fe33130be78708d234005f8bb4f4b06d75cbin0 -> 162 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dd19b226a1c60dceee7e656cee561b4acfe77aeebin0 -> 174 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dd6d1ddb251fc3574733232c4a85dabdcf60d4c3bin0 -> 189 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dd8989a51df53e6f0a59959a8b5ad411c9fa0ba2bin0 -> 663 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dd8c099f1687f8b0581481a75f8844f6118d4a66bin0 -> 526 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/de0f7b6518fb5dd14f29ec66dddc5af50370b3fabin0 -> 166 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dec7ea8faa2bbbbada2adc0a9e52d0335004869fbin0 -> 427 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/df272aa4f3370128af034e7f5dd1524246b72d83bin0 -> 377 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dfb8a3c29f657d533b0d940ffefe599cdb85120fbin0 -> 649 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/dfd6e1fef6b2737e4d1c56db648a958bcce0a889bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e048e989af2d9aec0d63f72fa8feede387114779bin0 -> 163 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e0588c306f2ab329d6c4bd3226e8a55e83708c1ebin0 -> 315 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e061b554b941636414621e0a54d2d1c7014a1ac4bin0 -> 313 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e14dbfabfdbfa666e68562b0e854544e76f5446dbin0 -> 163 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e16c732d28873c13aa0e6cc4af1880c8c6eb7367bin0 -> 118 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e280d72b157d00bf77608bd7b16afd2f5550a06fbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e29bab478641dd412057dfb6b0a0d78afd96dd60bin0 -> 279 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e2abd47fcabc336d25a4e65f2c46867234c85cfabin0 -> 426 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e2b07847cba288469491f873561bf4f2acf09393bin0 -> 117 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e3854bc2e1bc52f498780be3147d6f870e85d8afbin0 -> 312 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e3c84286df55942bc2673eaaca844ebf5892b080bin0 -> 545 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e4238ff612439be100fc2188bffa6aac1d7e5e5cbin0 -> 375 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e42a3228f11b2c16ab3ec082c521905e390e356ebin0 -> 184 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e45762f05b01eb2c781cc8cb15db74a31d97566bbin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e48ae5d10ab8c349250e8c6b9a491a154b4a861dbin0 -> 90 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e4da3ef8c789c4c243b9d0787f94aca5ab232103bin0 -> 111 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e4db5d1742f4336c13a7941b3aacfd352a6db462bin0 -> 164 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e62a93cf5ead5a0c5e4cd13bce4cfe83c54b1c5abin0 -> 396 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e6523bc48bc3bbd56cbaf034e016c1fe56b76096bin0 -> 621 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e7ac184d872400a6d5af852ade5adf9d68c97058bin0 -> 95 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e814c704e36a84f75c235985a13d58fd1eaa8e01bin0 -> 314 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e8324e1c5c1541f327f848821074ed0b9b0a4b41bin0 -> 664 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e8616e0840a6d4077b322fa2b1906d1fd4c406bdbin0 -> 426 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/e9ae17566804496b92d2ddcf99129436d771fb81bin0 -> 175 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ea5ba8919404e2a04f38b17e7e3031a5586a2d0cbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/eaf587f7f303dda3ccc5becc6e645af7a47b36bfbin0 -> 182 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ec89eb7e84e6cf7859ab478362e0ae5227a5e154bin0 -> 98 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ecf186f5cf01d52568516a56b3f5d752edd56827bin0 -> 103 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ed3b22b78763a426595a8ebc05d07004cc80aaffbin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ed96c5df96beb5a2bdc4424c38e60fe74da080a2bin0 -> 291 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/edac3a36778a1b2db96c3c07435696b9aca94c24bin0 -> 115 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ee147e7d7ca7937fe37d2bc2aed053ef1e396b07bin0 -> 179 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/eed65ac63a044c87423f333f3b9c5f0d3bc7bd3bbin0 -> 135 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/efc7a168a1060d04234a3acd3da42a80e49eb72ebin0 -> 377 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f0d8a858c5459aa5f6b2777b50a736dc8645708dbin0 -> 77 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f0fdf87e2d0f86481b6ae05a55cb108c5763ab53bin0 -> 365 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f157bcc470de43462d90bc95ed4a063caac77a93bin0 -> 374 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f1f390731dc9ae4194a528df462fb07736796e5dbin0 -> 73 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f27b422b6c15da10aa282fbcdc0f1ad9e4813c83bin0 -> 80 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f28eabe16ec69e9200f3febad09e4ae4514ec0e2bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f3259c7e2397f3c8d0664c7c5e1a6758c0874e51bin0 -> 384 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f3809c7a3770a31e892dc396a388642c02624713bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f399656ccd610dfdf61556d22d3e1044d7335d6dbin0 -> 174 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f3fba021c9e4cdee8ea694017ae1e40f55fead5dbin0 -> 193 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f5921e18d4b2628142abb0597d87eab72c535c19bin0 -> 133 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f7f567d97a49158b053ebdc1b20e9ab5640ffb5bbin0 -> 304 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f7f76d0247a67a5be4a32b33756cba36b16bc025bin0 -> 199 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f80ebea47ad5fefe472da7af6cfb3eb0e3b5f516bin0 -> 162 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f8247b46413793b558009f646e262029edc0a319bin0 -> 383 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/f969f53d5cfed53ceb7df67bfe619b08f6b0841bbin0 -> 158 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fa2ff7bb76b0025211b2f8bd05ef62e42db92621bin0 -> 150 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fb4e6a537eb5540e22108fc9e9fc14bfe4eb6acbbin0 -> 144 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fb76689d3c70bd5927b3256eda9738a2208e2b13bin0 -> 74 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fc3c6bdc85b45374d3417035e813eff18e07614ebin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fc5f8421028a5f12b68be86eb12af4c945947f69bin0 -> 473 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fccbb9620ab9c570f5dda169c7dd8ab907ea3161bin0 -> 345 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fd825fd14341b700853b72e4fea0899c2dfb441bbin0 -> 168 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fd9e3ed58eeac32972d96a3adf1857bb598896b9bin0 -> 167 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fda1d52ffb49a46cb9d3ccedfc82e2425f6d4dfbbin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fdecd05733278ece9993eb2bef13917675cc062cbin0 -> 199 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/fef08f9549a14a65f1135a00da7d6b4eb7a03e80bin0 -> 169 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/ffae95db59780f530e4d891bb26f6843cf361bc9bin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-1b475868d1f5313d0b7c58fc1652108d84da6112bin0 -> 695 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-a1b05639643aee995cb8995e26e7698911c182f6bin0 -> 305 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-e861dafbe5a18d7ba97d92c49a3ce09df2877804bin0 -> 383 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer.c10
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4bin0 -> 323 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8fbin0 -> 266 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7bin0 -> 1110 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36bin0 -> 51 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3ebbin0 -> 653 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780bin0 -> 442 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5dbin0 -> 1858 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61bin0 -> 948 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858ebin0 -> 549 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4dbin0 -> 862 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cdbin0 -> 1012 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844bin0 -> 1070 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85bin0 -> 184 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229bin0 -> 1011 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918bin0 -> 387 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0cbin0 -> 554 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9bin0 -> 273 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92bin0 -> 826 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bdebin0 -> 1310 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39bin0 -> 505 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22bin0 -> 25 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457eddbin0 -> 234 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4bin0 -> 818 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6fbin0 -> 802 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863bin0 -> 607 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19bin0 -> 913 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03bin0 -> 66 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01bin0 -> 296 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159bin0 -> 574 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0acbin0 -> 64 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269bin0 -> 493 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4bin0 -> 136 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357bin0 -> 523 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230bin0 -> 67 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995bin0 -> 62 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cfbin0 -> 447 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192bin0 -> 1390 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0bin0 -> 479 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991bin0 -> 309 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106ababin0 -> 266 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8fbin0 -> 234 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1bin0 -> 184 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcfbin0 -> 864 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712bin0 -> 60 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150bin0 -> 147 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565abin0 -> 172 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2ebin0 -> 63 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01bin0 -> 136 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19cbin0 -> 385 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67bin0 -> 23 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50fbin0 -> 494 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502abin0 -> 173 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78bin0 -> 224 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4bin0 -> 486 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437bin0 -> 234 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7bin0 -> 1565 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4cbin0 -> 1310 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286bin0 -> 39 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0abin0 -> 1122 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74bin0 -> 974 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009bin0 -> 860 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1bin0 -> 50 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5bin0 -> 449 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04bin0 -> 296 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6ebin0 -> 856 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fdbin0 -> 644 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352dbin0 -> 373 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9dbin0 -> 37 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6bin0 -> 136 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824bin0 -> 401 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0bin0 -> 863 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56bin0 -> 1310 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217cbin0 -> 474 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245bbin0 -> 1389 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719bin0 -> 828 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9bin0 -> 494 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6bin0 -> 1104 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eefbin0 -> 136 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cdddbin0 -> 819 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4bin0 -> 816 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20bin0 -> 223 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18bin0 -> 278 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9bin0 -> 401 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152cbin0 -> 1729 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8bin0 -> 802 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490ebin0 -> 789 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92bin0 -> 61 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339bbin0 -> 21 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4ebin0 -> 566 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5dbin0 -> 65 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0bin0 -> 763 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30acbin0 -> 803 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3bin0 -> 817 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7fbin0 -> 863 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fcbin0 -> 892 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7bin0 -> 148 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379bin0 -> 64 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116bin0 -> 762 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aeabin0 -> 71 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7ebin0 -> 64 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653bin0 -> 870 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162bin0 -> 762 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2bin0 -> 66 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_headerbin0 -> 18 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2bin0 -> 27 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884fbin0 -> 504 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7bin0 -> 46 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20abin0 -> 761 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8bin0 -> 505 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9bin0 -> 46 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9dbin0 -> 761 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5bin0 -> 268 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5bin0 -> 306 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0bin0 -> 862 bytes
-rwxr-xr-x[-rw-r--r--]test/core/end2end/fuzzers/generate_client_examples_of_bad_closing_streams.py (renamed from test/core/client_config/BUILD)28
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer.c10
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0ccbin0 -> 52 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41bin0 -> 2046 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671bin0 -> 54 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57abin0 -> 57 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02ebin0 -> 310 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0cbin0 -> 100 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1bin0 -> 1143 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21dbin0 -> 53 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9cbin0 -> 60 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1bin0 -> 832 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069bin0 -> 255 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71fbin0 -> 59 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9bin0 -> 261 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054bin0 -> 58 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397bin0 -> 58 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212bin0 -> 101 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13ebin0 -> 650 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1abin0 -> 60 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783bin0 -> 257 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176bin0 -> 285 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47abin0 -> 286 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffabin0 -> 357 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7bin0 -> 1186 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89bin0 -> 56 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7bin0 -> 265 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedfbin0 -> 101 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57bin0 -> 55 bytes
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941bin0 -> 286 bytes
-rwxr-xr-xtest/core/end2end/gen_build_yaml.py304
-rw-r--r--test/core/end2end/goaway_server_test.c10
-rw-r--r--test/core/end2end/invalid_call_argument_test.c27
-rw-r--r--test/core/end2end/tests/authority_not_supported.c194
-rw-r--r--test/core/end2end/tests/bad_hostname.c2
-rw-r--r--test/core/end2end/tests/binary_metadata.c54
-rw-r--r--test/core/end2end/tests/call_creds.c26
-rw-r--r--test/core/end2end/tests/cancel_after_accept.c59
-rw-r--r--test/core/end2end/tests/cancel_after_client_done.c14
-rw-r--r--test/core/end2end/tests/cancel_after_invoke.c11
-rw-r--r--test/core/end2end/tests/cancel_before_invoke.c11
-rw-r--r--test/core/end2end/tests/cancel_in_a_vacuum.c8
-rw-r--r--test/core/end2end/tests/cancel_with_status.c14
-rw-r--r--test/core/end2end/tests/compressed_payload.c37
-rw-r--r--test/core/end2end/tests/connectivity.c10
-rw-r--r--test/core/end2end/tests/default_host.c2
-rw-r--r--test/core/end2end/tests/disappearing_server.c19
-rw-r--r--test/core/end2end/tests/empty_batch.c13
-rw-r--r--test/core/end2end/tests/filter_call_init_fails.c20
-rw-r--r--test/core/end2end/tests/filter_causes_close.c24
-rw-r--r--test/core/end2end/tests/filter_latency.c367
-rw-r--r--test/core/end2end/tests/graceful_server_shutdown.c11
-rw-r--r--test/core/end2end/tests/high_initial_seqno.c17
-rw-r--r--test/core/end2end/tests/hpack_size.c17
-rw-r--r--test/core/end2end/tests/idempotent_request.c19
-rw-r--r--test/core/end2end/tests/invoke_large_request.c25
-rw-r--r--test/core/end2end/tests/large_metadata.c14
-rw-r--r--test/core/end2end/tests/load_reporting_hook.c29
-rw-r--r--test/core/end2end/tests/max_concurrent_streams.c33
-rw-r--r--test/core/end2end/tests/max_message_length.c118
-rw-r--r--test/core/end2end/tests/negative_deadline.c14
-rw-r--r--test/core/end2end/tests/network_status_change.c15
-rw-r--r--test/core/end2end/tests/no_logging.c25
-rw-r--r--test/core/end2end/tests/no_op.c2
-rw-r--r--test/core/end2end/tests/payload.c31
-rw-r--r--test/core/end2end/tests/ping.c2
-rw-r--r--test/core/end2end/tests/ping_pong_streaming.c21
-rw-r--r--test/core/end2end/tests/registered_call.c22
-rw-r--r--test/core/end2end/tests/request_with_flags.c11
-rw-r--r--test/core/end2end/tests/request_with_payload.c14
-rw-r--r--test/core/end2end/tests/resource_quota_server.c381
-rw-r--r--test/core/end2end/tests/server_finishes_request.c17
-rw-r--r--test/core/end2end/tests/shutdown_finishes_calls.c11
-rw-r--r--test/core/end2end/tests/shutdown_finishes_tags.c2
-rw-r--r--test/core/end2end/tests/simple_cacheable_request.c17
-rw-r--r--test/core/end2end/tests/simple_delayed_request.c30
-rw-r--r--test/core/end2end/tests/simple_metadata.c17
-rw-r--r--test/core/end2end/tests/simple_request.c19
-rw-r--r--test/core/end2end/tests/streaming_error_response.c15
-rw-r--r--test/core/end2end/tests/trailing_metadata.c17
-rw-r--r--test/core/fling/client.c4
-rw-r--r--test/core/handshake/client_ssl.c16
-rw-r--r--test/core/handshake/server_ssl.c14
-rw-r--r--test/core/http/format_request_test.c74
-rw-r--r--test/core/http/httpcli_test.c11
-rw-r--r--test/core/http/httpscli_test.c11
-rw-r--r--test/core/http/parser_test.c32
-rw-r--r--test/core/http/request_fuzzer.c4
-rw-r--r--test/core/http/response_fuzzer.c4
-rw-r--r--test/core/internal_api_canaries/iomgr.c4
-rw-r--r--test/core/internal_api_canaries/transport.c2
-rw-r--r--test/core/iomgr/endpoint_pair_test.c6
-rw-r--r--test/core/iomgr/endpoint_tests.c52
-rw-r--r--test/core/iomgr/fd_conservation_posix_test.c6
-rw-r--r--test/core/iomgr/load_file_test.c46
-rw-r--r--test/core/iomgr/resolve_address_test.c129
-rw-r--r--test/core/iomgr/resource_quota_test.c698
-rw-r--r--test/core/iomgr/socket_utils_test.c67
-rw-r--r--test/core/iomgr/tcp_client_posix_test.c4
-rw-r--r--test/core/iomgr/tcp_posix_test.c84
-rw-r--r--test/core/iomgr/tcp_server_posix_test.c16
-rw-r--r--test/core/iomgr/udp_server_test.c2
-rw-r--r--test/core/iomgr/wakeup_fd_cv_test.c7
-rw-r--r--test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536bin0 -> 59 bytes
-rw-r--r--test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19bin0 -> 49 bytes
-rw-r--r--test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80bin0 -> 65 bytes
-rw-r--r--test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34bin0 -> 50 bytes
-rw-r--r--test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471bin0 -> 50 bytes
-rw-r--r--test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5bin0 -> 78 bytes
-rw-r--r--test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2bin0 -> 97 bytes
-rw-r--r--test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28bin0 -> 56 bytes
-rw-r--r--test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64bin0 -> 66 bytes
-rw-r--r--test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0bin0 -> 51 bytes
-rw-r--r--test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88bin0 -> 66 bytes
-rw-r--r--test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da7321
-rw-r--r--test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3bin0 -> 55 bytes
-rw-r--r--test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1bin0 -> 120 bytes
-rw-r--r--test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24abin0 -> 63 bytes
-rw-r--r--test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422bin0 -> 60 bytes
-rw-r--r--test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193bin0 -> 51 bytes
-rw-r--r--test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0cbin0 -> 66 bytes
-rw-r--r--test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e3789001
-rw-r--r--test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfbbin0 -> 56 bytes
-rw-r--r--test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3bin0 -> 66 bytes
-rw-r--r--test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028cbin0 -> 55 bytes
-rw-r--r--test/core/nanopb/fuzzer_response.c4
-rw-r--r--test/core/nanopb/fuzzer_serverlist.c4
-rw-r--r--test/core/network_benchmarks/low_level_ping_pong.c31
-rw-r--r--test/core/profiling/mark_timings.stp2
-rw-r--r--test/core/security/b64_test.c70
-rw-r--r--test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690bbin0 -> 158 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950abin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656bin0 -> 473 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15bin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103dbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13cbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cfbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200bin0 -> 43 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01bin0 -> 470 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595ebin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436bin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0abin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3fbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fdbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655bin0 -> 172 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219bin0 -> 63 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84abin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47bbin0 -> 61 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1bin0 -> 42 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253bin0 -> 471 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7bin0 -> 63 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68ebin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17bin0 -> 43 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89ebin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0bin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0bin0 -> 7 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527ebin0 -> 314 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c1
-rw-r--r--test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3dbin0 -> 43 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802dbin0 -> 46 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972bin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd602
-rw-r--r--test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038ebin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0bin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5bin0 -> 395 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682bin0 -> 315 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bbbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8debin0 -> 42 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa1042
-rw-r--r--test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329bbin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750ebin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c1
-rw-r--r--test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ecbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2bin0 -> 161 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1bin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22acbin0 -> 472 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41bin0 -> 314 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575bin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8fbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6bin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806bin0 -> 317 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377acbin0 -> 20 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcdabin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4bin0 -> 313 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05bin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05bin0 -> 65 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae1
-rw-r--r--test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9fbin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207bin0 -> 43 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870dbin0 -> 165 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8bin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7ddbin0 -> 157 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a41
-rw-r--r--test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98bin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cfbin0 -> 155 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57bin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f9191
-rw-r--r--test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82dbin0 -> 62 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39dfbin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1bin0 -> 64 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9aebin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8bin0 -> 43 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1dabin0 -> 314 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040bin0 -> 312 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251cbin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16bin0 -> 156 bytes
-rw-r--r--test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1abin0 -> 311 bytes
-rw-r--r--test/core/security/create_jwt.c10
-rw-r--r--test/core/security/credentials_test.c45
-rw-r--r--test/core/security/fetch_oauth2.c6
-rw-r--r--test/core/security/json_token_test.c28
-rw-r--r--test/core/security/jwt_verifier_test.c84
-rw-r--r--test/core/security/oauth2_utils.c12
-rw-r--r--test/core/security/print_google_default_creds_token.c5
-rw-r--r--test/core/security/secure_endpoint_test.c39
-rw-r--r--test/core/security/security_connector_test.c17
-rw-r--r--test/core/security/ssl_server_fuzzer.c145
-rw-r--r--test/core/security/verify_jwt.c4
-rw-r--r--test/core/slice/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6 (renamed from test/core/support/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6)0
-rw-r--r--test/core/slice/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537 (renamed from test/core/support/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537)0
-rw-r--r--test/core/slice/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3 (renamed from test/core/support/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3)0
-rw-r--r--test/core/slice/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695 (renamed from test/core/support/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695)0
-rw-r--r--test/core/slice/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb (renamed from test/core/support/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb)0
-rw-r--r--test/core/slice/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9 (renamed from test/core/support/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9)0
-rw-r--r--test/core/slice/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a (renamed from test/core/support/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a)0
-rw-r--r--test/core/slice/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248 (renamed from test/core/support/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248)0
-rw-r--r--test/core/slice/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5 (renamed from test/core/support/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5)0
-rw-r--r--test/core/slice/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688 (renamed from test/core/support/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688)0
-rw-r--r--test/core/slice/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9 (renamed from test/core/support/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9)0
-rw-r--r--test/core/slice/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d (renamed from test/core/support/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d)0
-rw-r--r--test/core/slice/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759 (renamed from test/core/support/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759)0
-rw-r--r--test/core/slice/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f (renamed from test/core/support/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f)0
-rw-r--r--test/core/slice/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1 (renamed from test/core/support/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1)0
-rw-r--r--test/core/slice/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4 (renamed from test/core/support/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4)0
-rw-r--r--test/core/slice/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63 (renamed from test/core/support/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63)0
-rw-r--r--test/core/slice/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223 (renamed from test/core/support/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223)0
-rw-r--r--test/core/slice/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae (renamed from test/core/support/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae)0
-rw-r--r--test/core/slice/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681 (renamed from test/core/support/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681)0
-rw-r--r--test/core/slice/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b (renamed from test/core/support/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b)0
-rw-r--r--test/core/slice/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758 (renamed from test/core/support/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758)0
-rw-r--r--test/core/slice/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113 (renamed from test/core/support/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113)0
-rw-r--r--test/core/slice/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a (renamed from test/core/support/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a)0
-rw-r--r--test/core/slice/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a (renamed from test/core/support/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a)0
-rw-r--r--test/core/slice/percent_decode_corpus/xyz (renamed from test/core/support/percent_decode_corpus/xyz)0
-rw-r--r--test/core/slice/percent_decode_fuzzer.c (renamed from test/core/support/percent_decode_fuzzer.c)22
-rw-r--r--test/core/slice/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f (renamed from test/core/support/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f)0
-rw-r--r--test/core/slice/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226 (renamed from test/core/support/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226)0
-rw-r--r--test/core/slice/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf (renamed from test/core/support/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf)0
-rw-r--r--test/core/slice/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93 (renamed from test/core/support/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93)0
-rw-r--r--test/core/slice/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7 (renamed from test/core/support/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7)0
-rw-r--r--test/core/slice/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a (renamed from test/core/support/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a)0
-rw-r--r--test/core/slice/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e (renamed from test/core/support/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e)0
-rw-r--r--test/core/slice/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969 (renamed from test/core/support/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969)0
-rw-r--r--test/core/slice/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06 (renamed from test/core/support/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06)0
-rw-r--r--test/core/slice/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b (renamed from test/core/support/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b)0
-rw-r--r--test/core/slice/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45 (renamed from test/core/support/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45)0
-rw-r--r--test/core/slice/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3 (renamed from test/core/support/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3)0
-rw-r--r--test/core/slice/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4 (renamed from test/core/support/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4)0
-rw-r--r--test/core/slice/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21 (renamed from test/core/support/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21)0
-rw-r--r--test/core/slice/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54 (renamed from test/core/support/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54)0
-rw-r--r--test/core/slice/percent_encode_corpus/xyz (renamed from test/core/support/percent_encode_corpus/xyz)0
-rw-r--r--test/core/slice/percent_encode_fuzzer.c (renamed from test/core/support/percent_encode_fuzzer.c)30
-rw-r--r--test/core/slice/percent_encoding_test.c (renamed from test/core/support/percent_encoding_test.c)101
-rw-r--r--test/core/slice/slice_buffer_test.c (renamed from test/core/support/slice_buffer_test.c)64
-rw-r--r--test/core/slice/slice_string_helpers_test.c150
-rw-r--r--test/core/slice/slice_test.c (renamed from test/core/support/slice_test.c)121
-rw-r--r--test/core/support/BUILD37
-rw-r--r--test/core/support/backoff_test.c91
-rw-r--r--test/core/support/string_test.c112
-rw-r--r--test/core/surface/byte_buffer_reader_test.c136
-rw-r--r--test/core/surface/channel_create_test.c12
-rw-r--r--test/core/surface/concurrent_connectivity_test.c4
-rw-r--r--test/core/surface/public_headers_must_be_c89.c4
-rw-r--r--test/core/surface/server_chttp2_test.c5
-rw-r--r--test/core/transport/chttp2/bin_decoder_test.c45
-rw-r--r--test/core/transport/chttp2/bin_encoder_test.c59
-rw-r--r--test/core/transport/chttp2/hpack_encoder_test.c27
-rw-r--r--test/core/transport/chttp2/hpack_parser_test.c18
-rw-r--r--test/core/transport/chttp2/hpack_table_test.c2
-rw-r--r--test/core/transport/chttp2/varint_test.c17
-rw-r--r--test/core/transport/metadata_test.c40
-rw-r--r--test/core/transport/pid_controller_test.c77
-rw-r--r--test/core/util/mock_endpoint.c44
-rw-r--r--test/core/util/mock_endpoint.h6
-rw-r--r--test/core/util/one_corpus_entry_fuzzer.c7
-rw-r--r--test/core/util/parse_hexstring.c8
-rw-r--r--test/core/util/parse_hexstring.h4
-rw-r--r--test/core/util/passthru_endpoint.c52
-rw-r--r--test/core/util/passthru_endpoint.h3
-rw-r--r--test/core/util/port_posix.c100
-rw-r--r--test/core/util/port_server_client.c20
-rw-r--r--test/core/util/reconnect_server.c1
-rw-r--r--test/core/util/slice_splitter.c56
-rw-r--r--test/core/util/slice_splitter.h18
-rw-r--r--test/core/util/test_config.c19
-rw-r--r--test/core/util/test_config.h3
-rw-r--r--test/core/util/test_tcp_server.c4
-rw-r--r--test/cpp/codegen/compiler_test_golden52
-rw-r--r--test/cpp/common/auth_property_iterator_test.cc4
-rw-r--r--test/cpp/common/channel_arguments_test.cc68
-rw-r--r--test/cpp/common/channel_filter_test.cc80
-rw-r--r--test/cpp/end2end/async_end2end_test.cc28
-rw-r--r--test/cpp/end2end/client_crash_test_server.cc9
-rw-r--r--test/cpp/end2end/end2end_test.cc90
-rw-r--r--test/cpp/end2end/filter_end2end_test.cc29
-rw-r--r--test/cpp/end2end/generic_end2end_test.cc4
-rw-r--r--test/cpp/end2end/hybrid_end2end_test.cc28
-rw-r--r--test/cpp/end2end/mock_test.cc62
-rw-r--r--test/cpp/end2end/proto_server_reflection_test.cc2
-rw-r--r--test/cpp/end2end/round_robin_end2end_test.cc216
-rw-r--r--test/cpp/end2end/server_builder_plugin_test.cc29
-rw-r--r--test/cpp/end2end/server_crash_test.cc15
-rw-r--r--test/cpp/end2end/shutdown_test.cc6
-rw-r--r--test/cpp/end2end/streaming_throughput_test.cc10
-rw-r--r--test/cpp/end2end/test_service_impl.cc12
-rw-r--r--test/cpp/end2end/test_service_impl.h12
-rw-r--r--test/cpp/end2end/thread_stress_test.cc91
-rw-r--r--test/cpp/grpclb/grpclb_api_test.cc18
-rw-r--r--test/cpp/grpclb/grpclb_test.cc151
-rw-r--r--test/cpp/interop/client.cc62
-rw-r--r--test/cpp/interop/interop_client.cc32
-rw-r--r--test/cpp/interop/interop_client.h2
-rw-r--r--test/cpp/interop/interop_server.cc2
-rw-r--r--test/cpp/interop/interop_server_bootstrap.cc4
-rw-r--r--test/cpp/interop/interop_test.cc2
-rw-r--r--test/cpp/interop/server_helper.h6
-rw-r--r--test/cpp/interop/stress_test.cc9
-rw-r--r--test/cpp/microbenchmarks/bm_fullstack.cc450
-rw-r--r--test/cpp/microbenchmarks/noop-benchmark.cc45
-rw-r--r--test/cpp/qps/client.h64
-rw-r--r--test/cpp/qps/client_async.cc53
-rw-r--r--test/cpp/qps/client_sync.cc31
-rw-r--r--test/cpp/qps/driver.cc229
-rw-r--r--test/cpp/qps/driver.h4
-rwxr-xr-xtest/cpp/qps/gen_build_yaml.py63
-rw-r--r--test/cpp/qps/interarrival.h6
-rw-r--r--test/cpp/qps/json_run_localhost.cc73
-rw-r--r--test/cpp/qps/qps_json_driver.cc150
-rw-r--r--test/cpp/qps/qps_worker.cc20
-rw-r--r--test/cpp/qps/report.cc21
-rw-r--r--test/cpp/qps/report.h30
-rw-r--r--test/cpp/qps/server.h2
-rw-r--r--test/cpp/qps/server_async.cc30
-rw-r--r--test/cpp/qps/server_sync.cc14
-rw-r--r--test/cpp/qps/usage_timer.cc33
-rw-r--r--test/cpp/qps/usage_timer.h2
-rw-r--r--test/cpp/thread_manager/thread_manager_test.cc135
-rw-r--r--test/cpp/util/byte_buffer_proto_helper.cc2
-rw-r--r--test/cpp/util/byte_buffer_test.cc28
-rw-r--r--test/cpp/util/cli_call.cc4
-rw-r--r--test/cpp/util/cli_call.h2
-rw-r--r--test/cpp/util/cli_call_test.cc6
-rw-r--r--test/cpp/util/config_grpc_cli.h2
-rw-r--r--test/cpp/util/grpc_tool.cc149
-rw-r--r--test/cpp/util/grpc_tool_test.cc63
-rw-r--r--test/cpp/util/metrics_server.h6
-rw-r--r--test/cpp/util/proto_file_parser.cc16
-rw-r--r--test/cpp/util/proto_file_parser.h4
-rw-r--r--test/cpp/util/proto_reflection_descriptor_database.h16
-rw-r--r--test/cpp/util/slice_test.cc18
-rw-r--r--test/cpp/util/test_credentials_provider.cc26
-rw-r--r--test/http2_test/http2_base_server.py205
-rw-r--r--test/http2_test/http2_test_server.py90
-rw-r--r--test/http2_test/messages_pb2.py661
-rw-r--r--test/http2_test/test_goaway.py77
-rw-r--r--test/http2_test/test_max_streams.py63
-rw-r--r--test/http2_test/test_ping.py67
-rw-r--r--test/http2_test/test_rst_after_data.py57
-rw-r--r--test/http2_test/test_rst_after_header.py48
-rw-r--r--test/http2_test/test_rst_during_data.py58
1038 files changed, 8795 insertions, 2785 deletions
diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c
index be88d4a69a..07fcd995d7 100644
--- a/test/core/bad_client/bad_client.c
+++ b/test/core/bad_client/bad_client.c
@@ -77,7 +77,7 @@ static void server_setup_transport(void *ts, grpc_transport *transport) {
typedef struct {
grpc_bad_client_client_stream_validator validator;
- gpr_slice_buffer incoming;
+ grpc_slice_buffer incoming;
gpr_event read_done;
} read_args;
@@ -96,9 +96,9 @@ void grpc_run_bad_client_test(
gpr_thd_id id;
char *hex;
grpc_transport *transport;
- gpr_slice slice =
- gpr_slice_from_copied_buffer(client_payload, client_payload_length);
- gpr_slice_buffer outgoing;
+ grpc_slice slice =
+ grpc_slice_from_copied_buffer(client_payload, client_payload_length);
+ grpc_slice_buffer outgoing;
grpc_closure done_write_closure;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -114,7 +114,10 @@ void grpc_run_bad_client_test(
grpc_init();
/* Create endpoints */
- sfd = grpc_iomgr_create_endpoint_pair("fixture", 65536);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("bad_client_test");
+ sfd = grpc_iomgr_create_endpoint_pair("fixture", resource_quota, 65536);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
/* Create server, completion events */
a.server = grpc_server_create(NULL, NULL);
@@ -143,8 +146,8 @@ void grpc_run_bad_client_test(
/* Start validator */
gpr_thd_new(&id, thd_func, &a, NULL);
- gpr_slice_buffer_init(&outgoing);
- gpr_slice_buffer_add(&outgoing, slice);
+ grpc_slice_buffer_init(&outgoing);
+ grpc_slice_buffer_add(&outgoing, slice);
grpc_closure_init(&done_write_closure, done_write, &a);
/* Write data */
@@ -169,7 +172,7 @@ void grpc_run_bad_client_test(
if (client_validator != NULL) {
read_args args;
args.validator = client_validator;
- gpr_slice_buffer_init(&args.incoming);
+ grpc_slice_buffer_init(&args.incoming);
gpr_event_init(&args.read_done);
grpc_closure read_done_closure;
grpc_closure_init(&read_done_closure, read_done, &args);
@@ -178,7 +181,7 @@ void grpc_run_bad_client_test(
grpc_exec_ctx_finish(&exec_ctx);
GPR_ASSERT(
gpr_event_wait(&args.read_done, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)));
- gpr_slice_buffer_destroy(&args.incoming);
+ grpc_slice_buffer_destroy(&args.incoming);
}
// Shutdown.
grpc_endpoint_shutdown(&exec_ctx, sfd.client);
@@ -191,7 +194,7 @@ void grpc_run_bad_client_test(
.type == GRPC_OP_COMPLETE);
grpc_server_destroy(a.server);
grpc_completion_queue_destroy(a.cq);
- gpr_slice_buffer_destroy(&outgoing);
+ grpc_slice_buffer_destroy(&outgoing);
grpc_exec_ctx_finish(&exec_ctx);
grpc_shutdown();
diff --git a/test/core/bad_client/bad_client.h b/test/core/bad_client/bad_client.h
index c8b2a4122f..bbca418ef3 100644
--- a/test/core/bad_client/bad_client.h
+++ b/test/core/bad_client/bad_client.h
@@ -45,7 +45,7 @@ typedef void (*grpc_bad_client_server_side_validator)(grpc_server *server,
void *registered_method);
typedef void (*grpc_bad_client_client_stream_validator)(
- gpr_slice_buffer *incoming);
+ grpc_slice_buffer *incoming);
#define GRPC_BAD_CLIENT_DISCONNECT 1
diff --git a/test/core/bad_client/tests/large_metadata.c b/test/core/bad_client/tests/large_metadata.c
index b9c8093ef9..9c804e78c1 100644
--- a/test/core/bad_client/tests/large_metadata.c
+++ b/test/core/bad_client/tests/large_metadata.c
@@ -183,16 +183,16 @@ static void server_verifier_sends_too_much_metadata(grpc_server *server,
cq_verifier_destroy(cqv);
}
-static void client_validator(gpr_slice_buffer *incoming) {
+static void client_validator(grpc_slice_buffer *incoming) {
// Get last frame from incoming slice buffer.
- gpr_slice_buffer last_frame_buffer;
- gpr_slice_buffer_init(&last_frame_buffer);
- gpr_slice_buffer_trim_end(incoming, 13, &last_frame_buffer);
+ grpc_slice_buffer last_frame_buffer;
+ grpc_slice_buffer_init(&last_frame_buffer);
+ grpc_slice_buffer_trim_end(incoming, 13, &last_frame_buffer);
GPR_ASSERT(last_frame_buffer.count == 1);
- gpr_slice last_frame = last_frame_buffer.slices[0];
+ grpc_slice last_frame = last_frame_buffer.slices[0];
// Construct expected frame.
- gpr_slice expected = gpr_slice_malloc(13);
- uint8_t *p = GPR_SLICE_START_PTR(expected);
+ grpc_slice expected = grpc_slice_malloc(13);
+ uint8_t *p = GRPC_SLICE_START_PTR(expected);
// Length.
*p++ = 0;
*p++ = 0;
@@ -212,8 +212,8 @@ static void client_validator(gpr_slice_buffer *incoming) {
*p++ = 0;
*p++ = 11;
// Compare actual and expected.
- GPR_ASSERT(gpr_slice_cmp(last_frame, expected) == 0);
- gpr_slice_buffer_destroy(&last_frame_buffer);
+ GPR_ASSERT(grpc_slice_cmp(last_frame, expected) == 0);
+ grpc_slice_buffer_destroy(&last_frame_buffer);
}
int main(int argc, char **argv) {
diff --git a/test/core/bad_ssl/servers/cert.c b/test/core/bad_ssl/servers/cert.c
index 91dd9de81b..9aadf452e2 100644
--- a/test/core/bad_ssl/servers/cert.c
+++ b/test/core/bad_ssl/servers/cert.c
@@ -51,7 +51,7 @@ int main(int argc, char **argv) {
grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
grpc_server_credentials *ssl_creds;
grpc_server *server;
- gpr_slice cert_slice, key_slice;
+ grpc_slice cert_slice, key_slice;
grpc_init();
@@ -61,8 +61,8 @@ int main(int argc, char **argv) {
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"load_file", grpc_load_file("src/core/lib/tsi/test_creds/badserver.key",
1, &key_slice)));
- pem_key_cert_pair.private_key = (const char *)GPR_SLICE_START_PTR(key_slice);
- pem_key_cert_pair.cert_chain = (const char *)GPR_SLICE_START_PTR(cert_slice);
+ pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
+ pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
ssl_creds =
grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1, 0, NULL);
@@ -70,8 +70,8 @@ int main(int argc, char **argv) {
GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds));
grpc_server_credentials_release(ssl_creds);
- gpr_slice_unref(cert_slice);
- gpr_slice_unref(key_slice);
+ grpc_slice_unref(cert_slice);
+ grpc_slice_unref(key_slice);
bad_ssl_run(server);
grpc_shutdown();
diff --git a/test/core/channel/channel_args_test.c b/test/core/channel/channel_args_test.c
index 8ef1bff22e..d3eb969f09 100644
--- a/test/core/channel/channel_args_test.c
+++ b/test/core/channel/channel_args_test.c
@@ -134,12 +134,26 @@ static void test_compression_algorithm_states(void) {
grpc_channel_args_destroy(ch_args);
}
+static void test_set_socket_mutator(void) {
+ grpc_channel_args *ch_args;
+ grpc_socket_mutator mutator;
+ grpc_socket_mutator_init(&mutator, NULL);
+
+ ch_args = grpc_channel_args_set_socket_mutator(NULL, &mutator);
+ GPR_ASSERT(ch_args->num_args == 1);
+ GPR_ASSERT(strcmp(ch_args->args[0].key, GRPC_ARG_SOCKET_MUTATOR) == 0);
+ GPR_ASSERT(ch_args->args[0].type == GRPC_ARG_POINTER);
+
+ grpc_channel_args_destroy(ch_args);
+}
+
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
grpc_init();
test_create();
test_set_compression_algorithm();
test_compression_algorithm_states();
+ test_set_socket_mutator();
grpc_shutdown();
return 0;
}
diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c
index 26fc3dc4a8..b43d05eec3 100644
--- a/test/core/channel/channel_stack_test.c
+++ b/test/core/channel/channel_stack_test.c
@@ -41,9 +41,9 @@
#include "test/core/util/test_config.h"
-static void channel_init_func(grpc_exec_ctx *exec_ctx,
- grpc_channel_element *elem,
- grpc_channel_element_args *args) {
+static grpc_error *channel_init_func(grpc_exec_ctx *exec_ctx,
+ grpc_channel_element *elem,
+ grpc_channel_element_args *args) {
GPR_ASSERT(args->channel_args->num_args == 1);
GPR_ASSERT(args->channel_args->args[0].type == GRPC_ARG_INTEGER);
GPR_ASSERT(0 == strcmp(args->channel_args->args[0].key, "test_key"));
@@ -51,6 +51,7 @@ static void channel_init_func(grpc_exec_ctx *exec_ctx,
GPR_ASSERT(args->is_first);
GPR_ASSERT(args->is_last);
*(int *)(elem->channel_data) = 0;
+ return GRPC_ERROR_NONE;
}
static grpc_error *call_init_func(grpc_exec_ctx *exec_ctx,
@@ -107,6 +108,7 @@ static void test_create_channel_stack(void) {
channel_init_func,
channel_destroy_func,
get_peer,
+ grpc_channel_next_get_info,
"some_test_filter"};
const grpc_channel_filter *filters = &filter;
grpc_channel_stack *channel_stack;
@@ -136,9 +138,10 @@ static void test_create_channel_stack(void) {
GPR_ASSERT(*channel_data == 0);
call_stack = gpr_malloc(channel_stack->call_stack_size);
- grpc_error *error = grpc_call_stack_init(
- &exec_ctx, channel_stack, 1, free_call, call_stack, NULL, NULL, path,
- gpr_inf_future(GPR_CLOCK_MONOTONIC), call_stack);
+ grpc_error *error =
+ grpc_call_stack_init(&exec_ctx, channel_stack, 1, free_call, call_stack,
+ NULL, NULL, path, gpr_now(GPR_CLOCK_MONOTONIC),
+ gpr_inf_future(GPR_CLOCK_MONOTONIC), call_stack);
GPR_ASSERT(error == GRPC_ERROR_NONE);
GPR_ASSERT(call_stack->count == 1);
call_elem = grpc_call_stack_element(call_stack, 0);
diff --git a/test/core/client_channel/lb_policies_test.c b/test/core/client_channel/lb_policies_test.c
index 844db5e6cb..016610763c 100644
--- a/test/core/client_channel/lb_policies_test.c
+++ b/test/core/client_channel/lb_policies_test.c
@@ -43,12 +43,12 @@
#include "src/core/ext/client_channel/client_channel.h"
#include "src/core/ext/client_channel/lb_policy_registry.h"
+#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/support/string.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/server.h"
#include "test/core/end2end/cq_verifier.h"
-#include "test/core/end2end/fake_resolver.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"
@@ -63,8 +63,16 @@ typedef struct servers_fixture {
grpc_metadata_array *request_metadata_recv;
} servers_fixture;
+typedef struct request_sequences {
+ size_t n; /* number of iterations */
+ int *connections; /* indexed by the interation number, value is the index of
+ the server it connected to or -1 if none */
+ int *connectivity_states; /* indexed by the interation number, value is the
+ client connectivity state */
+} request_sequences;
+
typedef void (*verifier_fn)(const servers_fixture *, grpc_channel *,
- const int *, const size_t);
+ const request_sequences *, const size_t);
typedef struct test_spec {
size_t num_iters;
@@ -228,9 +236,26 @@ static void teardown_servers(servers_fixture *f) {
gpr_free(f);
}
+static request_sequences request_sequences_create(size_t n) {
+ request_sequences res;
+ res.n = n;
+ res.connections = gpr_malloc(sizeof(*res.connections) * n);
+ res.connectivity_states = gpr_malloc(sizeof(*res.connectivity_states) * n);
+ memset(res.connections, 0, sizeof(*res.connections) * n);
+ memset(res.connectivity_states, 0, sizeof(*res.connectivity_states) * n);
+ return res;
+}
+
+static void request_sequences_destroy(const request_sequences *rseqs) {
+ gpr_free(rseqs->connections);
+ gpr_free(rseqs->connectivity_states);
+}
+
/** Returns connection sequence (server indices), which must be freed */
-static int *perform_request(servers_fixture *f, grpc_channel *client,
- request_data *rdata, const test_spec *spec) {
+static request_sequences perform_request(servers_fixture *f,
+ grpc_channel *client,
+ request_data *rdata,
+ const test_spec *spec) {
grpc_call *c;
int s_idx;
int *s_valid;
@@ -240,11 +265,10 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
size_t i, iter_num;
grpc_event ev;
int read_tag;
- int *connection_sequence;
int completed_client;
+ const request_sequences sequences = request_sequences_create(spec->num_iters);
s_valid = gpr_malloc(sizeof(int) * f->num_servers);
- connection_sequence = gpr_malloc(sizeof(int) * spec->num_iters);
for (iter_num = 0; iter_num < spec->num_iters; iter_num++) {
cq_verifier *cqv = cq_verifier_create(f->cq);
@@ -261,7 +285,7 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
}
}
- connection_sequence[iter_num] = -1;
+ sequences.connections[iter_num] = -1;
grpc_metadata_array_init(&rdata->initial_metadata_recv);
grpc_metadata_array_init(&rdata->trailing_metadata_recv);
@@ -306,12 +330,14 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL));
s_idx = -1;
- while (
- (ev = grpc_completion_queue_next(
- f->cq, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10 * RETRY_TIMEOUT), NULL))
- .type != GRPC_QUEUE_TIMEOUT) {
+ while ((ev = grpc_completion_queue_next(
+ f->cq, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(RETRY_TIMEOUT), NULL))
+ .type != GRPC_QUEUE_TIMEOUT) {
GPR_ASSERT(ev.type == GRPC_OP_COMPLETE);
read_tag = ((int)(intptr_t)ev.tag);
+ const grpc_connectivity_state conn_state =
+ grpc_channel_check_connectivity_state(client, 0);
+ sequences.connectivity_states[iter_num] = conn_state;
gpr_log(GPR_DEBUG, "EVENT: success:%d, type:%d, tag:%d iter:%" PRIuPTR,
ev.success, ev.type, read_tag, iter_num);
if (ev.success && read_tag >= 1000) {
@@ -319,7 +345,7 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
/* only server notifications for non-shutdown events */
s_idx = read_tag - 1000;
s_valid[s_idx] = 1;
- connection_sequence[iter_num] = s_idx;
+ sequences.connections[iter_num] = s_idx;
break;
} else if (read_tag == 1) {
gpr_log(GPR_DEBUG, "client timed out");
@@ -382,10 +408,9 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
}
}
- GPR_ASSERT(
- grpc_completion_queue_next(
- f->cq, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(2 * RETRY_TIMEOUT), NULL)
- .type == GRPC_QUEUE_TIMEOUT);
+ GPR_ASSERT(grpc_completion_queue_next(
+ f->cq, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(RETRY_TIMEOUT), NULL)
+ .type == GRPC_QUEUE_TIMEOUT);
grpc_metadata_array_destroy(&rdata->initial_metadata_recv);
grpc_metadata_array_destroy(&rdata->trailing_metadata_recv);
@@ -402,7 +427,7 @@ static int *perform_request(servers_fixture *f, grpc_channel *client,
gpr_free(s_valid);
- return connection_sequence;
+ return sequences;
}
static grpc_call **perform_multirequest(servers_fixture *f,
@@ -442,66 +467,14 @@ static grpc_call **perform_multirequest(servers_fixture *f,
return calls;
}
-static void assert_channel_connectivity(grpc_channel *ch,
- size_t num_accepted_conn_states,
- int accepted_conn_state, ...) {
- size_t i;
- grpc_channel_stack *client_stack;
- grpc_channel_element *client_channel_filter;
- grpc_connectivity_state actual_conn_state;
- grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- va_list ap;
-
- client_stack = grpc_channel_get_channel_stack(ch);
- client_channel_filter = grpc_channel_stack_last_element(client_stack);
-
- actual_conn_state = grpc_client_channel_check_connectivity_state(
- &exec_ctx, client_channel_filter, 0 /* don't try to connect */);
- grpc_exec_ctx_finish(&exec_ctx);
- va_start(ap, accepted_conn_state);
- for (i = 0; i < num_accepted_conn_states; i++) {
- if ((int)actual_conn_state == accepted_conn_state) {
- break;
- }
- accepted_conn_state = va_arg(ap, grpc_connectivity_state);
- }
- va_end(ap);
- if (i == num_accepted_conn_states) {
- char **accepted_strs =
- gpr_malloc(sizeof(char *) * num_accepted_conn_states);
- char *accepted_str_joined;
- va_start(ap, accepted_conn_state);
- for (i = 0; i < num_accepted_conn_states; i++) {
- GPR_ASSERT(gpr_asprintf(&accepted_strs[i], "%d", accepted_conn_state) >
- 0);
- accepted_conn_state = va_arg(ap, grpc_connectivity_state);
- }
- va_end(ap);
- accepted_str_joined = gpr_strjoin_sep((const char **)accepted_strs,
- num_accepted_conn_states, ", ", NULL);
- gpr_log(
- GPR_ERROR,
- "Channel connectivity assertion failed: expected <one of [%s]>, got %d",
- accepted_str_joined, actual_conn_state);
-
- for (i = 0; i < num_accepted_conn_states; i++) {
- gpr_free(accepted_strs[i]);
- }
- gpr_free(accepted_strs);
- gpr_free(accepted_str_joined);
- abort();
- }
-}
-
void run_spec(const test_spec *spec) {
grpc_channel *client;
char *client_hostport;
char *servers_hostports_str;
- int *actual_connection_sequence;
request_data rdata;
servers_fixture *f;
grpc_channel_args args;
- grpc_arg arg;
+ grpc_arg arg_array[2];
rdata.call_details =
gpr_malloc(sizeof(grpc_call_details) * spec->num_servers);
f = setup_servers("127.0.0.1", &rdata, spec->num_servers);
@@ -509,28 +482,30 @@ void run_spec(const test_spec *spec) {
/* Create client. */
servers_hostports_str = gpr_strjoin_sep((const char **)f->servers_hostports,
f->num_servers, ",", NULL);
- gpr_asprintf(&client_hostport, "test:%s?lb_policy=round_robin",
- servers_hostports_str);
+ gpr_asprintf(&client_hostport, "ipv4:%s", servers_hostports_str);
- arg.type = GRPC_ARG_INTEGER;
- arg.key = "grpc.testing.fixed_reconnect_backoff";
- arg.value.integer = RETRY_TIMEOUT;
- args.num_args = 1;
- args.args = &arg;
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = RETRY_TIMEOUT;
+ arg_array[1].type = GRPC_ARG_STRING;
+ arg_array[1].key = GRPC_ARG_LB_POLICY_NAME;
+ arg_array[1].value.string = "round_robin";
+ args.num_args = 2;
+ args.args = arg_array;
client = grpc_insecure_channel_create(client_hostport, &args, NULL);
gpr_log(GPR_INFO, "Testing '%s' with servers=%s client=%s", spec->description,
servers_hostports_str, client_hostport);
- actual_connection_sequence = perform_request(f, client, &rdata, spec);
+ const request_sequences sequences = perform_request(f, client, &rdata, spec);
- spec->verifier(f, client, actual_connection_sequence, spec->num_iters);
+ spec->verifier(f, client, &sequences, spec->num_iters);
gpr_free(client_hostport);
gpr_free(servers_hostports_str);
- gpr_free(actual_connection_sequence);
gpr_free(rdata.call_details);
+ request_sequences_destroy(&sequences);
grpc_channel_destroy(client); /* calls the LB's shutdown func */
teardown_servers(f);
@@ -540,19 +515,21 @@ static grpc_channel *create_client(const servers_fixture *f) {
grpc_channel *client;
char *client_hostport;
char *servers_hostports_str;
- grpc_arg arg;
+ grpc_arg arg_array[2];
grpc_channel_args args;
servers_hostports_str = gpr_strjoin_sep((const char **)f->servers_hostports,
f->num_servers, ",", NULL);
- gpr_asprintf(&client_hostport, "test:%s?lb_policy=round_robin",
- servers_hostports_str);
+ gpr_asprintf(&client_hostport, "ipv4:%s", servers_hostports_str);
- arg.type = GRPC_ARG_INTEGER;
- arg.key = "grpc.testing.fixed_reconnect_backoff";
- arg.value.integer = RETRY_TIMEOUT;
- args.num_args = 1;
- args.args = &arg;
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = RETRY_TIMEOUT;
+ arg_array[1].type = GRPC_ARG_STRING;
+ arg_array[1].key = GRPC_ARG_LB_POLICY_NAME;
+ arg_array[1].value.string = "ROUND_ROBIN";
+ args.num_args = 2;
+ args.args = arg_array;
client = grpc_insecure_channel_create(client_hostport, &args, NULL);
gpr_free(client_hostport);
@@ -638,6 +615,48 @@ static void test_pending_calls(size_t concurrent_calls) {
test_spec_destroy(spec);
}
+static void test_get_channel_info() {
+ grpc_channel *channel =
+ grpc_insecure_channel_create("ipv4:127.0.0.1:1234", NULL, NULL);
+ // Ensures that resolver returns.
+ grpc_channel_check_connectivity_state(channel, true /* try_to_connect */);
+ // First, request no fields. This is a no-op.
+ grpc_channel_info channel_info;
+ memset(&channel_info, 0, sizeof(channel_info));
+ grpc_channel_get_info(channel, &channel_info);
+ // Request LB policy name.
+ char *lb_policy_name = NULL;
+ channel_info.lb_policy_name = &lb_policy_name;
+ grpc_channel_get_info(channel, &channel_info);
+ GPR_ASSERT(lb_policy_name != NULL);
+ GPR_ASSERT(strcmp(lb_policy_name, "pick_first") == 0);
+ gpr_free(lb_policy_name);
+ // Request service config, which does not exist, so we'll get nothing back.
+ memset(&channel_info, 0, sizeof(channel_info));
+ char *service_config_json = "dummy_string";
+ channel_info.service_config_json = &service_config_json;
+ grpc_channel_get_info(channel, &channel_info);
+ GPR_ASSERT(service_config_json == NULL);
+ // Recreate the channel such that it has a service config.
+ grpc_channel_destroy(channel);
+ grpc_arg arg;
+ arg.type = GRPC_ARG_STRING;
+ arg.key = GRPC_ARG_SERVICE_CONFIG;
+ arg.value.string = "{\"loadBalancingPolicy\": \"ROUND_ROBIN\"}";
+ grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
+ channel = grpc_insecure_channel_create("ipv4:127.0.0.1:1234", args, NULL);
+ grpc_channel_args_destroy(args);
+ // Ensures that resolver returns.
+ grpc_channel_check_connectivity_state(channel, true /* try_to_connect */);
+ // Now request the service config again.
+ grpc_channel_get_info(channel, &channel_info);
+ GPR_ASSERT(service_config_json != NULL);
+ GPR_ASSERT(strcmp(service_config_json, arg.value.string) == 0);
+ gpr_free(service_config_json);
+ // Clean up.
+ grpc_channel_destroy(channel);
+}
+
static void print_failed_expectations(const int *expected_connection_sequence,
const int *actual_connection_sequence,
const size_t expected_seq_length,
@@ -653,29 +672,43 @@ static void print_failed_expectations(const int *expected_connection_sequence,
static void verify_vanilla_round_robin(const servers_fixture *f,
grpc_channel *client,
- const int *actual_connection_sequence,
+ const request_sequences *sequences,
const size_t num_iters) {
- int *expected_connection_sequence;
- size_t i;
const size_t expected_seq_length = f->num_servers;
/* verify conn. seq. expectation */
/* get the first sequence of "num_servers" elements */
- expected_connection_sequence = gpr_malloc(sizeof(int) * expected_seq_length);
- memcpy(expected_connection_sequence, actual_connection_sequence,
+ int *expected_connection_sequence =
+ gpr_malloc(sizeof(int) * expected_seq_length);
+ memcpy(expected_connection_sequence, sequences->connections,
sizeof(int) * expected_seq_length);
- for (i = 0; i < num_iters; i++) {
- const int actual = actual_connection_sequence[i];
+ for (size_t i = 0; i < num_iters; i++) {
+ const int actual = sequences->connections[i];
const int expected = expected_connection_sequence[i % expected_seq_length];
if (actual != expected) {
- print_failed_expectations(expected_connection_sequence,
- actual_connection_sequence, expected_seq_length,
- num_iters);
+ gpr_log(
+ GPR_ERROR,
+ "CONNECTION SEQUENCE FAILURE: expected %d, got %d at iteration #%d",
+ expected, actual, (int)i);
+ abort();
+ }
+ }
+
+ /* All servers are available, therefore all client subchannels are READY, even
+ * when we only need one for the client channel state to be READY */
+ for (size_t i = 0; i < sequences->n; i++) {
+ const grpc_connectivity_state actual = sequences->connectivity_states[i];
+ const grpc_connectivity_state expected = GRPC_CHANNEL_READY;
+ if (actual != expected) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: expected '%s', got '%s' "
+ "at iteration #%d",
+ grpc_connectivity_state_name(expected),
+ grpc_connectivity_state_name(actual), (int)i);
abort();
}
}
- assert_channel_connectivity(client, 1, GRPC_CHANNEL_READY);
gpr_free(expected_connection_sequence);
}
@@ -684,7 +717,7 @@ static void verify_vanilla_round_robin(const servers_fixture *f,
* given in "f") are killed */
static void verify_vanishing_floor_round_robin(
const servers_fixture *f, grpc_channel *client,
- const int *actual_connection_sequence, const size_t num_iters) {
+ const request_sequences *sequences, const size_t num_iters) {
int *expected_connection_sequence;
const size_t expected_seq_length = 2;
size_t i;
@@ -692,57 +725,83 @@ static void verify_vanishing_floor_round_robin(
/* verify conn. seq. expectation */
/* copy the first full sequence (without -1s) */
expected_connection_sequence = gpr_malloc(sizeof(int) * expected_seq_length);
- memcpy(expected_connection_sequence, actual_connection_sequence + 2,
+ memcpy(expected_connection_sequence, sequences->connections + 2,
expected_seq_length * sizeof(int));
/* first two elements of the sequence should be [0 (1st server), -1 (failure)]
*/
- GPR_ASSERT(actual_connection_sequence[0] == 0);
- GPR_ASSERT(actual_connection_sequence[1] == -1);
+ GPR_ASSERT(sequences->connections[0] == 0);
+ GPR_ASSERT(sequences->connections[1] == -1);
/* the next two element must be [3, 0], repeating from that point: the 3 is
* brought forth by servers 1 and 2 disappearing after the intial pick of 0 */
- GPR_ASSERT(actual_connection_sequence[2] == 3);
- GPR_ASSERT(actual_connection_sequence[3] == 0);
+ GPR_ASSERT(sequences->connections[2] == 3);
+ GPR_ASSERT(sequences->connections[3] == 0);
/* make sure that the expectation obliges */
for (i = 2; i < num_iters; i++) {
- const int actual = actual_connection_sequence[i];
+ const int actual = sequences->connections[i];
const int expected = expected_connection_sequence[i % expected_seq_length];
if (actual != expected) {
print_failed_expectations(expected_connection_sequence,
- actual_connection_sequence, expected_seq_length,
+ sequences->connections, expected_seq_length,
num_iters);
abort();
}
}
+
+ /* There's always at least one subchannel READY (connected), therefore the
+ * overall state of the client channel is READY at all times. */
+ for (i = 0; i < sequences->n; i++) {
+ const grpc_connectivity_state actual = sequences->connectivity_states[i];
+ const grpc_connectivity_state expected = GRPC_CHANNEL_READY;
+ if (actual != expected) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: expected '%s', got '%s' "
+ "at iteration #%d",
+ grpc_connectivity_state_name(expected),
+ grpc_connectivity_state_name(actual), (int)i);
+ abort();
+ }
+ }
+
gpr_free(expected_connection_sequence);
}
-static void verify_total_carnage_round_robin(
- const servers_fixture *f, grpc_channel *client,
- const int *actual_connection_sequence, const size_t num_iters) {
- size_t i;
-
- for (i = 0; i < num_iters; i++) {
- const int actual = actual_connection_sequence[i];
+static void verify_total_carnage_round_robin(const servers_fixture *f,
+ grpc_channel *client,
+ const request_sequences *sequences,
+ const size_t num_iters) {
+ for (size_t i = 0; i < num_iters; i++) {
+ const int actual = sequences->connections[i];
const int expected = -1;
if (actual != expected) {
- gpr_log(GPR_ERROR, "FAILURE: expected %d, actual %d at iter %" PRIuPTR,
- expected, actual, i);
+ gpr_log(
+ GPR_ERROR,
+ "CONNECTION SEQUENCE FAILURE: expected %d, got %d at iteration #%d",
+ expected, actual, (int)i);
abort();
}
}
- /* even though we know all the servers are dead, the client is still trying
- * retrying, believing it's in a transient failure situation */
- assert_channel_connectivity(client, 2, GRPC_CHANNEL_TRANSIENT_FAILURE,
- GRPC_CHANNEL_CONNECTING);
+ /* No server is ever available. There should be no READY states (or SHUTDOWN).
+ * Note that all other states (IDLE, CONNECTING, TRANSIENT_FAILURE) are still
+ * possible, as the policy transitions while attempting to reconnect. */
+ for (size_t i = 0; i < sequences->n; i++) {
+ const grpc_connectivity_state actual = sequences->connectivity_states[i];
+ if (actual == GRPC_CHANNEL_READY || actual == GRPC_CHANNEL_SHUTDOWN) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: got unexpected state "
+ "'%s' at iteration #%d.",
+ grpc_connectivity_state_name(actual), (int)i);
+ abort();
+ }
+ }
}
static void verify_partial_carnage_round_robin(
const servers_fixture *f, grpc_channel *client,
- const int *actual_connection_sequence, const size_t num_iters) {
+ const request_sequences *sequences, const size_t num_iters) {
int *expected_connection_sequence;
size_t i;
const size_t expected_seq_length = f->num_servers;
@@ -750,15 +809,15 @@ static void verify_partial_carnage_round_robin(
/* verify conn. seq. expectation */
/* get the first sequence of "num_servers" elements */
expected_connection_sequence = gpr_malloc(sizeof(int) * expected_seq_length);
- memcpy(expected_connection_sequence, actual_connection_sequence,
+ memcpy(expected_connection_sequence, sequences->connections,
sizeof(int) * expected_seq_length);
for (i = 0; i < num_iters / 2; i++) {
- const int actual = actual_connection_sequence[i];
+ const int actual = sequences->connections[i];
const int expected = expected_connection_sequence[i % expected_seq_length];
if (actual != expected) {
print_failed_expectations(expected_connection_sequence,
- actual_connection_sequence, expected_seq_length,
+ sequences->connections, expected_seq_length,
num_iters);
abort();
}
@@ -766,13 +825,35 @@ static void verify_partial_carnage_round_robin(
/* second half of the iterations go without response */
for (; i < num_iters; i++) {
- GPR_ASSERT(actual_connection_sequence[i] == -1);
+ GPR_ASSERT(sequences->connections[i] == -1);
+ }
+
+ /* We can assert that the first client channel state should be READY, when all
+ * servers were available */
+ grpc_connectivity_state actual = sequences->connectivity_states[0];
+ grpc_connectivity_state expected = GRPC_CHANNEL_READY;
+ if (actual != expected) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: expected '%s', got '%s' "
+ "at iteration #%d",
+ grpc_connectivity_state_name(expected),
+ grpc_connectivity_state_name(actual), 0);
+ abort();
}
- /* even though we know all the servers are dead, the client is still trying
- * retrying, believing it's in a transient failure situation */
- assert_channel_connectivity(client, 2, GRPC_CHANNEL_TRANSIENT_FAILURE,
- GRPC_CHANNEL_CONNECTING);
+ /* ... and that the last one shouldn't be READY (or SHUTDOWN): all servers are
+ * gone. It may be all other states (IDLE, CONNECTING, TRANSIENT_FAILURE), as
+ * the policy transitions while attempting to reconnect. */
+ actual = sequences->connectivity_states[num_iters - 1];
+ for (i = 0; i < sequences->n; i++) {
+ if (actual == GRPC_CHANNEL_READY || actual == GRPC_CHANNEL_SHUTDOWN) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: got unexpected state "
+ "'%s' at iteration #%d.",
+ grpc_connectivity_state_name(actual), (int)i);
+ abort();
+ }
+ }
gpr_free(expected_connection_sequence);
}
@@ -795,76 +876,67 @@ static void dump_array(const char *desc, const int *data, const size_t count) {
static void verify_rebirth_round_robin(const servers_fixture *f,
grpc_channel *client,
- const int *actual_connection_sequence,
+ const request_sequences *sequences,
const size_t num_iters) {
- int *expected_connection_sequence;
- size_t i, j, unique_seq_last_idx, unique_seq_first_idx;
- const size_t expected_seq_length = f->num_servers;
- int *seen_elements;
-
- dump_array("actual_connection_sequence", actual_connection_sequence,
- num_iters);
-
- /* verify conn. seq. expectation */
- /* get the first unique run of length "num_servers". */
- expected_connection_sequence = gpr_malloc(sizeof(int) * expected_seq_length);
- seen_elements = gpr_malloc(sizeof(int) * expected_seq_length);
-
- unique_seq_last_idx = ~(size_t)0;
+ dump_array("actual_connection_sequence", sequences->connections, num_iters);
- memset(seen_elements, 0, sizeof(int) * expected_seq_length);
- for (i = 0; i < num_iters; i++) {
- if (actual_connection_sequence[i] < 0 ||
- seen_elements[actual_connection_sequence[i]] != 0) {
- /* if anything breaks the uniqueness of the run, back to square zero */
- memset(seen_elements, 0, sizeof(int) * expected_seq_length);
- continue;
- }
- seen_elements[actual_connection_sequence[i]] = 1;
- for (j = 0; j < expected_seq_length; j++) {
- if (seen_elements[j] == 0) break;
- }
- if (j == expected_seq_length) { /* seen all the elements */
- unique_seq_last_idx = i;
+ /* first iteration succeeds */
+ GPR_ASSERT(sequences->connections[0] != -1);
+ /* then we fail for a while... */
+ GPR_ASSERT(sequences->connections[1] == -1);
+ /* ... but should be up eventually */
+ size_t first_iter_back_up = ~0ul;
+ for (size_t i = 2; i < sequences->n; ++i) {
+ if (sequences->connections[i] != -1) {
+ first_iter_back_up = i;
break;
}
}
- /* make sure we found a valid run */
- dump_array("seen_elements", seen_elements, expected_seq_length);
- for (j = 0; j < expected_seq_length; j++) {
- GPR_ASSERT(seen_elements[j] != 0);
+ GPR_ASSERT(first_iter_back_up != ~0ul);
+
+ /* We can assert that the first client channel state should be READY, when all
+ * servers were available; same thing for the last one. In the middle
+ * somewhere there must exist at least one TRANSIENT_FAILURE */
+ grpc_connectivity_state actual = sequences->connectivity_states[0];
+ grpc_connectivity_state expected = GRPC_CHANNEL_READY;
+ if (actual != expected) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: expected '%s', got '%s' "
+ "at iteration #%d",
+ grpc_connectivity_state_name(expected),
+ grpc_connectivity_state_name(actual), 0);
+ abort();
}
- GPR_ASSERT(unique_seq_last_idx != ~(size_t)0);
-
- unique_seq_first_idx = (unique_seq_last_idx - expected_seq_length + 1);
- memcpy(expected_connection_sequence,
- actual_connection_sequence + unique_seq_first_idx,
- sizeof(int) * expected_seq_length);
+ actual = sequences->connectivity_states[num_iters - 1];
+ expected = GRPC_CHANNEL_READY;
+ if (actual != expected) {
+ gpr_log(GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: expected '%s', got '%s' "
+ "at iteration #%d",
+ grpc_connectivity_state_name(expected),
+ grpc_connectivity_state_name(actual), (int)num_iters - 1);
+ abort();
+ }
- /* first iteration succeeds */
- GPR_ASSERT(actual_connection_sequence[0] != -1);
- /* then we fail for a while... */
- GPR_ASSERT(actual_connection_sequence[1] == -1);
- /* ... but should be up at "unique_seq_first_idx" */
- GPR_ASSERT(actual_connection_sequence[unique_seq_first_idx] != -1);
-
- for (j = 0, i = unique_seq_first_idx; i < num_iters; i++) {
- const int actual = actual_connection_sequence[i];
- const int expected =
- expected_connection_sequence[j++ % expected_seq_length];
- if (actual != expected) {
- print_failed_expectations(expected_connection_sequence,
- actual_connection_sequence, expected_seq_length,
- num_iters);
- abort();
+ bool found_failure_status = false;
+ for (size_t i = 1; i < sequences->n - 1; i++) {
+ if (sequences->connectivity_states[i] == GRPC_CHANNEL_TRANSIENT_FAILURE) {
+ found_failure_status = true;
+ break;
+ }
+ }
+ if (!found_failure_status) {
+ gpr_log(
+ GPR_ERROR,
+ "CONNECTIVITY STATUS SEQUENCE FAILURE: "
+ "GRPC_CHANNEL_TRANSIENT_FAILURE status not found. Got the following "
+ "instead:");
+ for (size_t i = 0; i < num_iters; i++) {
+ gpr_log(GPR_ERROR, "[%d]: %s", (int)i,
+ grpc_connectivity_state_name(sequences->connectivity_states[i]));
}
}
-
- /* things are fine once the servers are brought back up */
- assert_channel_connectivity(client, 1, GRPC_CHANNEL_READY);
- gpr_free(expected_connection_sequence);
- gpr_free(seen_elements);
}
int main(int argc, char **argv) {
@@ -874,9 +946,8 @@ int main(int argc, char **argv) {
const size_t NUM_ITERS = 10;
const size_t NUM_SERVERS = 4;
- grpc_test_init(argc, argv);
- grpc_fake_resolver_init();
grpc_init();
+ grpc_test_init(argc, argv);
grpc_tracer_set_enabled("round_robin", 1);
GPR_ASSERT(grpc_lb_policy_create(&exec_ctx, "this-lb-policy-does-not-exist",
@@ -904,7 +975,7 @@ int main(int argc, char **argv) {
* This should knock down the server bound to be selected next */
test_spec_reset(spec);
spec->verifier = verify_vanishing_floor_round_robin;
- spec->description = "test_kill_all_server_at_2nd_iteration";
+ spec->description = "test_kill_middle_servers_at_2nd_iteration";
for (i = 1; i < NUM_SERVERS - 1; i++) {
spec->kill_at[1][i] = 1;
}
@@ -933,6 +1004,7 @@ int main(int argc, char **argv) {
test_pending_calls(4);
test_ping();
+ test_get_channel_info();
grpc_exec_ctx_finish(&exec_ctx);
grpc_shutdown();
diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
index ffa167a0e7..b421720492 100644
--- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
+++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
@@ -63,7 +63,8 @@ static grpc_error *my_resolve_address(const char *name, const char *addr,
}
}
-static grpc_resolver *create_resolver(const char *name) {
+static grpc_resolver *create_resolver(grpc_exec_ctx *exec_ctx,
+ const char *name) {
grpc_resolver_factory *factory = grpc_resolver_factory_lookup("dns");
grpc_uri *uri = grpc_uri_parse(name, 0);
GPR_ASSERT(uri);
@@ -71,7 +72,7 @@ static grpc_resolver *create_resolver(const char *name) {
memset(&args, 0, sizeof(args));
args.uri = uri;
grpc_resolver *resolver =
- grpc_resolver_factory_create_resolver(factory, &args);
+ grpc_resolver_factory_create_resolver(exec_ctx, factory, &args);
grpc_resolver_factory_unref(factory);
grpc_uri_destroy(uri);
return resolver;
@@ -101,12 +102,10 @@ int main(int argc, char **argv) {
grpc_init();
gpr_mu_init(&g_mu);
grpc_blocking_resolve_address = my_resolve_address;
-
- grpc_resolver *resolver = create_resolver("dns:test");
-
grpc_channel_args *result = (grpc_channel_args *)1;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resolver *resolver = create_resolver(&exec_ctx, "dns:test");
gpr_event ev1;
gpr_event_init(&ev1);
grpc_resolver_next(&exec_ctx, resolver, &result,
diff --git a/test/core/client_channel/resolvers/dns_resolver_test.c b/test/core/client_channel/resolvers/dns_resolver_test.c
index 41a9125431..5603a57b5f 100644
--- a/test/core/client_channel/resolvers/dns_resolver_test.c
+++ b/test/core/client_channel/resolvers/dns_resolver_test.c
@@ -48,7 +48,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
GPR_ASSERT(uri);
memset(&args, 0, sizeof(args));
args.uri = uri;
- resolver = grpc_resolver_factory_create_resolver(factory, &args);
+ resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
GPR_ASSERT(resolver != NULL);
GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds");
grpc_uri_destroy(uri);
@@ -65,7 +65,7 @@ static void test_fails(grpc_resolver_factory *factory, const char *string) {
GPR_ASSERT(uri);
memset(&args, 0, sizeof(args));
args.uri = uri;
- resolver = grpc_resolver_factory_create_resolver(factory, &args);
+ resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
GPR_ASSERT(resolver == NULL);
grpc_uri_destroy(uri);
grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.c b/test/core/client_channel/resolvers/sockaddr_resolver_test.c
index ebf311ab83..a9fd85aea1 100644
--- a/test/core/client_channel/resolvers/sockaddr_resolver_test.c
+++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.c
@@ -49,11 +49,6 @@ typedef struct on_resolution_arg {
void on_resolution_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
on_resolution_arg *res = arg;
- const grpc_arg *channel_arg =
- grpc_channel_args_find(res->resolver_result, GRPC_ARG_SERVER_NAME);
- GPR_ASSERT(channel_arg != NULL);
- GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
- GPR_ASSERT(strcmp(res->expected_server_name, channel_arg->value.string) == 0);
grpc_channel_args_destroy(res->resolver_result);
}
@@ -67,7 +62,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
GPR_ASSERT(uri);
memset(&args, 0, sizeof(args));
args.uri = uri;
- resolver = grpc_resolver_factory_create_resolver(factory, &args);
+ resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
GPR_ASSERT(resolver != NULL);
on_resolution_arg on_res_arg;
@@ -93,7 +88,7 @@ static void test_fails(grpc_resolver_factory *factory, const char *string) {
GPR_ASSERT(uri);
memset(&args, 0, sizeof(args));
args.uri = uri;
- resolver = grpc_resolver_factory_create_resolver(factory, &args);
+ resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
GPR_ASSERT(resolver == NULL);
grpc_uri_destroy(uri);
grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/core/client_channel/set_initial_connect_string_test.c b/test/core/client_channel/set_initial_connect_string_test.c
index 379f30fb9f..11e57439d5 100644
--- a/test/core/client_channel/set_initial_connect_string_test.c
+++ b/test/core/client_channel/set_initial_connect_string_test.c
@@ -40,15 +40,16 @@
#include <string.h>
#include <grpc/grpc.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/thd.h>
#include "src/core/ext/client_channel/initial_connect_string.h"
#include "src/core/lib/iomgr/sockaddr.h"
#include "src/core/lib/security/credentials/fake/fake_credentials.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"
@@ -61,8 +62,8 @@ struct rpc_state {
grpc_channel *channel;
grpc_call *call;
grpc_op op;
- gpr_slice_buffer incoming_buffer;
- gpr_slice_buffer temp_incoming_buffer;
+ grpc_slice_buffer incoming_buffer;
+ grpc_slice_buffer temp_incoming_buffer;
grpc_endpoint *tcp;
gpr_atm done_atm;
};
@@ -74,8 +75,8 @@ static grpc_closure on_read;
static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
GPR_ASSERT(error == GRPC_ERROR_NONE);
- gpr_slice_buffer_move_into(&state.temp_incoming_buffer,
- &state.incoming_buffer);
+ grpc_slice_buffer_move_into(&state.temp_incoming_buffer,
+ &state.incoming_buffer);
gpr_log(GPR_DEBUG, "got %" PRIuPTR " bytes, magic is %" PRIuPTR " bytes",
state.incoming_buffer.length, strlen(magic_connect_string));
if (state.incoming_buffer.length > strlen(magic_connect_string)) {
@@ -91,32 +92,33 @@ static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
grpc_pollset *accepting_pollset,
grpc_tcp_server_acceptor *acceptor) {
+ gpr_free(acceptor);
test_tcp_server *server = arg;
grpc_closure_init(&on_read, handle_read, NULL);
- gpr_slice_buffer_init(&state.incoming_buffer);
- gpr_slice_buffer_init(&state.temp_incoming_buffer);
+ grpc_slice_buffer_init(&state.incoming_buffer);
+ grpc_slice_buffer_init(&state.temp_incoming_buffer);
state.tcp = tcp;
grpc_endpoint_add_to_pollset(exec_ctx, tcp, server->pollset);
grpc_endpoint_read(exec_ctx, tcp, &state.temp_incoming_buffer, &on_read);
}
static void set_magic_initial_string(grpc_resolved_address **addr,
- gpr_slice *connect_string) {
+ grpc_slice *connect_string) {
GPR_ASSERT(addr);
GPR_ASSERT((*addr)->len);
- *connect_string = gpr_slice_from_copied_string(magic_connect_string);
+ *connect_string = grpc_slice_from_copied_string(magic_connect_string);
}
static void reset_addr_and_set_magic_string(grpc_resolved_address **addr,
- gpr_slice *connect_string) {
+ grpc_slice *connect_string) {
struct sockaddr_in target;
- *connect_string = gpr_slice_from_copied_string(magic_connect_string);
+ *connect_string = grpc_slice_from_copied_string(magic_connect_string);
gpr_free(*addr);
target.sin_family = AF_INET;
target.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
target.sin_port = htons((uint16_t)server_port);
- (*addr)->len = sizeof(target);
*addr = (grpc_resolved_address *)gpr_malloc(sizeof(grpc_resolved_address));
+ (*addr)->len = sizeof(target);
memcpy((*addr)->addr, &target, sizeof(target));
}
@@ -154,8 +156,8 @@ static void start_rpc(int use_creds, int target_port) {
static void cleanup_rpc(void) {
grpc_event ev;
- gpr_slice_buffer_destroy(&state.incoming_buffer);
- gpr_slice_buffer_destroy(&state.temp_incoming_buffer);
+ grpc_slice_buffer_destroy(&state.incoming_buffer);
+ grpc_slice_buffer_destroy(&state.temp_incoming_buffer);
grpc_channel_credentials_unref(state.creds);
grpc_call_destroy(state.call);
grpc_completion_queue_shutdown(state.cq);
@@ -200,13 +202,13 @@ static void poll_server_until_read_done(test_tcp_server *server,
gpr_thd_new(&id, actually_poll_server, pa, NULL);
}
-static void match_initial_magic_string(gpr_slice_buffer *buffer) {
+static void match_initial_magic_string(grpc_slice_buffer *buffer) {
size_t i, j, cmp_length;
size_t magic_length = strlen(magic_connect_string);
GPR_ASSERT(buffer->length >= magic_length);
for (i = 0, j = 0; i < state.incoming_buffer.count && j < magic_length; i++) {
char *dump =
- gpr_dump_slice(state.incoming_buffer.slices[i], GPR_DUMP_ASCII);
+ grpc_dump_slice(state.incoming_buffer.slices[i], GPR_DUMP_ASCII);
cmp_length = GPR_MIN(strlen(dump), magic_length - j);
GPR_ASSERT(strncmp(dump, magic_connect_string + j, cmp_length) == 0);
j += cmp_length;
diff --git a/test/core/compression/message_compress_test.c b/test/core/compression/message_compress_test.c
index 47ecf72e08..fc53cd9d36 100644
--- a/test/core/compression/message_compress_test.c
+++ b/test/core/compression/message_compress_test.c
@@ -52,16 +52,16 @@ typedef enum {
MAYBE_COMPRESSES
} compressability;
-static void assert_passthrough(gpr_slice value,
+static void assert_passthrough(grpc_slice value,
grpc_compression_algorithm algorithm,
grpc_slice_split_mode uncompressed_split_mode,
grpc_slice_split_mode compressed_split_mode,
compressability compress_result_check) {
- gpr_slice_buffer input;
- gpr_slice_buffer compressed_raw;
- gpr_slice_buffer compressed;
- gpr_slice_buffer output;
- gpr_slice final;
+ grpc_slice_buffer input;
+ grpc_slice_buffer compressed_raw;
+ grpc_slice_buffer compressed;
+ grpc_slice_buffer output;
+ grpc_slice final;
int was_compressed;
char *algorithm_name;
@@ -70,15 +70,15 @@ static void assert_passthrough(gpr_slice value,
GPR_INFO, "assert_passthrough: value_length=%" PRIuPTR
" value_hash=0x%08x "
"algorithm='%s' uncompressed_split='%s' compressed_split='%s'",
- GPR_SLICE_LENGTH(value),
- gpr_murmur_hash3(GPR_SLICE_START_PTR(value), GPR_SLICE_LENGTH(value), 0),
+ GRPC_SLICE_LENGTH(value), gpr_murmur_hash3(GRPC_SLICE_START_PTR(value),
+ GRPC_SLICE_LENGTH(value), 0),
algorithm_name, grpc_slice_split_mode_name(uncompressed_split_mode),
grpc_slice_split_mode_name(compressed_split_mode));
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&compressed_raw);
- gpr_slice_buffer_init(&compressed);
- gpr_slice_buffer_init(&output);
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&compressed_raw);
+ grpc_slice_buffer_init(&compressed);
+ grpc_slice_buffer_init(&output);
grpc_split_slices_to_buffer(uncompressed_split_mode, &value, 1, &input);
@@ -103,18 +103,18 @@ static void assert_passthrough(gpr_slice value,
was_compressed ? algorithm : GRPC_COMPRESS_NONE, &compressed, &output));
final = grpc_slice_merge(output.slices, output.count);
- GPR_ASSERT(0 == gpr_slice_cmp(value, final));
+ GPR_ASSERT(0 == grpc_slice_cmp(value, final));
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&compressed);
- gpr_slice_buffer_destroy(&compressed_raw);
- gpr_slice_buffer_destroy(&output);
- gpr_slice_unref(final);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&compressed);
+ grpc_slice_buffer_destroy(&compressed_raw);
+ grpc_slice_buffer_destroy(&output);
+ grpc_slice_unref(final);
}
-static gpr_slice repeated(char c, size_t length) {
- gpr_slice out = gpr_slice_malloc(length);
- memset(GPR_SLICE_START_PTR(out), c, length);
+static grpc_slice repeated(char c, size_t length) {
+ grpc_slice out = grpc_slice_malloc(length);
+ memset(GRPC_SLICE_START_PTR(out), c, length);
return out;
}
@@ -134,10 +134,10 @@ static compressability get_compressability(
return MAYBE_COMPRESSES;
}
-static gpr_slice create_test_value(test_value id) {
+static grpc_slice create_test_value(test_value id) {
switch (id) {
case ONE_A:
- return gpr_slice_from_copied_string("a");
+ return grpc_slice_from_copied_string("a");
case ONE_KB_A:
return repeated('a', 1024);
case ONE_MB_A:
@@ -146,17 +146,17 @@ static gpr_slice create_test_value(test_value id) {
abort();
break;
}
- return gpr_slice_from_copied_string("bad value");
+ return grpc_slice_from_copied_string("bad value");
}
static void test_tiny_data_compress(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer output;
grpc_compression_algorithm i;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&output);
- gpr_slice_buffer_add(&input, create_test_value(ONE_A));
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&output);
+ grpc_slice_buffer_add(&input, create_test_value(ONE_A));
for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
if (i == GRPC_COMPRESS_NONE) continue;
@@ -164,81 +164,81 @@ static void test_tiny_data_compress(void) {
GPR_ASSERT(1 == output.count);
}
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&output);
}
static void test_bad_decompression_data_crc(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer corrupted;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer corrupted;
+ grpc_slice_buffer output;
size_t idx;
const uint32_t bad = 0xdeadbeef;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&corrupted);
- gpr_slice_buffer_init(&output);
- gpr_slice_buffer_add(&input, create_test_value(ONE_MB_A));
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&corrupted);
+ grpc_slice_buffer_init(&output);
+ grpc_slice_buffer_add(&input, create_test_value(ONE_MB_A));
/* compress it */
grpc_msg_compress(GRPC_COMPRESS_GZIP, &input, &corrupted);
/* corrupt the output by smashing the CRC */
GPR_ASSERT(corrupted.count > 1);
- GPR_ASSERT(GPR_SLICE_LENGTH(corrupted.slices[1]) > 8);
- idx = GPR_SLICE_LENGTH(corrupted.slices[1]) - 8;
- memcpy(GPR_SLICE_START_PTR(corrupted.slices[1]) + idx, &bad, 4);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(corrupted.slices[1]) > 8);
+ idx = GRPC_SLICE_LENGTH(corrupted.slices[1]) - 8;
+ memcpy(GRPC_SLICE_START_PTR(corrupted.slices[1]) + idx, &bad, 4);
/* try (and fail) to decompress the corrupted compresed buffer */
GPR_ASSERT(0 == grpc_msg_decompress(GRPC_COMPRESS_GZIP, &corrupted, &output));
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&corrupted);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&corrupted);
+ grpc_slice_buffer_destroy(&output);
}
static void test_bad_decompression_data_trailing_garbage(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer output;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&output);
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&output);
/* append 0x99 to the end of an otherwise valid stream */
- gpr_slice_buffer_add(
- &input, gpr_slice_from_copied_buffer(
+ grpc_slice_buffer_add(
+ &input, grpc_slice_from_copied_buffer(
"\x78\xda\x63\x60\x60\x60\x00\x00\x00\x04\x00\x01\x99", 13));
/* try (and fail) to decompress the invalid compresed buffer */
GPR_ASSERT(0 == grpc_msg_decompress(GRPC_COMPRESS_DEFLATE, &input, &output));
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&output);
}
static void test_bad_decompression_data_stream(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer output;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&output);
- gpr_slice_buffer_add(&input,
- gpr_slice_from_copied_buffer("\x78\xda\xff\xff", 4));
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&output);
+ grpc_slice_buffer_add(&input,
+ grpc_slice_from_copied_buffer("\x78\xda\xff\xff", 4));
/* try (and fail) to decompress the invalid compresed buffer */
GPR_ASSERT(0 == grpc_msg_decompress(GRPC_COMPRESS_DEFLATE, &input, &output));
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&output);
}
static void test_bad_compression_algorithm(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer output;
int was_compressed;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&output);
- gpr_slice_buffer_add(&input,
- gpr_slice_from_copied_string("Never gonna give you up"));
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&output);
+ grpc_slice_buffer_add(
+ &input, grpc_slice_from_copied_string("Never gonna give you up"));
was_compressed =
grpc_msg_compress(GRPC_COMPRESS_ALGORITHMS_COUNT, &input, &output);
GPR_ASSERT(0 == was_compressed);
@@ -247,20 +247,20 @@ static void test_bad_compression_algorithm(void) {
grpc_msg_compress(GRPC_COMPRESS_ALGORITHMS_COUNT + 123, &input, &output);
GPR_ASSERT(0 == was_compressed);
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&output);
}
static void test_bad_decompression_algorithm(void) {
- gpr_slice_buffer input;
- gpr_slice_buffer output;
+ grpc_slice_buffer input;
+ grpc_slice_buffer output;
int was_decompressed;
- gpr_slice_buffer_init(&input);
- gpr_slice_buffer_init(&output);
- gpr_slice_buffer_add(&input,
- gpr_slice_from_copied_string(
- "I'm not really compressed but it doesn't matter"));
+ grpc_slice_buffer_init(&input);
+ grpc_slice_buffer_init(&output);
+ grpc_slice_buffer_add(&input,
+ grpc_slice_from_copied_string(
+ "I'm not really compressed but it doesn't matter"));
was_decompressed =
grpc_msg_decompress(GRPC_COMPRESS_ALGORITHMS_COUNT, &input, &output);
GPR_ASSERT(0 == was_decompressed);
@@ -269,8 +269,8 @@ static void test_bad_decompression_algorithm(void) {
&input, &output);
GPR_ASSERT(0 == was_decompressed);
- gpr_slice_buffer_destroy(&input);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&input);
+ grpc_slice_buffer_destroy(&output);
}
int main(int argc, char **argv) {
@@ -288,9 +288,9 @@ int main(int argc, char **argv) {
for (j = 0; j < GPR_ARRAY_SIZE(uncompressed_split_modes); j++) {
for (k = 0; k < GPR_ARRAY_SIZE(compressed_split_modes); k++) {
for (m = 0; m < TEST_VALUE_COUNT; m++) {
- gpr_slice slice = create_test_value(m);
+ grpc_slice slice = create_test_value(m);
assert_passthrough(slice, i, j, k, get_compressability(m, i));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
}
}
diff --git a/test/core/end2end/bad_server_response_test.c b/test/core/end2end/bad_server_response_test.c
index 9a3e1301f9..30468558e8 100644
--- a/test/core/end2end/bad_server_response_test.c
+++ b/test/core/end2end/bad_server_response_test.c
@@ -40,13 +40,14 @@
#include <string.h>
#include <grpc/grpc.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/thd.h>
-// #include "src/core/ext/transport/chttp2/transport/internal.h"
+#include "src/core/lib/iomgr/sockaddr.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
#include "test/core/end2end/cq_verifier.h"
#include "test/core/util/port.h"
@@ -88,8 +89,8 @@ struct rpc_state {
grpc_channel *channel;
grpc_call *call;
size_t incoming_data_length;
- gpr_slice_buffer temp_incoming_buffer;
- gpr_slice_buffer outgoing_buffer;
+ grpc_slice_buffer temp_incoming_buffer;
+ grpc_slice_buffer outgoing_buffer;
grpc_endpoint *tcp;
gpr_atm done_atm;
bool write_done;
@@ -111,11 +112,11 @@ static void done_write(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
}
static void handle_write(grpc_exec_ctx *exec_ctx) {
- gpr_slice slice = gpr_slice_from_copied_buffer(state.response_payload,
- state.response_payload_length);
+ grpc_slice slice = grpc_slice_from_copied_buffer(
+ state.response_payload, state.response_payload_length);
- gpr_slice_buffer_reset_and_unref(&state.outgoing_buffer);
- gpr_slice_buffer_add(&state.outgoing_buffer, slice);
+ grpc_slice_buffer_reset_and_unref(&state.outgoing_buffer);
+ grpc_slice_buffer_add(&state.outgoing_buffer, slice);
grpc_endpoint_write(exec_ctx, state.tcp, &state.outgoing_buffer, &on_write);
}
@@ -125,8 +126,8 @@ static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
size_t i;
for (i = 0; i < state.temp_incoming_buffer.count; i++) {
- char *dump = gpr_dump_slice(state.temp_incoming_buffer.slices[i],
- GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *dump = grpc_dump_slice(state.temp_incoming_buffer.slices[i],
+ GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_DEBUG, "Server received: %s", dump);
gpr_free(dump);
}
@@ -144,11 +145,12 @@ static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
grpc_pollset *accepting_pollset,
grpc_tcp_server_acceptor *acceptor) {
+ gpr_free(acceptor);
test_tcp_server *server = arg;
grpc_closure_init(&on_read, handle_read, NULL);
grpc_closure_init(&on_write, done_write, NULL);
- gpr_slice_buffer_init(&state.temp_incoming_buffer);
- gpr_slice_buffer_init(&state.outgoing_buffer);
+ grpc_slice_buffer_init(&state.temp_incoming_buffer);
+ grpc_slice_buffer_init(&state.outgoing_buffer);
state.tcp = tcp;
state.incoming_data_length = 0;
grpc_endpoint_add_to_pollset(exec_ctx, tcp, server->pollset);
@@ -227,8 +229,8 @@ static void start_rpc(int target_port, grpc_status_code expected_status,
static void cleanup_rpc(void) {
grpc_event ev;
- gpr_slice_buffer_destroy(&state.temp_incoming_buffer);
- gpr_slice_buffer_destroy(&state.outgoing_buffer);
+ grpc_slice_buffer_destroy(&state.temp_incoming_buffer);
+ grpc_slice_buffer_destroy(&state.outgoing_buffer);
grpc_call_destroy(state.call);
grpc_completion_queue_shutdown(state.cq);
do {
diff --git a/test/core/end2end/connection_refused_test.c b/test/core/end2end/connection_refused_test.c
index 07d7010daa..728d6dca59 100644
--- a/test/core/end2end/connection_refused_test.c
+++ b/test/core/end2end/connection_refused_test.c
@@ -39,8 +39,11 @@
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/transport/metadata.h"
+#include "src/core/lib/transport/service_config.h"
+
#include "test/core/end2end/cq_verifier.h"
-#include "test/core/end2end/fake_resolver.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"
@@ -62,7 +65,6 @@ static void run_test(bool wait_for_ready, bool use_service_config) {
gpr_log(GPR_INFO, "TEST: wait_for_ready=%d use_service_config=%d",
wait_for_ready, use_service_config);
- grpc_fake_resolver_init();
grpc_init();
grpc_metadata_array_init(&trailing_metadata_recv);
@@ -70,21 +72,31 @@ static void run_test(bool wait_for_ready, bool use_service_config) {
cq = grpc_completion_queue_create(NULL);
cqv = cq_verifier_create(cq);
+ /* if using service config, create channel args */
+ grpc_channel_args *args = NULL;
+ if (use_service_config) {
+ GPR_ASSERT(wait_for_ready);
+ grpc_arg arg;
+ arg.type = GRPC_ARG_STRING;
+ arg.key = GRPC_ARG_SERVICE_CONFIG;
+ arg.value.string =
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"waitForReady\": true\n"
+ " } ]\n"
+ "}";
+ args = grpc_channel_args_copy_and_add(args, &arg, 1);
+ }
+
/* create a call, channel to a port which will refuse connection */
int port = grpc_pick_unused_port_or_die();
char *addr;
gpr_join_host_port(&addr, "127.0.0.1", port);
- if (use_service_config) {
- GPR_ASSERT(wait_for_ready);
- char *server_uri;
- gpr_asprintf(&server_uri,
- "test:%s?method_name=/service/method&wait_for_ready=1", addr);
- gpr_free(addr);
- addr = server_uri;
- }
gpr_log(GPR_INFO, "server: %s", addr);
-
- chan = grpc_insecure_channel_create(addr, NULL, NULL);
+ chan = grpc_insecure_channel_create(addr, args, NULL);
call = grpc_channel_create_call(chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq,
"/service/method", "nonexistant", deadline,
NULL);
@@ -133,6 +145,8 @@ static void run_test(bool wait_for_ready, bool use_service_config) {
gpr_free(details);
grpc_metadata_array_destroy(&trailing_metadata_recv);
+ if (args != NULL) grpc_channel_args_destroy(args);
+
grpc_shutdown();
}
diff --git a/test/core/end2end/cq_verifier.c b/test/core/end2end/cq_verifier.c
index 3e7e3f22a2..57373970c4 100644
--- a/test/core/end2end/cq_verifier.c
+++ b/test/core/end2end/cq_verifier.c
@@ -105,44 +105,45 @@ int contains_metadata(grpc_metadata_array *array, const char *key,
return has_metadata(array->metadata, array->count, key, value);
}
-static gpr_slice merge_slices(gpr_slice *slices, size_t nslices) {
+static grpc_slice merge_slices(grpc_slice *slices, size_t nslices) {
size_t i;
size_t len = 0;
uint8_t *cursor;
- gpr_slice out;
+ grpc_slice out;
for (i = 0; i < nslices; i++) {
- len += GPR_SLICE_LENGTH(slices[i]);
+ len += GRPC_SLICE_LENGTH(slices[i]);
}
- out = gpr_slice_malloc(len);
- cursor = GPR_SLICE_START_PTR(out);
+ out = grpc_slice_malloc(len);
+ cursor = GRPC_SLICE_START_PTR(out);
for (i = 0; i < nslices; i++) {
- memcpy(cursor, GPR_SLICE_START_PTR(slices[i]), GPR_SLICE_LENGTH(slices[i]));
- cursor += GPR_SLICE_LENGTH(slices[i]);
+ memcpy(cursor, GRPC_SLICE_START_PTR(slices[i]),
+ GRPC_SLICE_LENGTH(slices[i]));
+ cursor += GRPC_SLICE_LENGTH(slices[i]);
}
return out;
}
-int raw_byte_buffer_eq_slice(grpc_byte_buffer *rbb, gpr_slice b) {
- gpr_slice a;
+int raw_byte_buffer_eq_slice(grpc_byte_buffer *rbb, grpc_slice b) {
+ grpc_slice a;
int ok;
if (!rbb) return 0;
a = merge_slices(rbb->data.raw.slice_buffer.slices,
rbb->data.raw.slice_buffer.count);
- ok = GPR_SLICE_LENGTH(a) == GPR_SLICE_LENGTH(b) &&
- 0 == memcmp(GPR_SLICE_START_PTR(a), GPR_SLICE_START_PTR(b),
- GPR_SLICE_LENGTH(a));
- gpr_slice_unref(a);
- gpr_slice_unref(b);
+ ok = GRPC_SLICE_LENGTH(a) == GRPC_SLICE_LENGTH(b) &&
+ 0 == memcmp(GRPC_SLICE_START_PTR(a), GRPC_SLICE_START_PTR(b),
+ GRPC_SLICE_LENGTH(a));
+ grpc_slice_unref(a);
+ grpc_slice_unref(b);
return ok;
}
-int byte_buffer_eq_slice(grpc_byte_buffer *bb, gpr_slice b) {
+int byte_buffer_eq_slice(grpc_byte_buffer *bb, grpc_slice b) {
grpc_byte_buffer_reader reader;
grpc_byte_buffer *rbb;
int res;
@@ -165,7 +166,7 @@ int byte_buffer_eq_string(grpc_byte_buffer *bb, const char *str) {
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) &&
"Couldn't init byte buffer reader");
rbb = grpc_raw_byte_buffer_from_reader(&reader);
- res = raw_byte_buffer_eq_slice(rbb, gpr_slice_from_copied_string(str));
+ res = raw_byte_buffer_eq_slice(rbb, grpc_slice_from_copied_string(str));
grpc_byte_buffer_reader_destroy(&reader);
grpc_byte_buffer_destroy(rbb);
diff --git a/test/core/end2end/cq_verifier.h b/test/core/end2end/cq_verifier.h
index 47464fa319..b754de9bbe 100644
--- a/test/core/end2end/cq_verifier.h
+++ b/test/core/end2end/cq_verifier.h
@@ -67,7 +67,7 @@ void cq_expect_completion(cq_verifier *v, const char *file, int line, void *tag,
#define CQ_EXPECT_COMPLETION(v, tag, success) \
cq_expect_completion(v, __FILE__, __LINE__, tag, success)
-int byte_buffer_eq_slice(grpc_byte_buffer *bb, gpr_slice b);
+int byte_buffer_eq_slice(grpc_byte_buffer *bb, grpc_slice b);
int byte_buffer_eq_string(grpc_byte_buffer *byte_buffer, const char *string);
int contains_metadata(grpc_metadata_array *array, const char *key,
const char *value);
diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c
index f427202a7b..11e8604f56 100644
--- a/test/core/end2end/dualstack_socket_test.c
+++ b/test/core/end2end/dualstack_socket_test.c
@@ -46,8 +46,8 @@
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/socket_utils_posix.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
-
#include "test/core/end2end/cq_verifier.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"
@@ -125,17 +125,17 @@ void test_connect(const char *server_host, const char *client_host, int port,
if (client_host[0] == 'i') {
/* for ipv4:/ipv6: addresses, concatenate the port to each of the parts */
size_t i;
- gpr_slice uri_slice;
- gpr_slice_buffer uri_parts;
+ grpc_slice uri_slice;
+ grpc_slice_buffer uri_parts;
char **hosts_with_port;
uri_slice =
- gpr_slice_new((char *)client_host, strlen(client_host), do_nothing);
- gpr_slice_buffer_init(&uri_parts);
- gpr_slice_split(uri_slice, ",", &uri_parts);
+ grpc_slice_new((char *)client_host, strlen(client_host), do_nothing);
+ grpc_slice_buffer_init(&uri_parts);
+ grpc_slice_split(uri_slice, ",", &uri_parts);
hosts_with_port = gpr_malloc(sizeof(char *) * uri_parts.count);
for (i = 0; i < uri_parts.count; i++) {
- char *uri_part_str = gpr_dump_slice(uri_parts.slices[i], GPR_DUMP_ASCII);
+ char *uri_part_str = grpc_dump_slice(uri_parts.slices[i], GPR_DUMP_ASCII);
gpr_asprintf(&hosts_with_port[i], "%s:%d", uri_part_str, port);
gpr_free(uri_part_str);
}
@@ -145,8 +145,8 @@ void test_connect(const char *server_host, const char *client_host, int port,
gpr_free(hosts_with_port[i]);
}
gpr_free(hosts_with_port);
- gpr_slice_buffer_destroy(&uri_parts);
- gpr_slice_unref(uri_slice);
+ grpc_slice_buffer_destroy(&uri_parts);
+ grpc_slice_unref(uri_slice);
} else {
gpr_join_host_port(&client_hostport, client_host, port);
}
diff --git a/test/core/end2end/end2end_nosec_tests.c b/test/core/end2end/end2end_nosec_tests.c
index a630262197..663489082f 100644
--- a/test/core/end2end/end2end_nosec_tests.c
+++ b/test/core/end2end/end2end_nosec_tests.c
@@ -43,6 +43,8 @@
static bool g_pre_init_called = false;
+extern void authority_not_supported(grpc_end2end_test_config config);
+extern void authority_not_supported_pre_init(void);
extern void bad_hostname(grpc_end2end_test_config config);
extern void bad_hostname_pre_init(void);
extern void binary_metadata(grpc_end2end_test_config config);
@@ -73,6 +75,8 @@ extern void filter_call_init_fails(grpc_end2end_test_config config);
extern void filter_call_init_fails_pre_init(void);
extern void filter_causes_close(grpc_end2end_test_config config);
extern void filter_causes_close_pre_init(void);
+extern void filter_latency(grpc_end2end_test_config config);
+extern void filter_latency_pre_init(void);
extern void graceful_server_shutdown(grpc_end2end_test_config config);
extern void graceful_server_shutdown_pre_init(void);
extern void high_initial_seqno(grpc_end2end_test_config config);
@@ -111,6 +115,8 @@ extern void request_with_flags(grpc_end2end_test_config config);
extern void request_with_flags_pre_init(void);
extern void request_with_payload(grpc_end2end_test_config config);
extern void request_with_payload_pre_init(void);
+extern void resource_quota_server(grpc_end2end_test_config config);
+extern void resource_quota_server_pre_init(void);
extern void server_finishes_request(grpc_end2end_test_config config);
extern void server_finishes_request_pre_init(void);
extern void shutdown_finishes_calls(grpc_end2end_test_config config);
@@ -133,6 +139,7 @@ extern void trailing_metadata_pre_init(void);
void grpc_end2end_tests_pre_init(void) {
GPR_ASSERT(!g_pre_init_called);
g_pre_init_called = true;
+ authority_not_supported_pre_init();
bad_hostname_pre_init();
binary_metadata_pre_init();
cancel_after_accept_pre_init();
@@ -148,6 +155,7 @@ void grpc_end2end_tests_pre_init(void) {
empty_batch_pre_init();
filter_call_init_fails_pre_init();
filter_causes_close_pre_init();
+ filter_latency_pre_init();
graceful_server_shutdown_pre_init();
high_initial_seqno_pre_init();
hpack_size_pre_init();
@@ -167,6 +175,7 @@ void grpc_end2end_tests_pre_init(void) {
registered_call_pre_init();
request_with_flags_pre_init();
request_with_payload_pre_init();
+ resource_quota_server_pre_init();
server_finishes_request_pre_init();
shutdown_finishes_calls_pre_init();
shutdown_finishes_tags_pre_init();
@@ -185,6 +194,7 @@ void grpc_end2end_tests(int argc, char **argv,
GPR_ASSERT(g_pre_init_called);
if (argc <= 1) {
+ authority_not_supported(config);
bad_hostname(config);
binary_metadata(config);
cancel_after_accept(config);
@@ -200,6 +210,7 @@ void grpc_end2end_tests(int argc, char **argv,
empty_batch(config);
filter_call_init_fails(config);
filter_causes_close(config);
+ filter_latency(config);
graceful_server_shutdown(config);
high_initial_seqno(config);
hpack_size(config);
@@ -219,6 +230,7 @@ void grpc_end2end_tests(int argc, char **argv,
registered_call(config);
request_with_flags(config);
request_with_payload(config);
+ resource_quota_server(config);
server_finishes_request(config);
shutdown_finishes_calls(config);
shutdown_finishes_tags(config);
@@ -232,6 +244,10 @@ void grpc_end2end_tests(int argc, char **argv,
}
for (i = 1; i < argc; i++) {
+ if (0 == strcmp("authority_not_supported", argv[i])) {
+ authority_not_supported(config);
+ continue;
+ }
if (0 == strcmp("bad_hostname", argv[i])) {
bad_hostname(config);
continue;
@@ -292,6 +308,10 @@ void grpc_end2end_tests(int argc, char **argv,
filter_causes_close(config);
continue;
}
+ if (0 == strcmp("filter_latency", argv[i])) {
+ filter_latency(config);
+ continue;
+ }
if (0 == strcmp("graceful_server_shutdown", argv[i])) {
graceful_server_shutdown(config);
continue;
@@ -368,6 +388,10 @@ void grpc_end2end_tests(int argc, char **argv,
request_with_payload(config);
continue;
}
+ if (0 == strcmp("resource_quota_server", argv[i])) {
+ resource_quota_server(config);
+ continue;
+ }
if (0 == strcmp("server_finishes_request", argv[i])) {
server_finishes_request(config);
continue;
diff --git a/test/core/end2end/end2end_test_utils.c b/test/core/end2end/end2end_test_utils.c
new file mode 100644
index 0000000000..46fb4ec1af
--- /dev/null
+++ b/test/core/end2end/end2end_test_utils.c
@@ -0,0 +1,51 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <string.h>
+
+#include <grpc/support/log.h>
+
+const char *get_host_override_string(const char *str,
+ grpc_end2end_test_config config) {
+ return (config.feature_mask & FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER ? str
+ : NULL);
+}
+
+void validate_host_override_string(const char *pattern, const char *str,
+ grpc_end2end_test_config config) {
+ if (config.feature_mask & FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER) {
+ GPR_ASSERT(0 == strcmp(str, pattern));
+ }
+}
diff --git a/test/core/end2end/end2end_tests.c b/test/core/end2end/end2end_tests.c
index 925872a71f..25c7c62fde 100644
--- a/test/core/end2end/end2end_tests.c
+++ b/test/core/end2end/end2end_tests.c
@@ -43,6 +43,8 @@
static bool g_pre_init_called = false;
+extern void authority_not_supported(grpc_end2end_test_config config);
+extern void authority_not_supported_pre_init(void);
extern void bad_hostname(grpc_end2end_test_config config);
extern void bad_hostname_pre_init(void);
extern void binary_metadata(grpc_end2end_test_config config);
@@ -75,6 +77,8 @@ extern void filter_call_init_fails(grpc_end2end_test_config config);
extern void filter_call_init_fails_pre_init(void);
extern void filter_causes_close(grpc_end2end_test_config config);
extern void filter_causes_close_pre_init(void);
+extern void filter_latency(grpc_end2end_test_config config);
+extern void filter_latency_pre_init(void);
extern void graceful_server_shutdown(grpc_end2end_test_config config);
extern void graceful_server_shutdown_pre_init(void);
extern void high_initial_seqno(grpc_end2end_test_config config);
@@ -113,6 +117,8 @@ extern void request_with_flags(grpc_end2end_test_config config);
extern void request_with_flags_pre_init(void);
extern void request_with_payload(grpc_end2end_test_config config);
extern void request_with_payload_pre_init(void);
+extern void resource_quota_server(grpc_end2end_test_config config);
+extern void resource_quota_server_pre_init(void);
extern void server_finishes_request(grpc_end2end_test_config config);
extern void server_finishes_request_pre_init(void);
extern void shutdown_finishes_calls(grpc_end2end_test_config config);
@@ -135,6 +141,7 @@ extern void trailing_metadata_pre_init(void);
void grpc_end2end_tests_pre_init(void) {
GPR_ASSERT(!g_pre_init_called);
g_pre_init_called = true;
+ authority_not_supported_pre_init();
bad_hostname_pre_init();
binary_metadata_pre_init();
call_creds_pre_init();
@@ -151,6 +158,7 @@ void grpc_end2end_tests_pre_init(void) {
empty_batch_pre_init();
filter_call_init_fails_pre_init();
filter_causes_close_pre_init();
+ filter_latency_pre_init();
graceful_server_shutdown_pre_init();
high_initial_seqno_pre_init();
hpack_size_pre_init();
@@ -170,6 +178,7 @@ void grpc_end2end_tests_pre_init(void) {
registered_call_pre_init();
request_with_flags_pre_init();
request_with_payload_pre_init();
+ resource_quota_server_pre_init();
server_finishes_request_pre_init();
shutdown_finishes_calls_pre_init();
shutdown_finishes_tags_pre_init();
@@ -188,6 +197,7 @@ void grpc_end2end_tests(int argc, char **argv,
GPR_ASSERT(g_pre_init_called);
if (argc <= 1) {
+ authority_not_supported(config);
bad_hostname(config);
binary_metadata(config);
call_creds(config);
@@ -204,6 +214,7 @@ void grpc_end2end_tests(int argc, char **argv,
empty_batch(config);
filter_call_init_fails(config);
filter_causes_close(config);
+ filter_latency(config);
graceful_server_shutdown(config);
high_initial_seqno(config);
hpack_size(config);
@@ -223,6 +234,7 @@ void grpc_end2end_tests(int argc, char **argv,
registered_call(config);
request_with_flags(config);
request_with_payload(config);
+ resource_quota_server(config);
server_finishes_request(config);
shutdown_finishes_calls(config);
shutdown_finishes_tags(config);
@@ -236,6 +248,10 @@ void grpc_end2end_tests(int argc, char **argv,
}
for (i = 1; i < argc; i++) {
+ if (0 == strcmp("authority_not_supported", argv[i])) {
+ authority_not_supported(config);
+ continue;
+ }
if (0 == strcmp("bad_hostname", argv[i])) {
bad_hostname(config);
continue;
@@ -300,6 +316,10 @@ void grpc_end2end_tests(int argc, char **argv,
filter_causes_close(config);
continue;
}
+ if (0 == strcmp("filter_latency", argv[i])) {
+ filter_latency(config);
+ continue;
+ }
if (0 == strcmp("graceful_server_shutdown", argv[i])) {
graceful_server_shutdown(config);
continue;
@@ -376,6 +396,10 @@ void grpc_end2end_tests(int argc, char **argv,
request_with_payload(config);
continue;
}
+ if (0 == strcmp("resource_quota_server", argv[i])) {
+ resource_quota_server(config);
+ continue;
+ }
if (0 == strcmp("server_finishes_request", argv[i])) {
server_finishes_request(config);
continue;
diff --git a/test/core/end2end/end2end_tests.h b/test/core/end2end/end2end_tests.h
index e20273de90..f25e90b5f6 100644
--- a/test/core/end2end/end2end_tests.h
+++ b/test/core/end2end/end2end_tests.h
@@ -43,7 +43,8 @@ typedef struct grpc_end2end_test_config grpc_end2end_test_config;
#define FEATURE_MASK_SUPPORTS_HOSTNAME_VERIFICATION 2
#define FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS 4
#define FEATURE_MASK_SUPPORTS_REQUEST_PROXYING 8
-#define FEATURE_MASK_SUPPORTS_QUERY_ARGS 16
+#define FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL 16
+#define FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER 32
#define FAIL_AUTH_CHECK_SERVER_ARG_NAME "fail_auth_check"
@@ -60,7 +61,7 @@ struct grpc_end2end_test_config {
grpc_end2end_test_fixture (*create_fixture)(grpc_channel_args *client_args,
grpc_channel_args *server_args);
void (*init_client)(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args, const char *query_args);
+ grpc_channel_args *client_args);
void (*init_server)(grpc_end2end_test_fixture *f,
grpc_channel_args *server_args);
void (*tear_down_data)(grpc_end2end_test_fixture *f);
@@ -69,4 +70,10 @@ struct grpc_end2end_test_config {
void grpc_end2end_tests_pre_init(void);
void grpc_end2end_tests(int argc, char **argv, grpc_end2end_test_config config);
+const char *get_host_override_string(const char *str,
+ grpc_end2end_test_config config);
+
+void validate_host_override_string(const char *pattern, const char *str,
+ grpc_end2end_test_config config);
+
#endif /* GRPC_TEST_CORE_END2END_END2END_TESTS_H */
diff --git a/test/core/end2end/fake_resolver.c b/test/core/end2end/fake_resolver.c
index a2343cb709..ed85030797 100644
--- a/test/core/end2end/fake_resolver.c
+++ b/test/core/end2end/fake_resolver.c
@@ -48,8 +48,8 @@
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/unix_sockets_posix.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
-#include "src/core/lib/transport/method_config.h"
//
// fake_resolver
@@ -62,8 +62,6 @@ typedef struct {
// passed-in parameters
grpc_channel_args* channel_args;
grpc_lb_addresses* addresses;
- char* lb_policy_name;
- grpc_method_config_table* method_config_table;
// mutex guarding the rest of the state
gpr_mu mu;
@@ -80,8 +78,6 @@ static void fake_resolver_destroy(grpc_exec_ctx* exec_ctx, grpc_resolver* gr) {
gpr_mu_destroy(&r->mu);
grpc_channel_args_destroy(r->channel_args);
grpc_lb_addresses_destroy(r->addresses);
- gpr_free(r->lb_policy_name);
- grpc_method_config_table_unref(r->method_config_table);
gpr_free(r);
}
@@ -101,21 +97,9 @@ static void fake_resolver_maybe_finish_next_locked(grpc_exec_ctx* exec_ctx,
fake_resolver* r) {
if (r->next_completion != NULL && !r->published) {
r->published = true;
- grpc_arg new_args[3];
- size_t num_args = 0;
- new_args[num_args++] = grpc_lb_addresses_create_channel_arg(r->addresses);
- if (r->method_config_table != NULL) {
- new_args[num_args++] =
- grpc_method_config_table_create_channel_arg(r->method_config_table);
- }
- if (r->lb_policy_name != NULL) {
- new_args[num_args].type = GRPC_ARG_STRING;
- new_args[num_args].key = GRPC_ARG_LB_POLICY_NAME;
- new_args[num_args].value.string = r->lb_policy_name;
- ++num_args;
- }
+ grpc_arg arg = grpc_lb_addresses_create_channel_arg(r->addresses);
*r->target_result =
- grpc_channel_args_copy_and_add(r->channel_args, new_args, num_args);
+ grpc_channel_args_copy_and_add(r->channel_args, &arg, 1);
grpc_exec_ctx_sched(exec_ctx, r->next_completion, GRPC_ERROR_NONE, NULL);
r->next_completion = NULL;
}
@@ -156,7 +140,8 @@ static void fake_resolver_factory_unref(grpc_resolver_factory* factory) {}
static void do_nothing(void* ignored) {}
-static grpc_resolver* fake_resolver_create(grpc_resolver_factory* factory,
+static grpc_resolver* fake_resolver_create(grpc_exec_ctx* exec_ctx,
+ grpc_resolver_factory* factory,
grpc_resolver_args* args) {
if (0 != strcmp(args->uri->authority, "")) {
gpr_log(GPR_ERROR, "authority based uri's not supported by the %s scheme",
@@ -169,17 +154,17 @@ static grpc_resolver* fake_resolver_create(grpc_resolver_factory* factory,
const bool lb_enabled =
lb_enabled_qpart != NULL && strcmp("0", lb_enabled_qpart) != 0;
// Construct addresses.
- gpr_slice path_slice =
- gpr_slice_new(args->uri->path, strlen(args->uri->path), do_nothing);
- gpr_slice_buffer path_parts;
- gpr_slice_buffer_init(&path_parts);
- gpr_slice_split(path_slice, ",", &path_parts);
+ grpc_slice path_slice =
+ grpc_slice_new(args->uri->path, strlen(args->uri->path), do_nothing);
+ grpc_slice_buffer path_parts;
+ grpc_slice_buffer_init(&path_parts);
+ grpc_slice_split(path_slice, ",", &path_parts);
grpc_lb_addresses* addresses =
grpc_lb_addresses_create(path_parts.count, NULL /* user_data_vtable */);
bool errors_found = false;
for (size_t i = 0; i < addresses->num_addresses; i++) {
grpc_uri ith_uri = *args->uri;
- char* part_str = gpr_dump_slice(path_parts.slices[i], GPR_DUMP_ASCII);
+ char* part_str = grpc_dump_slice(path_parts.slices[i], GPR_DUMP_ASCII);
ith_uri.path = part_str;
if (!parse_ipv4(&ith_uri, &addresses->addresses[i].address)) {
errors_found = true;
@@ -188,64 +173,17 @@ static grpc_resolver* fake_resolver_create(grpc_resolver_factory* factory,
addresses->addresses[i].is_balancer = lb_enabled;
if (errors_found) break;
}
- gpr_slice_buffer_destroy(&path_parts);
- gpr_slice_unref(path_slice);
+ grpc_slice_buffer_destroy(&path_parts);
+ grpc_slice_unref(path_slice);
if (errors_found) {
grpc_lb_addresses_destroy(addresses);
return NULL;
}
- // Construct method config table.
- // We only support parameters for a single method.
- grpc_method_config_table* method_config_table = NULL;
- const char* method_name = grpc_uri_get_query_arg(args->uri, "method_name");
- if (method_name != NULL) {
- const char* wait_for_ready_str =
- grpc_uri_get_query_arg(args->uri, "wait_for_ready");
- // Anything other than "0" is interpreted as true.
- bool wait_for_ready =
- wait_for_ready_str != NULL && strcmp("0", wait_for_ready_str) != 0;
- const char* timeout_str =
- grpc_uri_get_query_arg(args->uri, "timeout_seconds");
- gpr_timespec timeout = {timeout_str == NULL ? 0 : atoi(timeout_str), 0,
- GPR_TIMESPAN};
- const char* max_request_message_bytes_str =
- grpc_uri_get_query_arg(args->uri, "max_request_message_bytes");
- int32_t max_request_message_bytes =
- max_request_message_bytes_str == NULL
- ? 0
- : atoi(max_request_message_bytes_str);
- const char* max_response_message_bytes_str =
- grpc_uri_get_query_arg(args->uri, "max_response_message_bytes");
- int32_t max_response_message_bytes =
- max_response_message_bytes_str == NULL
- ? 0
- : atoi(max_response_message_bytes_str);
- grpc_method_config* method_config = grpc_method_config_create(
- wait_for_ready_str == NULL ? NULL : &wait_for_ready,
- timeout_str == NULL ? NULL : &timeout,
- max_request_message_bytes_str == NULL ? NULL
- : &max_request_message_bytes,
- max_response_message_bytes_str == NULL ? NULL
- : &max_response_message_bytes);
- grpc_method_config_table_entry entry = {grpc_mdstr_from_string(method_name),
- method_config};
- method_config_table = grpc_method_config_table_create(1, &entry);
- GRPC_MDSTR_UNREF(entry.method_name);
- grpc_method_config_unref(method_config);
- }
// Instantiate resolver.
fake_resolver* r = gpr_malloc(sizeof(fake_resolver));
memset(r, 0, sizeof(*r));
- grpc_arg server_name_arg;
- server_name_arg.type = GRPC_ARG_STRING;
- server_name_arg.key = GRPC_ARG_SERVER_NAME;
- server_name_arg.value.string = args->uri->path;
- r->channel_args =
- grpc_channel_args_copy_and_add(args->args, &server_name_arg, 1);
+ r->channel_args = grpc_channel_args_copy(args->args);
r->addresses = addresses;
- r->lb_policy_name =
- gpr_strdup(grpc_uri_get_query_arg(args->uri, "lb_policy"));
- r->method_config_table = method_config_table;
gpr_mu_init(&r->mu);
grpc_resolver_init(&r->base, &fake_resolver_vtable);
return &r->base;
diff --git a/test/core/end2end/fixtures/h2_census.c b/test/core/end2end/fixtures/h2_census.c
index c2e1acf57f..c52d7660f5 100644
--- a/test/core/end2end/fixtures/h2_census.c
+++ b/test/core/end2end/fixtures/h2_census.c
@@ -79,9 +79,7 @@ static grpc_arg make_census_enable_arg(void) {
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
grpc_arg arg = make_census_enable_arg();
client_args = grpc_channel_args_copy_and_add(client_args, &arg, 1);
@@ -113,7 +111,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack+census", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack+census", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_compress.c b/test/core/end2end/fixtures/h2_compress.c
index 94a198f380..fedd2ebc46 100644
--- a/test/core/end2end/fixtures/h2_compress.c
+++ b/test/core/end2end/fixtures/h2_compress.c
@@ -75,9 +75,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_compression(
}
void chttp2_init_client_fullstack_compression(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_compression_fixture_data *ffd = f->fixture_data;
if (ffd->client_args_compression != NULL) {
grpc_channel_args_destroy(ffd->client_args_compression);
@@ -115,7 +113,9 @@ void chttp2_tear_down_fullstack_compression(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack_compression", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack_compression", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack_compression,
chttp2_init_client_fullstack_compression,
chttp2_init_server_fullstack_compression,
diff --git a/test/core/end2end/fixtures/h2_fake_resolver.c b/test/core/end2end/fixtures/h2_fake_resolver.c
deleted file mode 100644
index 429f3c95f9..0000000000
--- a/test/core/end2end/fixtures/h2_fake_resolver.c
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-// Copyright 2016, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#include "test/core/end2end/end2end_tests.h"
-
-#include <string.h>
-
-#include <grpc/support/alloc.h>
-#include <grpc/support/host_port.h>
-#include <grpc/support/log.h>
-#include <grpc/support/string_util.h>
-#include <grpc/support/sync.h>
-#include <grpc/support/thd.h>
-#include <grpc/support/useful.h>
-
-#include "src/core/ext/client_channel/client_channel.h"
-#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
-#include "src/core/lib/channel/connected_channel.h"
-#include "src/core/lib/channel/http_server_filter.h"
-#include "src/core/lib/surface/channel.h"
-#include "src/core/lib/surface/server.h"
-#include "test/core/end2end/fake_resolver.h"
-#include "test/core/util/port.h"
-#include "test/core/util/test_config.h"
-
-typedef struct fullstack_fixture_data {
- char *localaddr;
-} fullstack_fixture_data;
-
-static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
- grpc_channel_args *client_args, grpc_channel_args *server_args) {
- grpc_end2end_test_fixture f;
- int port = grpc_pick_unused_port_or_die();
- fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
- memset(&f, 0, sizeof(f));
-
- gpr_join_host_port(&ffd->localaddr, "127.0.0.1", port);
-
- f.fixture_data = ffd;
- f.cq = grpc_completion_queue_create(NULL);
-
- return f;
-}
-
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- fullstack_fixture_data *ffd = f->fixture_data;
- char *server_uri;
- gpr_asprintf(&server_uri, "test:%s%s%s", ffd->localaddr,
- (query_args == NULL ? "" : "?"),
- (query_args == NULL ? "" : query_args));
- gpr_log(GPR_INFO, "server_uri: %s", server_uri);
- f->client = grpc_insecure_channel_create(server_uri, client_args, NULL);
- GPR_ASSERT(f->client);
- gpr_free(server_uri);
-}
-
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *server_args) {
- fullstack_fixture_data *ffd = f->fixture_data;
- if (f->server) {
- grpc_server_destroy(f->server);
- }
- f->server = grpc_server_create(server_args, NULL);
- grpc_server_register_completion_queue(f->server, f->cq, NULL);
- GPR_ASSERT(grpc_server_add_insecure_http2_port(f->server, ffd->localaddr));
- grpc_server_start(f->server);
-}
-
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
- fullstack_fixture_data *ffd = f->fixture_data;
- gpr_free(ffd->localaddr);
- gpr_free(ffd);
-}
-
-/* All test configurations */
-static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
- FEATURE_MASK_SUPPORTS_QUERY_ARGS,
- chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
- chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
-};
-
-int main(int argc, char **argv) {
- size_t i;
-
- grpc_test_init(argc, argv);
- grpc_end2end_tests_pre_init();
- grpc_fake_resolver_init();
- grpc_init();
-
- for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) {
- grpc_end2end_tests(argc, argv, configs[i]);
- }
-
- grpc_shutdown();
-
- return 0;
-}
diff --git a/test/core/end2end/fixtures/h2_fakesec.c b/test/core/end2end/fixtures/h2_fakesec.c
index dbe9011dcf..c9747913c2 100644
--- a/test/core/end2end/fixtures/h2_fakesec.c
+++ b/test/core/end2end/fixtures/h2_fakesec.c
@@ -105,9 +105,7 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
}
static void chttp2_init_client_fake_secure_fullstack(
- grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
grpc_channel_credentials *fake_ts_creds =
grpc_fake_transport_security_credentials_create();
chttp2_init_client_secure_fullstack(f, client_args, fake_ts_creds);
@@ -142,7 +140,9 @@ static void chttp2_init_server_fake_secure_fullstack(
static grpc_end2end_test_config configs[] = {
{"chttp2/fake_secure_fullstack",
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
- FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS,
+ FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_secure_fullstack,
chttp2_init_client_fake_secure_fullstack,
chttp2_init_server_fake_secure_fullstack,
diff --git a/test/core/end2end/fixtures/h2_fd.c b/test/core/end2end/fixtures/h2_fd.c
index 2dfa54fb6b..223fadc386 100644
--- a/test/core/end2end/fixtures/h2_fd.c
+++ b/test/core/end2end/fixtures/h2_fd.c
@@ -78,10 +78,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
}
static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
-
+ grpc_channel_args *client_args) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
sp_fixture_data *sfd = f->fixture_data;
@@ -114,9 +111,9 @@ static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fd", 0, chttp2_create_fixture_socketpair,
- chttp2_init_client_socketpair, chttp2_init_server_socketpair,
- chttp2_tear_down_socketpair},
+ {"chttp2/fd", FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+ chttp2_create_fixture_socketpair, chttp2_init_client_socketpair,
+ chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
};
int main(int argc, char **argv) {
diff --git a/test/core/end2end/fixtures/h2_full+pipe.c b/test/core/end2end/fixtures/h2_full+pipe.c
index e0026a7940..c6013f3040 100644
--- a/test/core/end2end/fixtures/h2_full+pipe.c
+++ b/test/core/end2end/fixtures/h2_full+pipe.c
@@ -76,9 +76,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
GPR_ASSERT(f->client);
@@ -104,7 +102,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_full+trace.c b/test/core/end2end/fixtures/h2_full+trace.c
index eadc62d963..11a102a576 100644
--- a/test/core/end2end/fixtures/h2_full+trace.c
+++ b/test/core/end2end/fixtures/h2_full+trace.c
@@ -76,9 +76,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
GPR_ASSERT(f->client);
@@ -104,7 +102,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_full.c b/test/core/end2end/fixtures/h2_full.c
index 182ce23a51..3399f1981e 100644
--- a/test/core/end2end/fixtures/h2_full.c
+++ b/test/core/end2end/fixtures/h2_full.c
@@ -70,9 +70,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
GPR_ASSERT(f->client);
@@ -98,7 +96,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_http_proxy.c b/test/core/end2end/fixtures/h2_http_proxy.c
index 2acc06f549..44b223664a 100644
--- a/test/core/end2end/fixtures/h2_http_proxy.c
+++ b/test/core/end2end/fixtures/h2_http_proxy.c
@@ -75,9 +75,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
char *proxy_uri;
gpr_asprintf(&proxy_uri, "http://%s",
@@ -109,7 +107,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_load_reporting.c b/test/core/end2end/fixtures/h2_load_reporting.c
index 0957666a44..7a76489b44 100644
--- a/test/core/end2end/fixtures/h2_load_reporting.c
+++ b/test/core/end2end/fixtures/h2_load_reporting.c
@@ -73,9 +73,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_load_reporting(
}
void chttp2_init_client_load_reporting(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
load_reporting_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
GPR_ASSERT(f->client);
@@ -105,7 +103,9 @@ void chttp2_tear_down_load_reporting(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
{"chttp2/fullstack+load_reporting",
- FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_load_reporting, chttp2_init_client_load_reporting,
chttp2_init_server_load_reporting, chttp2_tear_down_load_reporting},
};
diff --git a/test/core/end2end/fixtures/h2_oauth2.c b/test/core/end2end/fixtures/h2_oauth2.c
index dd636cfff6..6122f4f2f9 100644
--- a/test/core/end2end/fixtures/h2_oauth2.c
+++ b/test/core/end2end/fixtures/h2_oauth2.c
@@ -150,9 +150,7 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
}
static void chttp2_init_client_simple_ssl_with_oauth2_secure_fullstack(
- grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
grpc_channel_credentials *ssl_creds =
grpc_ssl_credentials_create(test_root_cert, NULL, NULL);
grpc_call_credentials *oauth2_creds =
@@ -218,7 +216,9 @@ static void chttp2_init_server_simple_ssl_secure_fullstack(
static grpc_end2end_test_config configs[] = {
{"chttp2/simple_ssl_with_oauth2_fullstack",
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
- FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS,
+ FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_secure_fullstack,
chttp2_init_client_simple_ssl_with_oauth2_secure_fullstack,
chttp2_init_server_simple_ssl_secure_fullstack,
diff --git a/test/core/end2end/fixtures/h2_proxy.c b/test/core/end2end/fixtures/h2_proxy.c
index 2671e0abde..9e37ed4db3 100644
--- a/test/core/end2end/fixtures/h2_proxy.c
+++ b/test/core/end2end/fixtures/h2_proxy.c
@@ -85,9 +85,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(
grpc_end2end_proxy_get_client_target(ffd->proxy), client_args, NULL);
@@ -116,7 +114,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
{"chttp2/fullstack+proxy", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
- FEATURE_MASK_SUPPORTS_REQUEST_PROXYING,
+ FEATURE_MASK_SUPPORTS_REQUEST_PROXYING |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/h2_sockpair+trace.c b/test/core/end2end/fixtures/h2_sockpair+trace.c
index 15b045c33c..726ed8735c 100644
--- a/test/core/end2end/fixtures/h2_sockpair+trace.c
+++ b/test/core/end2end/fixtures/h2_sockpair+trace.c
@@ -96,15 +96,15 @@ static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
f.fixture_data = sfd;
f.cq = grpc_completion_queue_create(NULL);
- *sfd = grpc_iomgr_create_endpoint_pair("fixture", 65536);
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("fixture");
+ *sfd = grpc_iomgr_create_endpoint_pair("fixture", resource_quota, 65536);
+ grpc_resource_quota_unref(resource_quota);
return f;
}
static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_endpoint_pair *sfd = f->fixture_data;
grpc_transport *transport;
@@ -141,9 +141,9 @@ static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/socketpair", 0, chttp2_create_fixture_socketpair,
- chttp2_init_client_socketpair, chttp2_init_server_socketpair,
- chttp2_tear_down_socketpair},
+ {"chttp2/socketpair", FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+ chttp2_create_fixture_socketpair, chttp2_init_client_socketpair,
+ chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
};
int main(int argc, char **argv) {
diff --git a/test/core/end2end/fixtures/h2_sockpair.c b/test/core/end2end/fixtures/h2_sockpair.c
index 87091f77a3..94b2623b3e 100644
--- a/test/core/end2end/fixtures/h2_sockpair.c
+++ b/test/core/end2end/fixtures/h2_sockpair.c
@@ -90,15 +90,15 @@ static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
f.fixture_data = sfd;
f.cq = grpc_completion_queue_create(NULL);
- *sfd = grpc_iomgr_create_endpoint_pair("fixture", 65536);
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("fixture");
+ *sfd = grpc_iomgr_create_endpoint_pair("fixture", resource_quota, 65536);
+ grpc_resource_quota_unref(resource_quota);
return f;
}
static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_endpoint_pair *sfd = f->fixture_data;
grpc_transport *transport;
@@ -135,9 +135,9 @@ static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/socketpair", 0, chttp2_create_fixture_socketpair,
- chttp2_init_client_socketpair, chttp2_init_server_socketpair,
- chttp2_tear_down_socketpair},
+ {"chttp2/socketpair", FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+ chttp2_create_fixture_socketpair, chttp2_init_client_socketpair,
+ chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
};
int main(int argc, char **argv) {
diff --git a/test/core/end2end/fixtures/h2_sockpair_1byte.c b/test/core/end2end/fixtures/h2_sockpair_1byte.c
index 7d0a14cd63..11af7bee1e 100644
--- a/test/core/end2end/fixtures/h2_sockpair_1byte.c
+++ b/test/core/end2end/fixtures/h2_sockpair_1byte.c
@@ -90,15 +90,15 @@ static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
f.fixture_data = sfd;
f.cq = grpc_completion_queue_create(NULL);
- *sfd = grpc_iomgr_create_endpoint_pair("fixture", 1);
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("fixture");
+ *sfd = grpc_iomgr_create_endpoint_pair("fixture", resource_quota, 1);
+ grpc_resource_quota_unref(resource_quota);
return f;
}
static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_endpoint_pair *sfd = f->fixture_data;
grpc_transport *transport;
@@ -135,14 +135,17 @@ static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/socketpair_one_byte_at_a_time", 0,
- chttp2_create_fixture_socketpair, chttp2_init_client_socketpair,
- chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
+ {"chttp2/socketpair_one_byte_at_a_time",
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER, chttp2_create_fixture_socketpair,
+ chttp2_init_client_socketpair, chttp2_init_server_socketpair,
+ chttp2_tear_down_socketpair},
};
int main(int argc, char **argv) {
size_t i;
+ g_fixture_slowdown_factor = 2.0;
+
grpc_test_init(argc, argv);
grpc_end2end_tests_pre_init();
grpc_init();
diff --git a/test/core/end2end/fixtures/h2_ssl.c b/test/core/end2end/fixtures/h2_ssl.c
index 63282ae081..bbd522cf30 100644
--- a/test/core/end2end/fixtures/h2_ssl.c
+++ b/test/core/end2end/fixtures/h2_ssl.c
@@ -109,9 +109,7 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
}
static void chttp2_init_client_simple_ssl_secure_fullstack(
- grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
grpc_channel_credentials *ssl_creds =
grpc_ssl_credentials_create(NULL, NULL, NULL);
grpc_arg ssl_name_override = {GRPC_ARG_STRING,
@@ -153,7 +151,9 @@ static void chttp2_init_server_simple_ssl_secure_fullstack(
static grpc_end2end_test_config configs[] = {
{"chttp2/simple_ssl_fullstack",
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
- FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS,
+ FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_secure_fullstack,
chttp2_init_client_simple_ssl_secure_fullstack,
chttp2_init_server_simple_ssl_secure_fullstack,
diff --git a/test/core/end2end/fixtures/h2_ssl_cert.c b/test/core/end2end/fixtures/h2_ssl_cert.c
index 4c2f5f535e..e39cb491de 100644
--- a/test/core/end2end/fixtures/h2_ssl_cert.c
+++ b/test/core/end2end/fixtures/h2_ssl_cert.c
@@ -154,41 +154,39 @@ SERVER_INIT(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY)
typedef enum { NONE, SELF_SIGNED, SIGNED, BAD_CERT_PAIR } certtype;
-#define CLIENT_INIT(cert_type) \
- static void CLIENT_INIT_NAME(cert_type)(grpc_end2end_test_fixture * f, \
- grpc_channel_args * client_args, \
- const char *query_args) { \
- GPR_ASSERT(query_args == NULL); \
- grpc_channel_credentials *ssl_creds = NULL; \
- grpc_ssl_pem_key_cert_pair self_signed_client_key_cert_pair = { \
- test_self_signed_client_key, test_self_signed_client_cert}; \
- grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = { \
- test_signed_client_key, test_signed_client_cert}; \
- grpc_ssl_pem_key_cert_pair bad_client_key_cert_pair = { \
- test_self_signed_client_key, test_signed_client_cert}; \
- grpc_ssl_pem_key_cert_pair *key_cert_pair = NULL; \
- switch (cert_type) { \
- case SELF_SIGNED: \
- key_cert_pair = &self_signed_client_key_cert_pair; \
- break; \
- case SIGNED: \
- key_cert_pair = &signed_client_key_cert_pair; \
- break; \
- case BAD_CERT_PAIR: \
- key_cert_pair = &bad_client_key_cert_pair; \
- break; \
- default: \
- break; \
- } \
- ssl_creds = \
- grpc_ssl_credentials_create(test_root_cert, key_cert_pair, NULL); \
- grpc_arg ssl_name_override = {GRPC_ARG_STRING, \
- GRPC_SSL_TARGET_NAME_OVERRIDE_ARG, \
- {"foo.test.google.fr"}}; \
- grpc_channel_args *new_client_args = \
- grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1); \
- chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds); \
- grpc_channel_args_destroy(new_client_args); \
+#define CLIENT_INIT(cert_type) \
+ static void CLIENT_INIT_NAME(cert_type)(grpc_end2end_test_fixture * f, \
+ grpc_channel_args * client_args) { \
+ grpc_channel_credentials *ssl_creds = NULL; \
+ grpc_ssl_pem_key_cert_pair self_signed_client_key_cert_pair = { \
+ test_self_signed_client_key, test_self_signed_client_cert}; \
+ grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = { \
+ test_signed_client_key, test_signed_client_cert}; \
+ grpc_ssl_pem_key_cert_pair bad_client_key_cert_pair = { \
+ test_self_signed_client_key, test_signed_client_cert}; \
+ grpc_ssl_pem_key_cert_pair *key_cert_pair = NULL; \
+ switch (cert_type) { \
+ case SELF_SIGNED: \
+ key_cert_pair = &self_signed_client_key_cert_pair; \
+ break; \
+ case SIGNED: \
+ key_cert_pair = &signed_client_key_cert_pair; \
+ break; \
+ case BAD_CERT_PAIR: \
+ key_cert_pair = &bad_client_key_cert_pair; \
+ break; \
+ default: \
+ break; \
+ } \
+ ssl_creds = \
+ grpc_ssl_credentials_create(test_root_cert, key_cert_pair, NULL); \
+ grpc_arg ssl_name_override = {GRPC_ARG_STRING, \
+ GRPC_SSL_TARGET_NAME_OVERRIDE_ARG, \
+ {"foo.test.google.fr"}}; \
+ grpc_channel_args *new_client_args = \
+ grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1); \
+ chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds); \
+ grpc_channel_args_destroy(new_client_args); \
}
CLIENT_INIT(NONE)
@@ -205,7 +203,8 @@ typedef enum { SUCCESS, FAIL } test_result;
{ \
{TEST_NAME(request_type, cert_type, result), \
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION | \
- FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS, \
+ FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS | \
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL, \
chttp2_create_fixture_secure_fullstack, CLIENT_INIT_NAME(cert_type), \
SERVER_INIT_NAME(request_type), chttp2_tear_down_secure_fullstack}, \
result \
@@ -267,7 +266,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
diff --git a/test/core/end2end/fixtures/h2_ssl_proxy.c b/test/core/end2end/fixtures/h2_ssl_proxy.c
index 7d39fb2055..27cf3ebf32 100644
--- a/test/core/end2end/fixtures/h2_ssl_proxy.c
+++ b/test/core/end2end/fixtures/h2_ssl_proxy.c
@@ -142,9 +142,7 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
}
static void chttp2_init_client_simple_ssl_secure_fullstack(
- grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
grpc_channel_credentials *ssl_creds =
grpc_ssl_credentials_create(NULL, NULL, NULL);
grpc_arg ssl_name_override = {GRPC_ARG_STRING,
@@ -187,7 +185,9 @@ static grpc_end2end_test_config configs[] = {
{"chttp2/simple_ssl_fullstack",
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
FEATURE_MASK_SUPPORTS_REQUEST_PROXYING |
- FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS,
+ FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_secure_fullstack,
chttp2_init_client_simple_ssl_secure_fullstack,
chttp2_init_server_simple_ssl_secure_fullstack,
diff --git a/test/core/end2end/fixtures/h2_uds.c b/test/core/end2end/fixtures/h2_uds.c
index 888d6c0a10..bc973ea8e3 100644
--- a/test/core/end2end/fixtures/h2_uds.c
+++ b/test/core/end2end/fixtures/h2_uds.c
@@ -76,9 +76,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
}
void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
- grpc_channel_args *client_args,
- const char *query_args) {
- GPR_ASSERT(query_args == NULL);
+ grpc_channel_args *client_args) {
fullstack_fixture_data *ffd = f->fixture_data;
f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
}
@@ -103,7 +101,9 @@ void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
/* All test configurations */
static grpc_end2end_test_config configs[] = {
- {"chttp2/fullstack_uds", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+ {"chttp2/fullstack_uds", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+ FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+ FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
};
diff --git a/test/core/end2end/fixtures/http_proxy.c b/test/core/end2end/fixtures/http_proxy.c
index b8f046c7df..80865fc7a6 100644
--- a/test/core/end2end/fixtures/http_proxy.c
+++ b/test/core/end2end/fixtures/http_proxy.c
@@ -37,11 +37,11 @@
#include <string.h>
+#include <grpc/slice_buffer.h>
#include <grpc/support/alloc.h>
#include <grpc/support/atm.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice_buffer.h>
#include <grpc/support/string_util.h>
#include <grpc/support/sync.h>
#include <grpc/support/thd.h>
@@ -91,12 +91,12 @@ typedef struct proxy_connection {
grpc_closure on_server_read_done;
grpc_closure on_server_write_done;
- gpr_slice_buffer client_read_buffer;
- gpr_slice_buffer client_deferred_write_buffer;
- gpr_slice_buffer client_write_buffer;
- gpr_slice_buffer server_read_buffer;
- gpr_slice_buffer server_deferred_write_buffer;
- gpr_slice_buffer server_write_buffer;
+ grpc_slice_buffer client_read_buffer;
+ grpc_slice_buffer client_deferred_write_buffer;
+ grpc_slice_buffer client_write_buffer;
+ grpc_slice_buffer server_read_buffer;
+ grpc_slice_buffer server_deferred_write_buffer;
+ grpc_slice_buffer server_write_buffer;
grpc_http_parser http_parser;
grpc_http_request http_request;
@@ -110,12 +110,12 @@ static void proxy_connection_unref(grpc_exec_ctx* exec_ctx,
if (conn->server_endpoint != NULL)
grpc_endpoint_destroy(exec_ctx, conn->server_endpoint);
grpc_pollset_set_destroy(conn->pollset_set);
- gpr_slice_buffer_destroy(&conn->client_read_buffer);
- gpr_slice_buffer_destroy(&conn->client_deferred_write_buffer);
- gpr_slice_buffer_destroy(&conn->client_write_buffer);
- gpr_slice_buffer_destroy(&conn->server_read_buffer);
- gpr_slice_buffer_destroy(&conn->server_deferred_write_buffer);
- gpr_slice_buffer_destroy(&conn->server_write_buffer);
+ grpc_slice_buffer_destroy(&conn->client_read_buffer);
+ grpc_slice_buffer_destroy(&conn->client_deferred_write_buffer);
+ grpc_slice_buffer_destroy(&conn->client_write_buffer);
+ grpc_slice_buffer_destroy(&conn->server_read_buffer);
+ grpc_slice_buffer_destroy(&conn->server_deferred_write_buffer);
+ grpc_slice_buffer_destroy(&conn->server_write_buffer);
grpc_http_parser_destroy(&conn->http_parser);
grpc_http_request_destroy(&conn->http_request);
gpr_free(conn);
@@ -146,12 +146,12 @@ static void on_client_write_done(grpc_exec_ctx* exec_ctx, void* arg,
return;
}
// Clear write buffer (the data we just wrote).
- gpr_slice_buffer_reset_and_unref(&conn->client_write_buffer);
+ grpc_slice_buffer_reset_and_unref(&conn->client_write_buffer);
// If more data was read from the server since we started this write,
// write that data now.
if (conn->client_deferred_write_buffer.length > 0) {
- gpr_slice_buffer_move_into(&conn->client_deferred_write_buffer,
- &conn->client_write_buffer);
+ grpc_slice_buffer_move_into(&conn->client_deferred_write_buffer,
+ &conn->client_write_buffer);
grpc_endpoint_write(exec_ctx, conn->client_endpoint,
&conn->client_write_buffer,
&conn->on_client_write_done);
@@ -171,12 +171,12 @@ static void on_server_write_done(grpc_exec_ctx* exec_ctx, void* arg,
return;
}
// Clear write buffer (the data we just wrote).
- gpr_slice_buffer_reset_and_unref(&conn->server_write_buffer);
+ grpc_slice_buffer_reset_and_unref(&conn->server_write_buffer);
// If more data was read from the client since we started this write,
// write that data now.
if (conn->server_deferred_write_buffer.length > 0) {
- gpr_slice_buffer_move_into(&conn->server_deferred_write_buffer,
- &conn->server_write_buffer);
+ grpc_slice_buffer_move_into(&conn->server_deferred_write_buffer,
+ &conn->server_write_buffer);
grpc_endpoint_write(exec_ctx, conn->server_endpoint,
&conn->server_write_buffer,
&conn->on_server_write_done);
@@ -203,11 +203,11 @@ static void on_client_read_done(grpc_exec_ctx* exec_ctx, void* arg,
//
// Otherwise, move the read data into the write buffer and write it.
if (conn->server_write_buffer.length > 0) {
- gpr_slice_buffer_move_into(&conn->client_read_buffer,
- &conn->server_deferred_write_buffer);
+ grpc_slice_buffer_move_into(&conn->client_read_buffer,
+ &conn->server_deferred_write_buffer);
} else {
- gpr_slice_buffer_move_into(&conn->client_read_buffer,
- &conn->server_write_buffer);
+ grpc_slice_buffer_move_into(&conn->client_read_buffer,
+ &conn->server_write_buffer);
gpr_ref(&conn->refcount);
grpc_endpoint_write(exec_ctx, conn->server_endpoint,
&conn->server_write_buffer,
@@ -235,11 +235,11 @@ static void on_server_read_done(grpc_exec_ctx* exec_ctx, void* arg,
//
// Otherwise, move the read data into the write buffer and write it.
if (conn->client_write_buffer.length > 0) {
- gpr_slice_buffer_move_into(&conn->server_read_buffer,
- &conn->client_deferred_write_buffer);
+ grpc_slice_buffer_move_into(&conn->server_read_buffer,
+ &conn->client_deferred_write_buffer);
} else {
- gpr_slice_buffer_move_into(&conn->server_read_buffer,
- &conn->client_write_buffer);
+ grpc_slice_buffer_move_into(&conn->server_read_buffer,
+ &conn->client_write_buffer);
gpr_ref(&conn->refcount);
grpc_endpoint_write(exec_ctx, conn->client_endpoint,
&conn->client_write_buffer,
@@ -260,7 +260,7 @@ static void on_write_response_done(grpc_exec_ctx* exec_ctx, void* arg,
return;
}
// Clear write buffer.
- gpr_slice_buffer_reset_and_unref(&conn->client_write_buffer);
+ grpc_slice_buffer_reset_and_unref(&conn->client_write_buffer);
// Start reading from both client and server. One of the read
// requests inherits our ref to conn, but we need to take a new ref
// for the other one.
@@ -289,9 +289,9 @@ static void on_server_connect_done(grpc_exec_ctx* exec_ctx, void* arg,
// We've established a connection, so send back a 200 response code to
// the client.
// The write callback inherits our reference to conn.
- gpr_slice slice =
- gpr_slice_from_copied_string("HTTP/1.0 200 connected\r\n\r\n");
- gpr_slice_buffer_add(&conn->client_write_buffer, slice);
+ grpc_slice slice =
+ grpc_slice_from_copied_string("HTTP/1.0 200 connected\r\n\r\n");
+ grpc_slice_buffer_add(&conn->client_write_buffer, slice);
grpc_endpoint_write(exec_ctx, conn->client_endpoint,
&conn->client_write_buffer,
&conn->on_write_response_done);
@@ -313,7 +313,7 @@ static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg,
}
// Read request and feed it to the parser.
for (size_t i = 0; i < conn->client_read_buffer.count; ++i) {
- if (GPR_SLICE_LENGTH(conn->client_read_buffer.slices[i]) > 0) {
+ if (GRPC_SLICE_LENGTH(conn->client_read_buffer.slices[i]) > 0) {
error = grpc_http_parser_parse(&conn->http_parser,
conn->client_read_buffer.slices[i], NULL);
if (error != GRPC_ERROR_NONE) {
@@ -324,7 +324,7 @@ static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg,
}
}
}
- gpr_slice_buffer_reset_and_unref(&conn->client_read_buffer);
+ grpc_slice_buffer_reset_and_unref(&conn->client_read_buffer);
// If we're not done reading the request, read more data.
if (conn->http_parser.state != GRPC_HTTP_BODY) {
grpc_endpoint_read(exec_ctx, conn->client_endpoint,
@@ -359,7 +359,7 @@ static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg,
const gpr_timespec deadline = gpr_time_add(
gpr_now(GPR_CLOCK_MONOTONIC), gpr_time_from_seconds(10, GPR_TIMESPAN));
grpc_tcp_client_connect(exec_ctx, &conn->on_server_connect_done,
- &conn->server_endpoint, conn->pollset_set,
+ &conn->server_endpoint, conn->pollset_set, NULL,
&resolved_addresses->addrs[0], deadline);
grpc_resolved_addresses_destroy(resolved_addresses);
}
@@ -367,6 +367,7 @@ static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg,
static void on_accept(grpc_exec_ctx* exec_ctx, void* arg,
grpc_endpoint* endpoint, grpc_pollset* accepting_pollset,
grpc_tcp_server_acceptor* acceptor) {
+ gpr_free(acceptor);
grpc_end2end_http_proxy* proxy = arg;
// Instantiate proxy_connection.
proxy_connection* conn = gpr_malloc(sizeof(*conn));
@@ -384,12 +385,12 @@ static void on_accept(grpc_exec_ctx* exec_ctx, void* arg,
grpc_closure_init(&conn->on_client_write_done, on_client_write_done, conn);
grpc_closure_init(&conn->on_server_read_done, on_server_read_done, conn);
grpc_closure_init(&conn->on_server_write_done, on_server_write_done, conn);
- gpr_slice_buffer_init(&conn->client_read_buffer);
- gpr_slice_buffer_init(&conn->client_deferred_write_buffer);
- gpr_slice_buffer_init(&conn->client_write_buffer);
- gpr_slice_buffer_init(&conn->server_read_buffer);
- gpr_slice_buffer_init(&conn->server_deferred_write_buffer);
- gpr_slice_buffer_init(&conn->server_write_buffer);
+ grpc_slice_buffer_init(&conn->client_read_buffer);
+ grpc_slice_buffer_init(&conn->client_deferred_write_buffer);
+ grpc_slice_buffer_init(&conn->client_write_buffer);
+ grpc_slice_buffer_init(&conn->server_read_buffer);
+ grpc_slice_buffer_init(&conn->server_deferred_write_buffer);
+ grpc_slice_buffer_init(&conn->server_write_buffer);
grpc_http_parser_init(&conn->http_parser, GRPC_HTTP_REQUEST,
&conn->http_request);
grpc_endpoint_read(exec_ctx, conn->client_endpoint, &conn->client_read_buffer,
@@ -418,7 +419,8 @@ static void thread_main(void* arg) {
grpc_exec_ctx_finish(&exec_ctx);
}
-grpc_end2end_http_proxy* grpc_end2end_http_proxy_create() {
+grpc_end2end_http_proxy* grpc_end2end_http_proxy_create(void) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_end2end_http_proxy* proxy = gpr_malloc(sizeof(*proxy));
memset(proxy, 0, sizeof(*proxy));
// Construct proxy address.
@@ -427,8 +429,8 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create() {
gpr_log(GPR_INFO, "Proxy address: %s", proxy->proxy_name);
// Create TCP server.
proxy->channel_args = grpc_channel_args_copy(NULL);
- grpc_error* error =
- grpc_tcp_server_create(NULL, proxy->channel_args, &proxy->server);
+ grpc_error* error = grpc_tcp_server_create(
+ &exec_ctx, NULL, proxy->channel_args, &proxy->server);
GPR_ASSERT(error == GRPC_ERROR_NONE);
// Bind to port.
grpc_resolved_address resolved_addr;
@@ -443,7 +445,6 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create() {
// Start server.
proxy->pollset = gpr_malloc(grpc_pollset_size());
grpc_pollset_init(proxy->pollset, &proxy->mu);
- grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_tcp_server_start(&exec_ctx, proxy->server, &proxy->pollset, 1, on_accept,
proxy);
grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c
index 4e19b76014..746134c85b 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.c
+++ b/test/core/end2end/fuzzers/api_fuzzer.c
@@ -34,6 +34,7 @@
#include <string.h>
#include <grpc/grpc.h>
+#include <grpc/grpc_security.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
@@ -45,6 +46,7 @@
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/surface/server.h"
#include "src/core/lib/transport/metadata.h"
+#include "test/core/end2end/data/ssl_test_data.h"
#include "test/core/util/passthru_endpoint.h"
////////////////////////////////////////////////////////////////////////////////
@@ -56,6 +58,21 @@ bool leak_check = true;
static void dont_log(gpr_log_func_args *args) {}
////////////////////////////////////////////////////////////////////////////////
+// global state
+
+static gpr_timespec g_now;
+static grpc_server *g_server;
+static grpc_channel *g_channel;
+static grpc_resource_quota *g_resource_quota;
+
+extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
+
+static gpr_timespec now_impl(gpr_clock_type clock_type) {
+ GPR_ASSERT(clock_type != GPR_TIMESPAN);
+ return g_now;
+}
+
+////////////////////////////////////////////////////////////////////////////////
// input_stream: allows easy access to input bytes, and allows reading a little
// past the end (avoiding needing to check everywhere)
@@ -137,10 +154,10 @@ static uint32_t read_uint32(input_stream *inp) {
}
static grpc_byte_buffer *read_message(input_stream *inp) {
- gpr_slice slice = gpr_slice_malloc(read_uint22(inp));
- memset(GPR_SLICE_START_PTR(slice), 0, GPR_SLICE_LENGTH(slice));
+ grpc_slice slice = grpc_slice_malloc(read_uint22(inp));
+ memset(GRPC_SLICE_START_PTR(slice), 0, GRPC_SLICE_LENGTH(slice));
grpc_byte_buffer *out = grpc_raw_byte_buffer_create(&slice, 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
return out;
}
@@ -150,13 +167,28 @@ static grpc_channel_args *read_args(input_stream *inp) {
size_t n = next_byte(inp);
grpc_arg *args = gpr_malloc(sizeof(*args) * n);
for (size_t i = 0; i < n; i++) {
- bool is_string = next_byte(inp) & 1;
- args[i].type = is_string ? GRPC_ARG_STRING : GRPC_ARG_INTEGER;
- args[i].key = read_string(inp);
- if (is_string) {
- args[i].value.string = read_string(inp);
- } else {
- args[i].value.integer = read_int(inp);
+ switch (next_byte(inp)) {
+ case 1:
+ args[i].type = GRPC_ARG_STRING;
+ args[i].key = read_string(inp);
+ args[i].value.string = read_string(inp);
+ break;
+ case 2:
+ args[i].type = GRPC_ARG_INTEGER;
+ args[i].key = read_string(inp);
+ args[i].value.integer = read_int(inp);
+ break;
+ case 3:
+ args[i].type = GRPC_ARG_POINTER;
+ args[i].key = gpr_strdup(GRPC_ARG_RESOURCE_QUOTA);
+ args[i].value.pointer.vtable = grpc_resource_quota_arg_vtable();
+ args[i].value.pointer.p = g_resource_quota;
+ grpc_resource_quota_ref(g_resource_quota);
+ break;
+ default:
+ end(inp);
+ n = i;
+ break;
}
}
grpc_channel_args *a = gpr_malloc(sizeof(*a));
@@ -165,22 +197,138 @@ static grpc_channel_args *read_args(input_stream *inp) {
return a;
}
-static bool is_eof(input_stream *inp) { return inp->cur == inp->end; }
+typedef struct cred_artifact_ctx {
+ int num_release;
+ char *release[3];
+} cred_artifact_ctx;
+#define CRED_ARTIFACT_CTX_INIT \
+ { \
+ 0, { 0 } \
+ }
-////////////////////////////////////////////////////////////////////////////////
-// global state
+static void cred_artifact_ctx_finish(cred_artifact_ctx *ctx) {
+ for (int i = 0; i < ctx->num_release; i++) {
+ gpr_free(ctx->release[i]);
+ }
+}
-static gpr_timespec g_now;
-static grpc_server *g_server;
-static grpc_channel *g_channel;
+static const char *read_cred_artifact(cred_artifact_ctx *ctx, input_stream *inp,
+ const char **builtins,
+ size_t num_builtins) {
+ uint8_t b = next_byte(inp);
+ if (b == 0) return NULL;
+ if (b == 1) return ctx->release[ctx->num_release++] = read_string(inp);
+ if (b >= num_builtins + 1) {
+ end(inp);
+ return NULL;
+ }
+ return builtins[b - 1];
+}
-extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
+static grpc_channel_credentials *read_ssl_channel_creds(input_stream *inp) {
+ cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
+ static const char *builtin_root_certs[] = {test_root_cert};
+ static const char *builtin_private_keys[] = {
+ test_server1_key, test_self_signed_client_key, test_signed_client_key};
+ static const char *builtin_cert_chains[] = {
+ test_server1_cert, test_self_signed_client_cert, test_signed_client_cert};
+ const char *root_certs = read_cred_artifact(
+ &ctx, inp, builtin_root_certs, GPR_ARRAY_SIZE(builtin_root_certs));
+ const char *private_key = read_cred_artifact(
+ &ctx, inp, builtin_private_keys, GPR_ARRAY_SIZE(builtin_private_keys));
+ const char *certs = read_cred_artifact(&ctx, inp, builtin_cert_chains,
+ GPR_ARRAY_SIZE(builtin_cert_chains));
+ grpc_ssl_pem_key_cert_pair key_cert_pair = {private_key, certs};
+ grpc_channel_credentials *creds = grpc_ssl_credentials_create(
+ root_certs, private_key != NULL && certs != NULL ? &key_cert_pair : NULL,
+ NULL);
+ cred_artifact_ctx_finish(&ctx);
+ return creds;
+}
-static gpr_timespec now_impl(gpr_clock_type clock_type) {
- GPR_ASSERT(clock_type != GPR_TIMESPAN);
- return g_now;
+static grpc_call_credentials *read_call_creds(input_stream *inp) {
+ switch (next_byte(inp)) {
+ default:
+ end(inp);
+ return NULL;
+ case 0:
+ return NULL;
+ case 1: {
+ grpc_call_credentials *c1 = read_call_creds(inp);
+ grpc_call_credentials *c2 = read_call_creds(inp);
+ if (c1 != NULL && c2 != NULL) {
+ grpc_call_credentials *out =
+ grpc_composite_call_credentials_create(c1, c2, NULL);
+ grpc_call_credentials_release(c1);
+ grpc_call_credentials_release(c2);
+ return out;
+ } else if (c1 != NULL) {
+ return c1;
+ } else if (c2 != NULL) {
+ return c2;
+ } else {
+ return NULL;
+ }
+ GPR_UNREACHABLE_CODE(return NULL);
+ }
+ case 2: {
+ cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
+ const char *access_token = read_cred_artifact(&ctx, inp, NULL, 0);
+ grpc_call_credentials *out =
+ access_token == NULL ? NULL : grpc_access_token_credentials_create(
+ access_token, NULL);
+ cred_artifact_ctx_finish(&ctx);
+ return out;
+ }
+ case 3: {
+ cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
+ const char *auth_token = read_cred_artifact(&ctx, inp, NULL, 0);
+ const char *auth_selector = read_cred_artifact(&ctx, inp, NULL, 0);
+ grpc_call_credentials *out = auth_token == NULL || auth_selector == NULL
+ ? NULL
+ : grpc_google_iam_credentials_create(
+ auth_token, auth_selector, NULL);
+ cred_artifact_ctx_finish(&ctx);
+ return out;
+ }
+ /* TODO(ctiller): more cred types here */
+ }
}
+static grpc_channel_credentials *read_channel_creds(input_stream *inp) {
+ switch (next_byte(inp)) {
+ case 0:
+ return read_ssl_channel_creds(inp);
+ break;
+ case 1: {
+ grpc_channel_credentials *c1 = read_channel_creds(inp);
+ grpc_call_credentials *c2 = read_call_creds(inp);
+ if (c1 != NULL && c2 != NULL) {
+ grpc_channel_credentials *out =
+ grpc_composite_channel_credentials_create(c1, c2, NULL);
+ grpc_channel_credentials_release(c1);
+ grpc_call_credentials_release(c2);
+ return out;
+ } else if (c1) {
+ return c1;
+ } else if (c2) {
+ grpc_call_credentials_release(c2);
+ return NULL;
+ } else {
+ return NULL;
+ }
+ GPR_UNREACHABLE_CODE(return NULL);
+ }
+ case 2:
+ return NULL;
+ default:
+ end(inp);
+ return NULL;
+ }
+}
+
+static bool is_eof(input_stream *inp) { return inp->cur == inp->end; }
+
////////////////////////////////////////////////////////////////////////////////
// dns resolution
@@ -213,7 +361,9 @@ static void finish_resolve(grpc_exec_ctx *exec_ctx, void *arg,
}
void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
- const char *default_port, grpc_closure *on_done,
+ const char *default_port,
+ grpc_pollset_set *interested_parties,
+ grpc_closure *on_done,
grpc_resolved_addresses **addresses) {
addr_req *r = gpr_malloc(sizeof(*r));
r->addr = gpr_strdup(addr);
@@ -231,8 +381,8 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
// defined in tcp_client_posix.c
extern void (*grpc_tcp_client_connect_impl)(
grpc_exec_ctx *exec_ctx, grpc_closure *closure, grpc_endpoint **ep,
- grpc_pollset_set *interested_parties, const grpc_resolved_address *addr,
- gpr_timespec deadline);
+ grpc_pollset_set *interested_parties, const grpc_channel_args *channel_args,
+ const grpc_resolved_address *addr, gpr_timespec deadline);
static void sched_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
grpc_endpoint **ep, gpr_timespec deadline);
@@ -252,7 +402,7 @@ static void do_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
} else if (g_server != NULL) {
grpc_endpoint *client;
grpc_endpoint *server;
- grpc_passthru_endpoint_create(&client, &server);
+ grpc_passthru_endpoint_create(&client, &server, g_resource_quota);
*fc->ep = client;
grpc_transport *transport =
@@ -289,6 +439,7 @@ static void sched_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
static void my_tcp_client_connect(grpc_exec_ctx *exec_ctx,
grpc_closure *closure, grpc_endpoint **ep,
grpc_pollset_set *interested_parties,
+ const grpc_channel_args *channel_args,
const grpc_resolved_address *addr,
gpr_timespec deadline) {
sched_connect(exec_ctx, closure, ep, deadline);
@@ -520,6 +671,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
int pending_pings = 0;
g_active_call = new_call(NULL, ROOT);
+ g_resource_quota = grpc_resource_quota_create("api_fuzzer");
grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
@@ -939,6 +1091,30 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
}
break;
}
+ // resize the buffer pool
+ case 21: {
+ grpc_resource_quota_resize(g_resource_quota, read_uint22(&inp));
+ break;
+ }
+ // create a secure channel
+ case 22: {
+ if (g_channel == NULL) {
+ char *target = read_string(&inp);
+ char *target_uri;
+ gpr_asprintf(&target_uri, "dns:%s", target);
+ grpc_channel_args *args = read_args(&inp);
+ grpc_channel_credentials *creds = read_channel_creds(&inp);
+ g_channel = grpc_secure_channel_create(creds, target_uri, args, NULL);
+ GPR_ASSERT(g_channel != NULL);
+ grpc_channel_args_destroy(args);
+ gpr_free(target_uri);
+ gpr_free(target);
+ grpc_channel_credentials_release(creds);
+ } else {
+ end(&inp);
+ }
+ break;
+ }
}
}
@@ -954,6 +1130,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
.type == GRPC_QUEUE_SHUTDOWN);
grpc_completion_queue_destroy(cq);
+ grpc_resource_quota_unref(g_resource_quota);
+
grpc_shutdown();
return 0;
}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0077816beb340a2ef87cc57c18e0ce0d1e6e23fc b/test/core/end2end/fuzzers/api_fuzzer_corpus/0077816beb340a2ef87cc57c18e0ce0d1e6e23fc
new file mode 100644
index 0000000000..459e3e556a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0077816beb340a2ef87cc57c18e0ce0d1e6e23fc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/00a1b8e686014202baacdc052a38d392dff11432 b/test/core/end2end/fuzzers/api_fuzzer_corpus/00a1b8e686014202baacdc052a38d392dff11432
new file mode 100644
index 0000000000..a79fedb8b0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/00a1b8e686014202baacdc052a38d392dff11432
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/00c7c2cc7f90842e766645310e4a439e7b188473 b/test/core/end2end/fuzzers/api_fuzzer_corpus/00c7c2cc7f90842e766645310e4a439e7b188473
new file mode 100644
index 0000000000..1ec88e8457
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/00c7c2cc7f90842e766645310e4a439e7b188473
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/00f89898cb8f3e3c20e7be1d8c7a1544fb81ea5e b/test/core/end2end/fuzzers/api_fuzzer_corpus/00f89898cb8f3e3c20e7be1d8c7a1544fb81ea5e
new file mode 100644
index 0000000000..2f66b146b1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/00f89898cb8f3e3c20e7be1d8c7a1544fb81ea5e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0173fb5c52d97d0d63266a529bf2f6442894b0c6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0173fb5c52d97d0d63266a529bf2f6442894b0c6
new file mode 100644
index 0000000000..85ea412e17
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0173fb5c52d97d0d63266a529bf2f6442894b0c6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/020d06c319b6e511021d21316ba283bca9b40dc9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/020d06c319b6e511021d21316ba283bca9b40dc9
new file mode 100644
index 0000000000..054c3f6d93
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/020d06c319b6e511021d21316ba283bca9b40dc9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0598f8881c26b7e9562cdc4c3f86749dd49598d6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0598f8881c26b7e9562cdc4c3f86749dd49598d6
new file mode 100644
index 0000000000..46cc318eac
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0598f8881c26b7e9562cdc4c3f86749dd49598d6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/071b85ef412067e7db9188bee7c92e4fd661e021 b/test/core/end2end/fuzzers/api_fuzzer_corpus/071b85ef412067e7db9188bee7c92e4fd661e021
new file mode 100644
index 0000000000..d8babf89cf
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/071b85ef412067e7db9188bee7c92e4fd661e021
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0768af66da5e344f21337df8eb0a1c8c955f4244 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0768af66da5e344f21337df8eb0a1c8c955f4244
new file mode 100644
index 0000000000..e3b91f819e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0768af66da5e344f21337df8eb0a1c8c955f4244
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/077202f145bfc7dff77e820cbe6ac6e4ae76e1ed b/test/core/end2end/fuzzers/api_fuzzer_corpus/077202f145bfc7dff77e820cbe6ac6e4ae76e1ed
new file mode 100644
index 0000000000..0b69ec0c6e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/077202f145bfc7dff77e820cbe6ac6e4ae76e1ed
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/07e7bbb0005535e901b7f50e13cba9d5da51c2a5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/07e7bbb0005535e901b7f50e13cba9d5da51c2a5
new file mode 100644
index 0000000000..5eb9e3b345
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/07e7bbb0005535e901b7f50e13cba9d5da51c2a5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/08a6761ed9d5298fc0d0fe9e75196f7527e488d4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/08a6761ed9d5298fc0d0fe9e75196f7527e488d4
new file mode 100644
index 0000000000..603d46ceab
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/08a6761ed9d5298fc0d0fe9e75196f7527e488d4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/092575ab527ffb459d2e1eed593902820bb462c0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/092575ab527ffb459d2e1eed593902820bb462c0
new file mode 100644
index 0000000000..678461bf79
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/092575ab527ffb459d2e1eed593902820bb462c0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/09985e738bf04fb7827367f2ae70f4697ff5aaf0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/09985e738bf04fb7827367f2ae70f4697ff5aaf0
new file mode 100644
index 0000000000..9876478457
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/09985e738bf04fb7827367f2ae70f4697ff5aaf0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/099d967555bfc237238c93f9d884c004c773b33b b/test/core/end2end/fuzzers/api_fuzzer_corpus/099d967555bfc237238c93f9d884c004c773b33b
new file mode 100644
index 0000000000..65f7c285d9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/099d967555bfc237238c93f9d884c004c773b33b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0b08fc5a8eb4a23766be7b3082308959955d4b13 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0b08fc5a8eb4a23766be7b3082308959955d4b13
new file mode 100644
index 0000000000..a5c3ede04f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0b08fc5a8eb4a23766be7b3082308959955d4b13
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0c088a8261de0bf3b996cc1e7889399acb03fd5a b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c088a8261de0bf3b996cc1e7889399acb03fd5a
new file mode 100644
index 0000000000..a56cf54ae1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c088a8261de0bf3b996cc1e7889399acb03fd5a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0c10483d4f5018b899483bcf23094f9119919ca4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c10483d4f5018b899483bcf23094f9119919ca4
new file mode 100644
index 0000000000..b17699c133
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c10483d4f5018b899483bcf23094f9119919ca4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0c653a4b68bd77eec050b66ff2d8eae13001c505 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c653a4b68bd77eec050b66ff2d8eae13001c505
new file mode 100644
index 0000000000..a296741e05
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0c653a4b68bd77eec050b66ff2d8eae13001c505
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0df8bd9c41fb5d8ce8a0f2f28ca16be96bd9997e b/test/core/end2end/fuzzers/api_fuzzer_corpus/0df8bd9c41fb5d8ce8a0f2f28ca16be96bd9997e
new file mode 100644
index 0000000000..b8feab0be7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0df8bd9c41fb5d8ce8a0f2f28ca16be96bd9997e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0e0ecc8214b5083b75216857b967621c0648afc9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0e0ecc8214b5083b75216857b967621c0648afc9
new file mode 100644
index 0000000000..396c6dbae5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0e0ecc8214b5083b75216857b967621c0648afc9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0e5aa755fff40b487617e01f6812d85ad310b727 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0e5aa755fff40b487617e01f6812d85ad310b727
new file mode 100644
index 0000000000..7ea4d192b8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0e5aa755fff40b487617e01f6812d85ad310b727
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/0f10d36e818e41f1737245c2bb8cb83a69421cb1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/0f10d36e818e41f1737245c2bb8cb83a69421cb1
new file mode 100644
index 0000000000..05c3d023a1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/0f10d36e818e41f1737245c2bb8cb83a69421cb1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/10ee46dc1973472ead36ec4b8a1ea90200637c73 b/test/core/end2end/fuzzers/api_fuzzer_corpus/10ee46dc1973472ead36ec4b8a1ea90200637c73
new file mode 100644
index 0000000000..53a07a048b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/10ee46dc1973472ead36ec4b8a1ea90200637c73
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/13b2e7a9d9f07a9e06ed96957c56e968f3b6070d b/test/core/end2end/fuzzers/api_fuzzer_corpus/13b2e7a9d9f07a9e06ed96957c56e968f3b6070d
new file mode 100644
index 0000000000..2b5ad2f124
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/13b2e7a9d9f07a9e06ed96957c56e968f3b6070d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/13c269dc54b84acbf75b78db730c25311a61c4ab b/test/core/end2end/fuzzers/api_fuzzer_corpus/13c269dc54b84acbf75b78db730c25311a61c4ab
new file mode 100644
index 0000000000..7503cc2667
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/13c269dc54b84acbf75b78db730c25311a61c4ab
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/140219fcde79e1de47129172abaef4e06e72534d b/test/core/end2end/fuzzers/api_fuzzer_corpus/140219fcde79e1de47129172abaef4e06e72534d
new file mode 100644
index 0000000000..3b8de8ccab
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/140219fcde79e1de47129172abaef4e06e72534d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/16b69b968a140abb00dd5c79ea7d0c1b23510fe7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/16b69b968a140abb00dd5c79ea7d0c1b23510fe7
new file mode 100644
index 0000000000..bf126c823b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/16b69b968a140abb00dd5c79ea7d0c1b23510fe7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/16f798191df0c173217cdcb4ec8edd3e4f7fb99b b/test/core/end2end/fuzzers/api_fuzzer_corpus/16f798191df0c173217cdcb4ec8edd3e4f7fb99b
new file mode 100644
index 0000000000..6d1c302045
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/16f798191df0c173217cdcb4ec8edd3e4f7fb99b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/17381a0515458a92bc8248051b600da4020a1207 b/test/core/end2end/fuzzers/api_fuzzer_corpus/17381a0515458a92bc8248051b600da4020a1207
new file mode 100644
index 0000000000..29b4821844
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/17381a0515458a92bc8248051b600da4020a1207
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/17647336806cf94a0224516f3d8caa22367c7c5a b/test/core/end2end/fuzzers/api_fuzzer_corpus/17647336806cf94a0224516f3d8caa22367c7c5a
new file mode 100644
index 0000000000..7522ae1811
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/17647336806cf94a0224516f3d8caa22367c7c5a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/17c7024889cc97a8afd3133b55a147ba75d17188 b/test/core/end2end/fuzzers/api_fuzzer_corpus/17c7024889cc97a8afd3133b55a147ba75d17188
new file mode 100644
index 0000000000..8ec6c5e2fe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/17c7024889cc97a8afd3133b55a147ba75d17188
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/194027acca76bf2e874aa672b4491f0b7fe32187 b/test/core/end2end/fuzzers/api_fuzzer_corpus/194027acca76bf2e874aa672b4491f0b7fe32187
new file mode 100644
index 0000000000..ae903fcb3a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/194027acca76bf2e874aa672b4491f0b7fe32187
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/1a6119919790570e3c15bb371648fc7929c72ea2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/1a6119919790570e3c15bb371648fc7929c72ea2
new file mode 100644
index 0000000000..646c5ba37d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/1a6119919790570e3c15bb371648fc7929c72ea2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/1abcbb03796c6512f5b8a977532fbcf6368b45b0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/1abcbb03796c6512f5b8a977532fbcf6368b45b0
new file mode 100644
index 0000000000..b334508449
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/1abcbb03796c6512f5b8a977532fbcf6368b45b0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/1c1a1980a1959423766c5a26ac79d07264224278 b/test/core/end2end/fuzzers/api_fuzzer_corpus/1c1a1980a1959423766c5a26ac79d07264224278
new file mode 100644
index 0000000000..e61a026142
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/1c1a1980a1959423766c5a26ac79d07264224278
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/1d505e827d0036b3d8eab87439d31da5f901aed1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/1d505e827d0036b3d8eab87439d31da5f901aed1
new file mode 100644
index 0000000000..908e75d651
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/1d505e827d0036b3d8eab87439d31da5f901aed1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/1dd9698ad85c7ab577bbc9b36180ef2641d8525c b/test/core/end2end/fuzzers/api_fuzzer_corpus/1dd9698ad85c7ab577bbc9b36180ef2641d8525c
new file mode 100644
index 0000000000..6ace431556
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/1dd9698ad85c7ab577bbc9b36180ef2641d8525c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/217785067a28a2dcdf7c5cea9ef8c10817889aa7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/217785067a28a2dcdf7c5cea9ef8c10817889aa7
new file mode 100644
index 0000000000..c77222c905
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/217785067a28a2dcdf7c5cea9ef8c10817889aa7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/21af47d84b1aa84e8b4021765203c8951239fe41 b/test/core/end2end/fuzzers/api_fuzzer_corpus/21af47d84b1aa84e8b4021765203c8951239fe41
new file mode 100644
index 0000000000..6b71998305
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/21af47d84b1aa84e8b4021765203c8951239fe41
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/22d23ae7b0a9c4ac6ffefe6b6b47bb5f54226ae1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/22d23ae7b0a9c4ac6ffefe6b6b47bb5f54226ae1
new file mode 100644
index 0000000000..c3eb2df96d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/22d23ae7b0a9c4ac6ffefe6b6b47bb5f54226ae1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2339fcca7f93814c587aba47fff2210875a41f49 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2339fcca7f93814c587aba47fff2210875a41f49
new file mode 100644
index 0000000000..02ec8a4b9b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2339fcca7f93814c587aba47fff2210875a41f49
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/239b03041efe9bf24982b0ecbb66d5abea4a28d0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/239b03041efe9bf24982b0ecbb66d5abea4a28d0
new file mode 100644
index 0000000000..8d78ff911d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/239b03041efe9bf24982b0ecbb66d5abea4a28d0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/24d630240f673498d784cecb66d73e9b1d981493 b/test/core/end2end/fuzzers/api_fuzzer_corpus/24d630240f673498d784cecb66d73e9b1d981493
new file mode 100644
index 0000000000..723831344b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/24d630240f673498d784cecb66d73e9b1d981493
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2533c4ed207eed715756142667128f6eb01309e0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2533c4ed207eed715756142667128f6eb01309e0
new file mode 100644
index 0000000000..0bb90c09a6
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2533c4ed207eed715756142667128f6eb01309e0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/255ab618b474a659914f5167f6e89ae3f1376788 b/test/core/end2end/fuzzers/api_fuzzer_corpus/255ab618b474a659914f5167f6e89ae3f1376788
new file mode 100644
index 0000000000..eb26d78201
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/255ab618b474a659914f5167f6e89ae3f1376788
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2577397157d02cde4544e70fd6c3ff68704dd13b b/test/core/end2end/fuzzers/api_fuzzer_corpus/2577397157d02cde4544e70fd6c3ff68704dd13b
new file mode 100644
index 0000000000..5914e4981e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2577397157d02cde4544e70fd6c3ff68704dd13b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/25c8a5f8fbaf47c8a398a284008d90d088c652b2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/25c8a5f8fbaf47c8a398a284008d90d088c652b2
new file mode 100644
index 0000000000..d9adfe4352
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/25c8a5f8fbaf47c8a398a284008d90d088c652b2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/26b6654b4efb469d4c8202dfc2ddafe4fc15e2d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/26b6654b4efb469d4c8202dfc2ddafe4fc15e2d1
new file mode 100644
index 0000000000..c7901b0834
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/26b6654b4efb469d4c8202dfc2ddafe4fc15e2d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2806c68471ca16df5356ef6a3379ea46c73c57cc b/test/core/end2end/fuzzers/api_fuzzer_corpus/2806c68471ca16df5356ef6a3379ea46c73c57cc
new file mode 100644
index 0000000000..6a75987740
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2806c68471ca16df5356ef6a3379ea46c73c57cc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2835dc7045dff8fd93a6e50bfd8775a50fce7599 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2835dc7045dff8fd93a6e50bfd8775a50fce7599
new file mode 100644
index 0000000000..9b97edf5e2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2835dc7045dff8fd93a6e50bfd8775a50fce7599
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/28f73943647c3bfbd96e8d1a6188c428b15fdf12 b/test/core/end2end/fuzzers/api_fuzzer_corpus/28f73943647c3bfbd96e8d1a6188c428b15fdf12
new file mode 100644
index 0000000000..50d31d1e94
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/28f73943647c3bfbd96e8d1a6188c428b15fdf12
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/29f39c36ffc68643789cd59ab9311a899fd9cfa6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/29f39c36ffc68643789cd59ab9311a899fd9cfa6
new file mode 100644
index 0000000000..fb60c67177
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/29f39c36ffc68643789cd59ab9311a899fd9cfa6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2afc0ae3e27ba7ab7ea26d656a01da4d85e0bbea b/test/core/end2end/fuzzers/api_fuzzer_corpus/2afc0ae3e27ba7ab7ea26d656a01da4d85e0bbea
new file mode 100644
index 0000000000..2d0ced00b6
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2afc0ae3e27ba7ab7ea26d656a01da4d85e0bbea
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2b6a001c2274e347cbfc6fe2e3bf4f7d7e79f5fe b/test/core/end2end/fuzzers/api_fuzzer_corpus/2b6a001c2274e347cbfc6fe2e3bf4f7d7e79f5fe
new file mode 100644
index 0000000000..fc05a69d44
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2b6a001c2274e347cbfc6fe2e3bf4f7d7e79f5fe
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2bc40826844d2232d9d36699432a30b4b1e5dd3a b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bc40826844d2232d9d36699432a30b4b1e5dd3a
new file mode 100644
index 0000000000..2bce71768d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bc40826844d2232d9d36699432a30b4b1e5dd3a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2bcd71048dec1df45e36fde6deeb8f04bbd01cd4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bcd71048dec1df45e36fde6deeb8f04bbd01cd4
new file mode 100644
index 0000000000..2a3e0fc959
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bcd71048dec1df45e36fde6deeb8f04bbd01cd4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2bfa23d5d476e4266cba3979f81a9ebdc26993e1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bfa23d5d476e4266cba3979f81a9ebdc26993e1
new file mode 100644
index 0000000000..c36a636149
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2bfa23d5d476e4266cba3979f81a9ebdc26993e1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2c5b259108eb1a9735d7a89609d96bc043914cdb b/test/core/end2end/fuzzers/api_fuzzer_corpus/2c5b259108eb1a9735d7a89609d96bc043914cdb
new file mode 100644
index 0000000000..3bab29c13b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2c5b259108eb1a9735d7a89609d96bc043914cdb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2d742d21ecbf421506ecf19b23d6075feca4350b b/test/core/end2end/fuzzers/api_fuzzer_corpus/2d742d21ecbf421506ecf19b23d6075feca4350b
new file mode 100644
index 0000000000..16d729ed13
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2d742d21ecbf421506ecf19b23d6075feca4350b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2dd76fc710e3e78eaf4e5069fa227de678d0830d b/test/core/end2end/fuzzers/api_fuzzer_corpus/2dd76fc710e3e78eaf4e5069fa227de678d0830d
new file mode 100644
index 0000000000..c15ba97dd7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2dd76fc710e3e78eaf4e5069fa227de678d0830d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2f8262de35a8314655d55f10ca46db441577ba36 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2f8262de35a8314655d55f10ca46db441577ba36
new file mode 100644
index 0000000000..983bfd3e0e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2f8262de35a8314655d55f10ca46db441577ba36
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2f9dd3b98b22bf2d4af5c2922977c8bb5699c367 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2f9dd3b98b22bf2d4af5c2922977c8bb5699c367
new file mode 100644
index 0000000000..a7d940a2e8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2f9dd3b98b22bf2d4af5c2922977c8bb5699c367
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/2ff0986c252d462149597fd83bd5753926d343a0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/2ff0986c252d462149597fd83bd5753926d343a0
new file mode 100644
index 0000000000..6640c96a01
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/2ff0986c252d462149597fd83bd5753926d343a0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3037118f9983abef4c9757742269f00cc90c0609 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3037118f9983abef4c9757742269f00cc90c0609
new file mode 100644
index 0000000000..15e6f5a6d1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3037118f9983abef4c9757742269f00cc90c0609
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/312b8910d1965fbfb09f0cb73e7e9d28316677bb b/test/core/end2end/fuzzers/api_fuzzer_corpus/312b8910d1965fbfb09f0cb73e7e9d28316677bb
new file mode 100644
index 0000000000..1e158f3f56
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/312b8910d1965fbfb09f0cb73e7e9d28316677bb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/321e6127d6f5619c88e31037f7fdec581acf75e8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/321e6127d6f5619c88e31037f7fdec581acf75e8
new file mode 100644
index 0000000000..1dd9bbc684
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/321e6127d6f5619c88e31037f7fdec581acf75e8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/33306900f08f0b618c2bf4ba6f6144be9d19cb97 b/test/core/end2end/fuzzers/api_fuzzer_corpus/33306900f08f0b618c2bf4ba6f6144be9d19cb97
new file mode 100644
index 0000000000..74889e3d16
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/33306900f08f0b618c2bf4ba6f6144be9d19cb97
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/34052cc2fa2be6543184db85d0b9ad33ae17029c b/test/core/end2end/fuzzers/api_fuzzer_corpus/34052cc2fa2be6543184db85d0b9ad33ae17029c
new file mode 100644
index 0000000000..3f19b37419
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/34052cc2fa2be6543184db85d0b9ad33ae17029c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/351c6aabe840d69a16ca0f630c6c5a11d42cb85c b/test/core/end2end/fuzzers/api_fuzzer_corpus/351c6aabe840d69a16ca0f630c6c5a11d42cb85c
new file mode 100644
index 0000000000..946a916da8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/351c6aabe840d69a16ca0f630c6c5a11d42cb85c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/35623259c0d5d73d23ea52efc3e4bd808c119440 b/test/core/end2end/fuzzers/api_fuzzer_corpus/35623259c0d5d73d23ea52efc3e4bd808c119440
new file mode 100644
index 0000000000..aa00ef36f8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/35623259c0d5d73d23ea52efc3e4bd808c119440
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/35b84f9f429e72230f0e9f6400ae5052c961fb27 b/test/core/end2end/fuzzers/api_fuzzer_corpus/35b84f9f429e72230f0e9f6400ae5052c961fb27
new file mode 100644
index 0000000000..d69c2a0d44
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/35b84f9f429e72230f0e9f6400ae5052c961fb27
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3606c0748089f53e252b577ff7ab2df203d098ff b/test/core/end2end/fuzzers/api_fuzzer_corpus/3606c0748089f53e252b577ff7ab2df203d098ff
new file mode 100644
index 0000000000..76a906b51c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3606c0748089f53e252b577ff7ab2df203d098ff
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/364f0605fd2d145db6ee6c7b01affb8833379db4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/364f0605fd2d145db6ee6c7b01affb8833379db4
new file mode 100644
index 0000000000..9067d63527
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/364f0605fd2d145db6ee6c7b01affb8833379db4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/371d4ed270fb3cc3858a33fc0a857da2a21e6478 b/test/core/end2end/fuzzers/api_fuzzer_corpus/371d4ed270fb3cc3858a33fc0a857da2a21e6478
new file mode 100644
index 0000000000..48f73afe4b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/371d4ed270fb3cc3858a33fc0a857da2a21e6478
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/37b8a63d83441e64e279457d0e8318581ad3a7e6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/37b8a63d83441e64e279457d0e8318581ad3a7e6
new file mode 100644
index 0000000000..fbb9438e72
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/37b8a63d83441e64e279457d0e8318581ad3a7e6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/37c26aa03db5daa01d7233f3c9fc474f81a724d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/37c26aa03db5daa01d7233f3c9fc474f81a724d1
new file mode 100644
index 0000000000..31b6c4e778
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/37c26aa03db5daa01d7233f3c9fc474f81a724d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/39330aec49922885cf84803d7a5ee61d5948ee66 b/test/core/end2end/fuzzers/api_fuzzer_corpus/39330aec49922885cf84803d7a5ee61d5948ee66
new file mode 100644
index 0000000000..f0ebfe7d7e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/39330aec49922885cf84803d7a5ee61d5948ee66
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3a07fd9ba009b9a57e298343e815abab13a16f5c b/test/core/end2end/fuzzers/api_fuzzer_corpus/3a07fd9ba009b9a57e298343e815abab13a16f5c
new file mode 100644
index 0000000000..0fa32fcf68
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3a07fd9ba009b9a57e298343e815abab13a16f5c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3a74f1be7106c7dea533a34bd8a88974f69a5d71 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3a74f1be7106c7dea533a34bd8a88974f69a5d71
new file mode 100644
index 0000000000..6f9a98b38c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3a74f1be7106c7dea533a34bd8a88974f69a5d71
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3abac3ec4db280fe9b8893b5f42986508dd87201 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3abac3ec4db280fe9b8893b5f42986508dd87201
new file mode 100644
index 0000000000..ef7cf36271
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3abac3ec4db280fe9b8893b5f42986508dd87201
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3adaa0aea970123baa8ddb2560842c43bd19eb3f b/test/core/end2end/fuzzers/api_fuzzer_corpus/3adaa0aea970123baa8ddb2560842c43bd19eb3f
new file mode 100644
index 0000000000..6f4d4ec8ea
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3adaa0aea970123baa8ddb2560842c43bd19eb3f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3adc410756f3e9cb929570bd5e5107663e8eed80 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3adc410756f3e9cb929570bd5e5107663e8eed80
new file mode 100644
index 0000000000..c4f17cb25d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3adc410756f3e9cb929570bd5e5107663e8eed80
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3c2b6ebd2cd3fa2ea216ed01c4a7275ecbaa40c0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3c2b6ebd2cd3fa2ea216ed01c4a7275ecbaa40c0
new file mode 100644
index 0000000000..bfb0ab0374
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3c2b6ebd2cd3fa2ea216ed01c4a7275ecbaa40c0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3c94ad60589b22d99dd03f98b37c609c180a755d b/test/core/end2end/fuzzers/api_fuzzer_corpus/3c94ad60589b22d99dd03f98b37c609c180a755d
new file mode 100644
index 0000000000..4fc4e7cee3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3c94ad60589b22d99dd03f98b37c609c180a755d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3d48a5c5a6188238bffee78f07b7cf6bb854258d b/test/core/end2end/fuzzers/api_fuzzer_corpus/3d48a5c5a6188238bffee78f07b7cf6bb854258d
new file mode 100644
index 0000000000..5fd299be52
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3d48a5c5a6188238bffee78f07b7cf6bb854258d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3d770d35de84de36ce4ed5b22f782edc99ecc634 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3d770d35de84de36ce4ed5b22f782edc99ecc634
new file mode 100644
index 0000000000..3f52390607
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3d770d35de84de36ce4ed5b22f782edc99ecc634
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3e0407abf398a7c40a34df7ed33ff23de02a2a6b b/test/core/end2end/fuzzers/api_fuzzer_corpus/3e0407abf398a7c40a34df7ed33ff23de02a2a6b
new file mode 100644
index 0000000000..b3535e3bc2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3e0407abf398a7c40a34df7ed33ff23de02a2a6b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3e539f323c6ddea1bd3e34599a3c47b4457acdcf b/test/core/end2end/fuzzers/api_fuzzer_corpus/3e539f323c6ddea1bd3e34599a3c47b4457acdcf
new file mode 100644
index 0000000000..b8276b3ebe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3e539f323c6ddea1bd3e34599a3c47b4457acdcf
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3ed3fbcdae0ab5b185d6e7f1f46c2440f656e8d6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3ed3fbcdae0ab5b185d6e7f1f46c2440f656e8d6
new file mode 100644
index 0000000000..428de29ef2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3ed3fbcdae0ab5b185d6e7f1f46c2440f656e8d6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3ef10f7eba289d88e82f3678434ecc1218a47ee3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3ef10f7eba289d88e82f3678434ecc1218a47ee3
new file mode 100644
index 0000000000..e5afb362d1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3ef10f7eba289d88e82f3678434ecc1218a47ee3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ab27065d2a4fed7d011af384e03150b72eda5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ab27065d2a4fed7d011af384e03150b72eda5
new file mode 100644
index 0000000000..ca0d421ff3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ab27065d2a4fed7d011af384e03150b72eda5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ee68f1f22eabcd01c2a7c1c6c8ccc299aa97d b/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ee68f1f22eabcd01c2a7c1c6c8ccc299aa97d
new file mode 100644
index 0000000000..c6d0b7c7aa
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3f4ee68f1f22eabcd01c2a7c1c6c8ccc299aa97d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/3fbf231b2182dc58d2cdf1c62f01a8b709752505 b/test/core/end2end/fuzzers/api_fuzzer_corpus/3fbf231b2182dc58d2cdf1c62f01a8b709752505
new file mode 100644
index 0000000000..65e06f4b14
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/3fbf231b2182dc58d2cdf1c62f01a8b709752505
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/40b500d38927c62c6966039b8557f810b3c19dc1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/40b500d38927c62c6966039b8557f810b3c19dc1
new file mode 100644
index 0000000000..5c19c386a7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/40b500d38927c62c6966039b8557f810b3c19dc1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/427392659bf3a945097c6c754a17d8c15e23816f b/test/core/end2end/fuzzers/api_fuzzer_corpus/427392659bf3a945097c6c754a17d8c15e23816f
new file mode 100644
index 0000000000..291b086295
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/427392659bf3a945097c6c754a17d8c15e23816f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/42b3c2bc6a11cea9d3ac86fbb8411360da676268 b/test/core/end2end/fuzzers/api_fuzzer_corpus/42b3c2bc6a11cea9d3ac86fbb8411360da676268
new file mode 100644
index 0000000000..4e48a54182
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/42b3c2bc6a11cea9d3ac86fbb8411360da676268
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/42bcf462c3b918f07c52e87bcea6fd69a1f291b1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/42bcf462c3b918f07c52e87bcea6fd69a1f291b1
new file mode 100644
index 0000000000..85652ae03e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/42bcf462c3b918f07c52e87bcea6fd69a1f291b1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/42e6fb19dac07a0cbe747dfc8f1c90bae1d58cec b/test/core/end2end/fuzzers/api_fuzzer_corpus/42e6fb19dac07a0cbe747dfc8f1c90bae1d58cec
new file mode 100644
index 0000000000..b271f38251
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/42e6fb19dac07a0cbe747dfc8f1c90bae1d58cec
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/43d52b36766d71176a2fc9f2a4be385bd2638570 b/test/core/end2end/fuzzers/api_fuzzer_corpus/43d52b36766d71176a2fc9f2a4be385bd2638570
new file mode 100644
index 0000000000..728887bdfb
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/43d52b36766d71176a2fc9f2a4be385bd2638570
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/44e696d37d7c113cf070d19871d5cc4e24a861d2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/44e696d37d7c113cf070d19871d5cc4e24a861d2
new file mode 100644
index 0000000000..cb537d05ff
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/44e696d37d7c113cf070d19871d5cc4e24a861d2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/44ec5dcc4133f1786084202bf41d877702ce9277 b/test/core/end2end/fuzzers/api_fuzzer_corpus/44ec5dcc4133f1786084202bf41d877702ce9277
new file mode 100644
index 0000000000..1d09faff2e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/44ec5dcc4133f1786084202bf41d877702ce9277
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/463a882b12f48bf803b650e95f3968a28732fc02 b/test/core/end2end/fuzzers/api_fuzzer_corpus/463a882b12f48bf803b650e95f3968a28732fc02
new file mode 100644
index 0000000000..84223ab736
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/463a882b12f48bf803b650e95f3968a28732fc02
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/464ad6f3ca7fdcaf80dd97478b6aa3b7005db6f2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/464ad6f3ca7fdcaf80dd97478b6aa3b7005db6f2
new file mode 100644
index 0000000000..5f860da3ce
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/464ad6f3ca7fdcaf80dd97478b6aa3b7005db6f2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/467971d589278cc348786054add9f1efda2fef9e b/test/core/end2end/fuzzers/api_fuzzer_corpus/467971d589278cc348786054add9f1efda2fef9e
new file mode 100644
index 0000000000..c0947bdbda
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/467971d589278cc348786054add9f1efda2fef9e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/47062580b496ad925d4d2faf1baec14bfe69a95b b/test/core/end2end/fuzzers/api_fuzzer_corpus/47062580b496ad925d4d2faf1baec14bfe69a95b
new file mode 100644
index 0000000000..2b07fa90a1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/47062580b496ad925d4d2faf1baec14bfe69a95b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/484ba3a787c8dab704c5d451e834044b46e35cdd b/test/core/end2end/fuzzers/api_fuzzer_corpus/484ba3a787c8dab704c5d451e834044b46e35cdd
new file mode 100644
index 0000000000..2f596e762a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/484ba3a787c8dab704c5d451e834044b46e35cdd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/48b3180434c4a21b334d7032ded763ef62b501bc b/test/core/end2end/fuzzers/api_fuzzer_corpus/48b3180434c4a21b334d7032ded763ef62b501bc
new file mode 100644
index 0000000000..60e3a89c43
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/48b3180434c4a21b334d7032ded763ef62b501bc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/48ca1abe666bbf83a81d5c3be2d72017131ca4bf b/test/core/end2end/fuzzers/api_fuzzer_corpus/48ca1abe666bbf83a81d5c3be2d72017131ca4bf
new file mode 100644
index 0000000000..19afa2546a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/48ca1abe666bbf83a81d5c3be2d72017131ca4bf
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/494f747fe7c326002c3fb676c35d5dca2e28fd89 b/test/core/end2end/fuzzers/api_fuzzer_corpus/494f747fe7c326002c3fb676c35d5dca2e28fd89
new file mode 100644
index 0000000000..883f2a5092
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/494f747fe7c326002c3fb676c35d5dca2e28fd89
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/49ff30e0f070fe37b642dd0d361c5cbca139f223 b/test/core/end2end/fuzzers/api_fuzzer_corpus/49ff30e0f070fe37b642dd0d361c5cbca139f223
new file mode 100644
index 0000000000..0b59f3e588
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/49ff30e0f070fe37b642dd0d361c5cbca139f223
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4a4ed32b4433e3cd99a4cd3cea00551074d07c9d b/test/core/end2end/fuzzers/api_fuzzer_corpus/4a4ed32b4433e3cd99a4cd3cea00551074d07c9d
new file mode 100644
index 0000000000..5d75af78e9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4a4ed32b4433e3cd99a4cd3cea00551074d07c9d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4a7f8838cbf48e54b6649e62a32d4f0173ada959 b/test/core/end2end/fuzzers/api_fuzzer_corpus/4a7f8838cbf48e54b6649e62a32d4f0173ada959
new file mode 100644
index 0000000000..c8e39d29de
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4a7f8838cbf48e54b6649e62a32d4f0173ada959
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4aac2683fc841a2b5da166889c54c01aa2ab9c6c b/test/core/end2end/fuzzers/api_fuzzer_corpus/4aac2683fc841a2b5da166889c54c01aa2ab9c6c
new file mode 100644
index 0000000000..af526c1ccc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4aac2683fc841a2b5da166889c54c01aa2ab9c6c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4b08cbe9580dee1321fca514e74fbdd0022ec574 b/test/core/end2end/fuzzers/api_fuzzer_corpus/4b08cbe9580dee1321fca514e74fbdd0022ec574
new file mode 100644
index 0000000000..d99342a0dc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4b08cbe9580dee1321fca514e74fbdd0022ec574
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4b538eda0a7ad5d38b9d95867b7c181cbe84589b b/test/core/end2end/fuzzers/api_fuzzer_corpus/4b538eda0a7ad5d38b9d95867b7c181cbe84589b
new file mode 100644
index 0000000000..109dd138fe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4b538eda0a7ad5d38b9d95867b7c181cbe84589b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4df3330a4c9a861ed98d0c5a19f7388ab1c9840d b/test/core/end2end/fuzzers/api_fuzzer_corpus/4df3330a4c9a861ed98d0c5a19f7388ab1c9840d
new file mode 100644
index 0000000000..342f0e5d06
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4df3330a4c9a861ed98d0c5a19f7388ab1c9840d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4e4e5902e6d79c5d57bbf631863ab51b8b07943a b/test/core/end2end/fuzzers/api_fuzzer_corpus/4e4e5902e6d79c5d57bbf631863ab51b8b07943a
new file mode 100644
index 0000000000..63ff4dd0c9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4e4e5902e6d79c5d57bbf631863ab51b8b07943a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/4eb0173ccf074ec6d8c1943f3ab2464184262426 b/test/core/end2end/fuzzers/api_fuzzer_corpus/4eb0173ccf074ec6d8c1943f3ab2464184262426
new file mode 100644
index 0000000000..223d45908e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/4eb0173ccf074ec6d8c1943f3ab2464184262426
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/50125f617f85b033f72e4938f227fc771083e9d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/50125f617f85b033f72e4938f227fc771083e9d1
new file mode 100644
index 0000000000..746eeaf199
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/50125f617f85b033f72e4938f227fc771083e9d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/507b8ecbb9fd3eea9084087bce22a94cca8a7c41 b/test/core/end2end/fuzzers/api_fuzzer_corpus/507b8ecbb9fd3eea9084087bce22a94cca8a7c41
new file mode 100644
index 0000000000..818612a4ba
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/507b8ecbb9fd3eea9084087bce22a94cca8a7c41
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/509fa48e02986acab87796b1976e78a6ec243b79 b/test/core/end2end/fuzzers/api_fuzzer_corpus/509fa48e02986acab87796b1976e78a6ec243b79
new file mode 100644
index 0000000000..70c43013f3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/509fa48e02986acab87796b1976e78a6ec243b79
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/51a2c3035dc5359f9887b588b922faa6789c7ea7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/51a2c3035dc5359f9887b588b922faa6789c7ea7
new file mode 100644
index 0000000000..7d916bfb8f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/51a2c3035dc5359f9887b588b922faa6789c7ea7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5259807dc13effc44f0785be11f5dc0c0f35a659 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5259807dc13effc44f0785be11f5dc0c0f35a659
new file mode 100644
index 0000000000..4a99f75ad7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5259807dc13effc44f0785be11f5dc0c0f35a659
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/531c6bd636d1d022ecdabf41243c1f036162bd8b b/test/core/end2end/fuzzers/api_fuzzer_corpus/531c6bd636d1d022ecdabf41243c1f036162bd8b
new file mode 100644
index 0000000000..9edd3ec384
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/531c6bd636d1d022ecdabf41243c1f036162bd8b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5347599c4246a004f9cbecfa78d39168237b6394 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5347599c4246a004f9cbecfa78d39168237b6394
new file mode 100644
index 0000000000..b5de97437b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5347599c4246a004f9cbecfa78d39168237b6394
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5356dcd6b1d0487f9723663f8a3dc955b7e09273 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5356dcd6b1d0487f9723663f8a3dc955b7e09273
new file mode 100644
index 0000000000..9ea58aab61
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5356dcd6b1d0487f9723663f8a3dc955b7e09273
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/53d637a3f0b9fc07dee0de089080e5c105381eb1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/53d637a3f0b9fc07dee0de089080e5c105381eb1
new file mode 100644
index 0000000000..1d58a056bc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/53d637a3f0b9fc07dee0de089080e5c105381eb1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/55c1b1bd6e532928ad47cadd8e5c5363849d7df5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/55c1b1bd6e532928ad47cadd8e5c5363849d7df5
new file mode 100644
index 0000000000..1cb102612e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/55c1b1bd6e532928ad47cadd8e5c5363849d7df5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/568af7c1199c646c500e287b50abada8ac0ff2da b/test/core/end2end/fuzzers/api_fuzzer_corpus/568af7c1199c646c500e287b50abada8ac0ff2da
new file mode 100644
index 0000000000..2e61a0122e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/568af7c1199c646c500e287b50abada8ac0ff2da
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/56be7398f856423e2252d1a4e31103ebaebcc15b b/test/core/end2end/fuzzers/api_fuzzer_corpus/56be7398f856423e2252d1a4e31103ebaebcc15b
new file mode 100644
index 0000000000..352dca6cc0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/56be7398f856423e2252d1a4e31103ebaebcc15b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/56fb970061e8b61059130c0ac642bd0ceb0ea26d b/test/core/end2end/fuzzers/api_fuzzer_corpus/56fb970061e8b61059130c0ac642bd0ceb0ea26d
new file mode 100644
index 0000000000..a9648a22f0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/56fb970061e8b61059130c0ac642bd0ceb0ea26d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5748d19bd88d2495f0ced135e70b5bb4fe0b4148 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5748d19bd88d2495f0ced135e70b5bb4fe0b4148
new file mode 100644
index 0000000000..9d0c41260e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5748d19bd88d2495f0ced135e70b5bb4fe0b4148
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/587d211412b8405e82245f511007083dd60b7477 b/test/core/end2end/fuzzers/api_fuzzer_corpus/587d211412b8405e82245f511007083dd60b7477
new file mode 100644
index 0000000000..80cffc0f8e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/587d211412b8405e82245f511007083dd60b7477
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/58f2f1f487dcd6cc6f2126835ec647c73f0d371a b/test/core/end2end/fuzzers/api_fuzzer_corpus/58f2f1f487dcd6cc6f2126835ec647c73f0d371a
new file mode 100644
index 0000000000..72ccf3e884
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/58f2f1f487dcd6cc6f2126835ec647c73f0d371a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/58f87cac2d3f564f1afe4ca85637e47b758796a5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/58f87cac2d3f564f1afe4ca85637e47b758796a5
new file mode 100644
index 0000000000..8832ada456
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/58f87cac2d3f564f1afe4ca85637e47b758796a5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5928c7d56230ac7c10860c64ebfa6aa243f2966c b/test/core/end2end/fuzzers/api_fuzzer_corpus/5928c7d56230ac7c10860c64ebfa6aa243f2966c
new file mode 100644
index 0000000000..88a876c932
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5928c7d56230ac7c10860c64ebfa6aa243f2966c
@@ -0,0 +1 @@
+ëô \ No newline at end of file
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5a3dbe637791a9a7c5005b985c1cc3e7066f8f50 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5a3dbe637791a9a7c5005b985c1cc3e7066f8f50
new file mode 100644
index 0000000000..a8642fdd05
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5a3dbe637791a9a7c5005b985c1cc3e7066f8f50
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5ad89e10b538191d22187503233223d2e520d80f b/test/core/end2end/fuzzers/api_fuzzer_corpus/5ad89e10b538191d22187503233223d2e520d80f
new file mode 100644
index 0000000000..02b06b2af3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5ad89e10b538191d22187503233223d2e520d80f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5b1d5721f3828cb73647cbf8c9e6b456a505a00b b/test/core/end2end/fuzzers/api_fuzzer_corpus/5b1d5721f3828cb73647cbf8c9e6b456a505a00b
new file mode 100644
index 0000000000..f62a7f00c7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5b1d5721f3828cb73647cbf8c9e6b456a505a00b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5b8bc6a61171513d5c9a96cb340e0a435c524017 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5b8bc6a61171513d5c9a96cb340e0a435c524017
new file mode 100644
index 0000000000..3abc5c8fe5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5b8bc6a61171513d5c9a96cb340e0a435c524017
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5bcde4a99b8ad54a5b8ba9b5131842c6c7c0ef19 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5bcde4a99b8ad54a5b8ba9b5131842c6c7c0ef19
new file mode 100644
index 0000000000..1008f5cc43
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5bcde4a99b8ad54a5b8ba9b5131842c6c7c0ef19
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5cd1f23514773a7c5dd30be268b6fcfd1ace84b3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5cd1f23514773a7c5dd30be268b6fcfd1ace84b3
new file mode 100644
index 0000000000..895cdd8095
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5cd1f23514773a7c5dd30be268b6fcfd1ace84b3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5d8bc49f1deb0199a806113ab049df418a9d9316 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5d8bc49f1deb0199a806113ab049df418a9d9316
new file mode 100644
index 0000000000..152b150379
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5d8bc49f1deb0199a806113ab049df418a9d9316
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5da04bc3d5b4889de2f12508ef13bcb490787854 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5da04bc3d5b4889de2f12508ef13bcb490787854
new file mode 100644
index 0000000000..1f8c58dbb9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5da04bc3d5b4889de2f12508ef13bcb490787854
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/5fe822a742cf2f5328cec86c0972b0c7b4bd4460 b/test/core/end2end/fuzzers/api_fuzzer_corpus/5fe822a742cf2f5328cec86c0972b0c7b4bd4460
new file mode 100644
index 0000000000..442304561b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/5fe822a742cf2f5328cec86c0972b0c7b4bd4460
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6016f65e62600b73d18ca8548591034fcddf440c b/test/core/end2end/fuzzers/api_fuzzer_corpus/6016f65e62600b73d18ca8548591034fcddf440c
new file mode 100644
index 0000000000..6b1629935b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6016f65e62600b73d18ca8548591034fcddf440c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/61614f406af22aa805e6a2cfb24519ffd058d575 b/test/core/end2end/fuzzers/api_fuzzer_corpus/61614f406af22aa805e6a2cfb24519ffd058d575
new file mode 100644
index 0000000000..c66b8d6532
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/61614f406af22aa805e6a2cfb24519ffd058d575
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6196eb700471a9678e3e68526ab65bf4346c5bad b/test/core/end2end/fuzzers/api_fuzzer_corpus/6196eb700471a9678e3e68526ab65bf4346c5bad
new file mode 100644
index 0000000000..823622a4cc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6196eb700471a9678e3e68526ab65bf4346c5bad
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/622a3505d10767b795fc2c2922c0d5305d9b84e6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/622a3505d10767b795fc2c2922c0d5305d9b84e6
new file mode 100644
index 0000000000..3ecf7ac06f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/622a3505d10767b795fc2c2922c0d5305d9b84e6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/63626e71d4e8e15905f13933f5b88d89073b3411 b/test/core/end2end/fuzzers/api_fuzzer_corpus/63626e71d4e8e15905f13933f5b88d89073b3411
new file mode 100644
index 0000000000..21ae807b08
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/63626e71d4e8e15905f13933f5b88d89073b3411
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/63b74d17bfbd015bb55dda59a05101bee001369c b/test/core/end2end/fuzzers/api_fuzzer_corpus/63b74d17bfbd015bb55dda59a05101bee001369c
new file mode 100644
index 0000000000..24c0da603c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/63b74d17bfbd015bb55dda59a05101bee001369c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/63d83cb5580d3222eb5e2d7982f7f995634ba5c1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/63d83cb5580d3222eb5e2d7982f7f995634ba5c1
new file mode 100644
index 0000000000..0ec510fca1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/63d83cb5580d3222eb5e2d7982f7f995634ba5c1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/64ce7e5553de2c081991af4fc386bffdd8d2e210 b/test/core/end2end/fuzzers/api_fuzzer_corpus/64ce7e5553de2c081991af4fc386bffdd8d2e210
new file mode 100644
index 0000000000..264a898e3a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/64ce7e5553de2c081991af4fc386bffdd8d2e210
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/65afd7305e481da5ffc44a6a66eb3117744ae77d b/test/core/end2end/fuzzers/api_fuzzer_corpus/65afd7305e481da5ffc44a6a66eb3117744ae77d
new file mode 100644
index 0000000000..f2ff80c7be
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/65afd7305e481da5ffc44a6a66eb3117744ae77d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/65d8075993dbb2ed83dea46cd76e974352916eac b/test/core/end2end/fuzzers/api_fuzzer_corpus/65d8075993dbb2ed83dea46cd76e974352916eac
new file mode 100644
index 0000000000..4f26aab920
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/65d8075993dbb2ed83dea46cd76e974352916eac
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/663e7fc276b902cd6efb5bc944c4c7af90ca916d b/test/core/end2end/fuzzers/api_fuzzer_corpus/663e7fc276b902cd6efb5bc944c4c7af90ca916d
new file mode 100644
index 0000000000..6509515b85
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/663e7fc276b902cd6efb5bc944c4c7af90ca916d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6730972339225220310ac8c09c0f776ae465fc87 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6730972339225220310ac8c09c0f776ae465fc87
new file mode 100644
index 0000000000..c2eda84c17
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6730972339225220310ac8c09c0f776ae465fc87
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6810347353fd417add645af90476310bbf572788 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6810347353fd417add645af90476310bbf572788
new file mode 100644
index 0000000000..220438c90b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6810347353fd417add645af90476310bbf572788
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6839920a4e7e998a8f30e6679934b91a819bebc9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6839920a4e7e998a8f30e6679934b91a819bebc9
new file mode 100644
index 0000000000..129d36e222
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6839920a4e7e998a8f30e6679934b91a819bebc9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/68d88fa596ebee37d7c0251c0abcd844b452cf28 b/test/core/end2end/fuzzers/api_fuzzer_corpus/68d88fa596ebee37d7c0251c0abcd844b452cf28
new file mode 100644
index 0000000000..b958c050b4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/68d88fa596ebee37d7c0251c0abcd844b452cf28
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6a0c934ac351b40c8815d7812a2bb1b0ca30940f b/test/core/end2end/fuzzers/api_fuzzer_corpus/6a0c934ac351b40c8815d7812a2bb1b0ca30940f
new file mode 100644
index 0000000000..66d482ab81
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6a0c934ac351b40c8815d7812a2bb1b0ca30940f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6ae9bab625e9ac8210953a7363167d6deaf194ec b/test/core/end2end/fuzzers/api_fuzzer_corpus/6ae9bab625e9ac8210953a7363167d6deaf194ec
new file mode 100644
index 0000000000..1e65ebcfd0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6ae9bab625e9ac8210953a7363167d6deaf194ec
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6b6a9a2ecc635bd8d76b00b64aeb6297e04683b6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6b6a9a2ecc635bd8d76b00b64aeb6297e04683b6
new file mode 100644
index 0000000000..0260dc8117
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6b6a9a2ecc635bd8d76b00b64aeb6297e04683b6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6bddcd6ce1ff68320e3cc62bc215acf04de36ed2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6bddcd6ce1ff68320e3cc62bc215acf04de36ed2
new file mode 100644
index 0000000000..ec41272052
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6bddcd6ce1ff68320e3cc62bc215acf04de36ed2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6c3c3119fabe838b2600e24651931f3012338e3b b/test/core/end2end/fuzzers/api_fuzzer_corpus/6c3c3119fabe838b2600e24651931f3012338e3b
new file mode 100644
index 0000000000..d0d5a8db40
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6c3c3119fabe838b2600e24651931f3012338e3b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6cb9930369caf7584015d3a17c37e144d23b79ce b/test/core/end2end/fuzzers/api_fuzzer_corpus/6cb9930369caf7584015d3a17c37e144d23b79ce
new file mode 100644
index 0000000000..788cac3b7d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6cb9930369caf7584015d3a17c37e144d23b79ce
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6f72c05f90d289ad239cff682d8e911cbbb416dc b/test/core/end2end/fuzzers/api_fuzzer_corpus/6f72c05f90d289ad239cff682d8e911cbbb416dc
new file mode 100644
index 0000000000..e177dd5d4c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6f72c05f90d289ad239cff682d8e911cbbb416dc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6f93d27e20d9158285cdc0193757daa2e34190b1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6f93d27e20d9158285cdc0193757daa2e34190b1
new file mode 100644
index 0000000000..d1c3c89e97
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6f93d27e20d9158285cdc0193757daa2e34190b1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/6fc72a2c1ff9a11539ae35b197a79786496c2257 b/test/core/end2end/fuzzers/api_fuzzer_corpus/6fc72a2c1ff9a11539ae35b197a79786496c2257
new file mode 100644
index 0000000000..a88e82f910
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/6fc72a2c1ff9a11539ae35b197a79786496c2257
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7025657232cd9bcb8fcd6edebdff268cf8e74db8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7025657232cd9bcb8fcd6edebdff268cf8e74db8
new file mode 100644
index 0000000000..bab9287c18
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7025657232cd9bcb8fcd6edebdff268cf8e74db8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7108fee873f0120d41f469944cf1e24bd33ad684 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7108fee873f0120d41f469944cf1e24bd33ad684
new file mode 100644
index 0000000000..8c7ac1e87e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7108fee873f0120d41f469944cf1e24bd33ad684
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/713f66791d0f23b7b7b0ec9c40b6d51f7b214c9a b/test/core/end2end/fuzzers/api_fuzzer_corpus/713f66791d0f23b7b7b0ec9c40b6d51f7b214c9a
new file mode 100644
index 0000000000..a05e04b315
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/713f66791d0f23b7b7b0ec9c40b6d51f7b214c9a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/71ef778b5cb623be033026d5a6968e49a9581dc2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/71ef778b5cb623be033026d5a6968e49a9581dc2
new file mode 100644
index 0000000000..691dc5b52a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/71ef778b5cb623be033026d5a6968e49a9581dc2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/72205156cfb4fe412e4838b771dc9c9a8f1441d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/72205156cfb4fe412e4838b771dc9c9a8f1441d1
new file mode 100644
index 0000000000..14ec62d50b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/72205156cfb4fe412e4838b771dc9c9a8f1441d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/72b0bead5c0425173f696ff8efd7c726dcc4ecf8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/72b0bead5c0425173f696ff8efd7c726dcc4ecf8
new file mode 100644
index 0000000000..33699a1642
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/72b0bead5c0425173f696ff8efd7c726dcc4ecf8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/72c747d699af2733d0b93e6fa7afa0f88d05eed7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/72c747d699af2733d0b93e6fa7afa0f88d05eed7
new file mode 100644
index 0000000000..b229d992b0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/72c747d699af2733d0b93e6fa7afa0f88d05eed7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7365085e946d2c950beafa73b8631b82010acaed b/test/core/end2end/fuzzers/api_fuzzer_corpus/7365085e946d2c950beafa73b8631b82010acaed
new file mode 100644
index 0000000000..05016a08d7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7365085e946d2c950beafa73b8631b82010acaed
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/73b467524ba4f55fd030be6b0602389b9af4fa1a b/test/core/end2end/fuzzers/api_fuzzer_corpus/73b467524ba4f55fd030be6b0602389b9af4fa1a
new file mode 100644
index 0000000000..c61bcdbb68
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/73b467524ba4f55fd030be6b0602389b9af4fa1a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/73c6386046061350e70fbd846e7dba1428a43857 b/test/core/end2end/fuzzers/api_fuzzer_corpus/73c6386046061350e70fbd846e7dba1428a43857
new file mode 100644
index 0000000000..7f88c5b78d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/73c6386046061350e70fbd846e7dba1428a43857
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7436e1a9a62ad1f40320da321698477ed8f2b577 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7436e1a9a62ad1f40320da321698477ed8f2b577
new file mode 100644
index 0000000000..aa000d2b46
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7436e1a9a62ad1f40320da321698477ed8f2b577
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7515e494e0ac5d2d3b53151b3d10bfcf81578c99 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7515e494e0ac5d2d3b53151b3d10bfcf81578c99
new file mode 100644
index 0000000000..21fe9c66b0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7515e494e0ac5d2d3b53151b3d10bfcf81578c99
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/75652d3d4f913e10f7edef130e3d82a03b82247f b/test/core/end2end/fuzzers/api_fuzzer_corpus/75652d3d4f913e10f7edef130e3d82a03b82247f
new file mode 100644
index 0000000000..0c0f4bec79
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/75652d3d4f913e10f7edef130e3d82a03b82247f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/75aa409bfe540a3ad31f8bc504131eb41128404d b/test/core/end2end/fuzzers/api_fuzzer_corpus/75aa409bfe540a3ad31f8bc504131eb41128404d
new file mode 100644
index 0000000000..f5d12de8cd
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/75aa409bfe540a3ad31f8bc504131eb41128404d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/764deb515100de2b3d375d2689fd2c9e55eb8cd6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/764deb515100de2b3d375d2689fd2c9e55eb8cd6
new file mode 100644
index 0000000000..8d9345b813
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/764deb515100de2b3d375d2689fd2c9e55eb8cd6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7697d76245fff3d4a58fb04745c2a6197c9eeb54 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7697d76245fff3d4a58fb04745c2a6197c9eeb54
new file mode 100644
index 0000000000..655ec84849
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7697d76245fff3d4a58fb04745c2a6197c9eeb54
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/76ecc734e931672cb80c9b9e31ebe5ec552bb126 b/test/core/end2end/fuzzers/api_fuzzer_corpus/76ecc734e931672cb80c9b9e31ebe5ec552bb126
new file mode 100644
index 0000000000..780d885c23
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/76ecc734e931672cb80c9b9e31ebe5ec552bb126
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/76fc91359df03ef449e35588909eb949e05d50d5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/76fc91359df03ef449e35588909eb949e05d50d5
new file mode 100644
index 0000000000..82da364190
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/76fc91359df03ef449e35588909eb949e05d50d5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/77662d88e025c080212dd2dc4dd2030810926f40 b/test/core/end2end/fuzzers/api_fuzzer_corpus/77662d88e025c080212dd2dc4dd2030810926f40
new file mode 100644
index 0000000000..4872eb645c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/77662d88e025c080212dd2dc4dd2030810926f40
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/77dfcf5329baff3430c0bb270ee43fcf6b216238 b/test/core/end2end/fuzzers/api_fuzzer_corpus/77dfcf5329baff3430c0bb270ee43fcf6b216238
new file mode 100644
index 0000000000..ff0f3210f0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/77dfcf5329baff3430c0bb270ee43fcf6b216238
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/798e448161e03d40712655f913464a276b6d6129 b/test/core/end2end/fuzzers/api_fuzzer_corpus/798e448161e03d40712655f913464a276b6d6129
new file mode 100644
index 0000000000..89637b77cf
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/798e448161e03d40712655f913464a276b6d6129
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/79b2bfe9fcf1eab62e921dcc2f64b778d34802d8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/79b2bfe9fcf1eab62e921dcc2f64b778d34802d8
new file mode 100644
index 0000000000..999a861cee
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/79b2bfe9fcf1eab62e921dcc2f64b778d34802d8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/79da19253d7fea59733d2a5276bb393918f014d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/79da19253d7fea59733d2a5276bb393918f014d1
new file mode 100644
index 0000000000..3e8f4e2f26
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/79da19253d7fea59733d2a5276bb393918f014d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7a17b28c4e274868a9f9a8430ddd12d07221396e b/test/core/end2end/fuzzers/api_fuzzer_corpus/7a17b28c4e274868a9f9a8430ddd12d07221396e
new file mode 100644
index 0000000000..367ae401b8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7a17b28c4e274868a9f9a8430ddd12d07221396e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7a5a769942efac79863bb154cf1e7574e6d98e22 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7a5a769942efac79863bb154cf1e7574e6d98e22
new file mode 100644
index 0000000000..d48c5b5df9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7a5a769942efac79863bb154cf1e7574e6d98e22
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7aabe800afb737ea6e5e6068d89c76fdbfd448d0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7aabe800afb737ea6e5e6068d89c76fdbfd448d0
new file mode 100644
index 0000000000..36fd4e7f30
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7aabe800afb737ea6e5e6068d89c76fdbfd448d0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7ac32e7febefac7cda0a019b2b9276b97bb91c4a b/test/core/end2end/fuzzers/api_fuzzer_corpus/7ac32e7febefac7cda0a019b2b9276b97bb91c4a
new file mode 100644
index 0000000000..7e98c40464
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7ac32e7febefac7cda0a019b2b9276b97bb91c4a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7b1ad173c2ce60dd9f82143be5db1cbd317f8a6e b/test/core/end2end/fuzzers/api_fuzzer_corpus/7b1ad173c2ce60dd9f82143be5db1cbd317f8a6e
new file mode 100644
index 0000000000..afb0039b61
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7b1ad173c2ce60dd9f82143be5db1cbd317f8a6e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7b747e0fabbfae7ecb4e9e8261121aaa42a21cc2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7b747e0fabbfae7ecb4e9e8261121aaa42a21cc2
new file mode 100644
index 0000000000..332ba8647a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7b747e0fabbfae7ecb4e9e8261121aaa42a21cc2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7bd868f9aba4f89259c14358aff16d00114b2897 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7bd868f9aba4f89259c14358aff16d00114b2897
new file mode 100644
index 0000000000..1358115caf
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7bd868f9aba4f89259c14358aff16d00114b2897
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7c9b85db0b4648d13fd8a0de2de9bebdba555fa8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/7c9b85db0b4648d13fd8a0de2de9bebdba555fa8
new file mode 100644
index 0000000000..d8f69eb0e9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7c9b85db0b4648d13fd8a0de2de9bebdba555fa8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/7fe27d0f43c09c4070f479163e1479440c4bc7cc b/test/core/end2end/fuzzers/api_fuzzer_corpus/7fe27d0f43c09c4070f479163e1479440c4bc7cc
new file mode 100644
index 0000000000..5faa61a047
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/7fe27d0f43c09c4070f479163e1479440c4bc7cc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/801f08f6085a2986fb868d326c71bdcb16df1481 b/test/core/end2end/fuzzers/api_fuzzer_corpus/801f08f6085a2986fb868d326c71bdcb16df1481
new file mode 100644
index 0000000000..ced2c9450a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/801f08f6085a2986fb868d326c71bdcb16df1481
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8102033256a24f00a59a0f23640d379eaeaba37d b/test/core/end2end/fuzzers/api_fuzzer_corpus/8102033256a24f00a59a0f23640d379eaeaba37d
new file mode 100644
index 0000000000..2804149178
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8102033256a24f00a59a0f23640d379eaeaba37d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/815f39659d787ccae06bc7d1e0564525c27b9b79 b/test/core/end2end/fuzzers/api_fuzzer_corpus/815f39659d787ccae06bc7d1e0564525c27b9b79
new file mode 100644
index 0000000000..900119a143
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/815f39659d787ccae06bc7d1e0564525c27b9b79
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/816a1c7d02100fb495ab698923f8f4e550583e91 b/test/core/end2end/fuzzers/api_fuzzer_corpus/816a1c7d02100fb495ab698923f8f4e550583e91
new file mode 100644
index 0000000000..1d5b4daa9d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/816a1c7d02100fb495ab698923f8f4e550583e91
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/820b97903732cf20dae26cdba0717220fa042a49 b/test/core/end2end/fuzzers/api_fuzzer_corpus/820b97903732cf20dae26cdba0717220fa042a49
new file mode 100644
index 0000000000..f644cd8ae1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/820b97903732cf20dae26cdba0717220fa042a49
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/829a44d34a4c591b8808aa5eb283869e0fece45b b/test/core/end2end/fuzzers/api_fuzzer_corpus/829a44d34a4c591b8808aa5eb283869e0fece45b
new file mode 100644
index 0000000000..1c969eaae8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/829a44d34a4c591b8808aa5eb283869e0fece45b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/83371e1fa4720aae8035d7dc955d376678e102ef b/test/core/end2end/fuzzers/api_fuzzer_corpus/83371e1fa4720aae8035d7dc955d376678e102ef
new file mode 100644
index 0000000000..618ba3a818
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/83371e1fa4720aae8035d7dc955d376678e102ef
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/83566906d8ca1b2296d7d9042e1196a1cf69ab9c b/test/core/end2end/fuzzers/api_fuzzer_corpus/83566906d8ca1b2296d7d9042e1196a1cf69ab9c
new file mode 100644
index 0000000000..5739f9bc25
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/83566906d8ca1b2296d7d9042e1196a1cf69ab9c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/83b2491b16c26c0dbb6aef5a9df10a3fa83beea2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/83b2491b16c26c0dbb6aef5a9df10a3fa83beea2
new file mode 100644
index 0000000000..9d4b55cda4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/83b2491b16c26c0dbb6aef5a9df10a3fa83beea2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/83b62e268ed5ffc26a1a97562e087791f46d3552 b/test/core/end2end/fuzzers/api_fuzzer_corpus/83b62e268ed5ffc26a1a97562e087791f46d3552
new file mode 100644
index 0000000000..4f537c6750
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/83b62e268ed5ffc26a1a97562e087791f46d3552
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/83df07a7e069d0932a221e28a2d47e449ca37c3f b/test/core/end2end/fuzzers/api_fuzzer_corpus/83df07a7e069d0932a221e28a2d47e449ca37c3f
new file mode 100644
index 0000000000..80838b875c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/83df07a7e069d0932a221e28a2d47e449ca37c3f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/840959b26ce65b833d488ebb7b1d8431839fe701 b/test/core/end2end/fuzzers/api_fuzzer_corpus/840959b26ce65b833d488ebb7b1d8431839fe701
new file mode 100644
index 0000000000..91ddac0076
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/840959b26ce65b833d488ebb7b1d8431839fe701
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/84316630fa8962f4753dda6e6c75625c47d19675 b/test/core/end2end/fuzzers/api_fuzzer_corpus/84316630fa8962f4753dda6e6c75625c47d19675
new file mode 100644
index 0000000000..1b6b1cae40
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/84316630fa8962f4753dda6e6c75625c47d19675
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/858a8d611419ced08aa85e89b75ff7baa1d9a791 b/test/core/end2end/fuzzers/api_fuzzer_corpus/858a8d611419ced08aa85e89b75ff7baa1d9a791
new file mode 100644
index 0000000000..f1ce8c1abe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/858a8d611419ced08aa85e89b75ff7baa1d9a791
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/86bac2d397ae2c0c178171f1f9daf7a8603c6d7a b/test/core/end2end/fuzzers/api_fuzzer_corpus/86bac2d397ae2c0c178171f1f9daf7a8603c6d7a
new file mode 100644
index 0000000000..dae805b397
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/86bac2d397ae2c0c178171f1f9daf7a8603c6d7a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/87489d217ddd2fa2803947a38d66a9935f64fe63 b/test/core/end2end/fuzzers/api_fuzzer_corpus/87489d217ddd2fa2803947a38d66a9935f64fe63
new file mode 100644
index 0000000000..a6409f6fbe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/87489d217ddd2fa2803947a38d66a9935f64fe63
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/879979038a496564beb9a0ae1d70cb20c7e6db75 b/test/core/end2end/fuzzers/api_fuzzer_corpus/879979038a496564beb9a0ae1d70cb20c7e6db75
new file mode 100644
index 0000000000..693172e72c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/879979038a496564beb9a0ae1d70cb20c7e6db75
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/882b03ed3abc37b43412e8396cdf3fb8b0eeb931 b/test/core/end2end/fuzzers/api_fuzzer_corpus/882b03ed3abc37b43412e8396cdf3fb8b0eeb931
new file mode 100644
index 0000000000..cacfa19f9e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/882b03ed3abc37b43412e8396cdf3fb8b0eeb931
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/885a929a4baa3d32ce354f4815476530122ff85d b/test/core/end2end/fuzzers/api_fuzzer_corpus/885a929a4baa3d32ce354f4815476530122ff85d
new file mode 100644
index 0000000000..d1e30ba888
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/885a929a4baa3d32ce354f4815476530122ff85d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8892fb3ac741bd31d9181ea72dd948e1ee0b1b21 b/test/core/end2end/fuzzers/api_fuzzer_corpus/8892fb3ac741bd31d9181ea72dd948e1ee0b1b21
new file mode 100644
index 0000000000..fe3155adf3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8892fb3ac741bd31d9181ea72dd948e1ee0b1b21
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/88cfd0e937486a6488e0e9f1fcd7ffeafcb4d6fb b/test/core/end2end/fuzzers/api_fuzzer_corpus/88cfd0e937486a6488e0e9f1fcd7ffeafcb4d6fb
new file mode 100644
index 0000000000..87d19743aa
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/88cfd0e937486a6488e0e9f1fcd7ffeafcb4d6fb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/89d8350297ce5dfc2a69e6e96afc86dba2bc3548 b/test/core/end2end/fuzzers/api_fuzzer_corpus/89d8350297ce5dfc2a69e6e96afc86dba2bc3548
new file mode 100644
index 0000000000..9674a2a26b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/89d8350297ce5dfc2a69e6e96afc86dba2bc3548
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8a93c1f4fb3540901374100ee96dfb892bbbd767 b/test/core/end2end/fuzzers/api_fuzzer_corpus/8a93c1f4fb3540901374100ee96dfb892bbbd767
new file mode 100644
index 0000000000..be3a387133
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8a93c1f4fb3540901374100ee96dfb892bbbd767
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8b00c51372acb33d4714fd7e012749bf44cf7b3b b/test/core/end2end/fuzzers/api_fuzzer_corpus/8b00c51372acb33d4714fd7e012749bf44cf7b3b
new file mode 100644
index 0000000000..b0f6f5b7be
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8b00c51372acb33d4714fd7e012749bf44cf7b3b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8b37d35809a85ae26de6537b3a48da7b7b62bea8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/8b37d35809a85ae26de6537b3a48da7b7b62bea8
new file mode 100644
index 0000000000..9ff455c9a3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8b37d35809a85ae26de6537b3a48da7b7b62bea8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/8d1242821c2d5fc81c8e0b397d91cf75cb1b5f2c b/test/core/end2end/fuzzers/api_fuzzer_corpus/8d1242821c2d5fc81c8e0b397d91cf75cb1b5f2c
new file mode 100644
index 0000000000..023bd1727e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/8d1242821c2d5fc81c8e0b397d91cf75cb1b5f2c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/904edc7bb14e4da0172f3d58a74c8abf141da9fb b/test/core/end2end/fuzzers/api_fuzzer_corpus/904edc7bb14e4da0172f3d58a74c8abf141da9fb
new file mode 100644
index 0000000000..678e8cc6c2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/904edc7bb14e4da0172f3d58a74c8abf141da9fb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/90a94b19bcf5aed7bfee94764acc906e889e47f8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/90a94b19bcf5aed7bfee94764acc906e889e47f8
new file mode 100644
index 0000000000..b3069df308
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/90a94b19bcf5aed7bfee94764acc906e889e47f8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/910246d4e894dbf88b09e9c1994e0f7bd563bcc5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/910246d4e894dbf88b09e9c1994e0f7bd563bcc5
new file mode 100644
index 0000000000..383ddbd06f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/910246d4e894dbf88b09e9c1994e0f7bd563bcc5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/913614cd0ae1b1210d2f1bc354b876080726f7a8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/913614cd0ae1b1210d2f1bc354b876080726f7a8
new file mode 100644
index 0000000000..bb417fce50
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/913614cd0ae1b1210d2f1bc354b876080726f7a8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/91434e8bf241b54d98e0f664a12ecf5c9d144a8d b/test/core/end2end/fuzzers/api_fuzzer_corpus/91434e8bf241b54d98e0f664a12ecf5c9d144a8d
new file mode 100644
index 0000000000..f13f5b9963
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/91434e8bf241b54d98e0f664a12ecf5c9d144a8d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9234bc18b3034e133fc3111f977f10d91f9d59b4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9234bc18b3034e133fc3111f977f10d91f9d59b4
new file mode 100644
index 0000000000..7960f625e1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9234bc18b3034e133fc3111f977f10d91f9d59b4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/92931bee49467ae7468775488a8c1651795f1b18 b/test/core/end2end/fuzzers/api_fuzzer_corpus/92931bee49467ae7468775488a8c1651795f1b18
new file mode 100644
index 0000000000..eb4a073f2e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/92931bee49467ae7468775488a8c1651795f1b18
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9597f6d2dbabda14eea4977e2156e3ace4ede00a b/test/core/end2end/fuzzers/api_fuzzer_corpus/9597f6d2dbabda14eea4977e2156e3ace4ede00a
new file mode 100644
index 0000000000..882e407524
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9597f6d2dbabda14eea4977e2156e3ace4ede00a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/982b2be980211b25a087a27ea5125f3788b5aa97 b/test/core/end2end/fuzzers/api_fuzzer_corpus/982b2be980211b25a087a27ea5125f3788b5aa97
new file mode 100644
index 0000000000..856cad5b8c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/982b2be980211b25a087a27ea5125f3788b5aa97
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9855bcd261c7b4e11d17bf4f7d4d527b53d3b71e b/test/core/end2end/fuzzers/api_fuzzer_corpus/9855bcd261c7b4e11d17bf4f7d4d527b53d3b71e
new file mode 100644
index 0000000000..1b46964d7a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9855bcd261c7b4e11d17bf4f7d4d527b53d3b71e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/99c05d9bb9dd3b8205330e5265bc7dd94bcf87de b/test/core/end2end/fuzzers/api_fuzzer_corpus/99c05d9bb9dd3b8205330e5265bc7dd94bcf87de
new file mode 100644
index 0000000000..64a7a100ee
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/99c05d9bb9dd3b8205330e5265bc7dd94bcf87de
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9af196d78bf8651de03ee495e4d115be490794cf b/test/core/end2end/fuzzers/api_fuzzer_corpus/9af196d78bf8651de03ee495e4d115be490794cf
new file mode 100644
index 0000000000..bb5e9beb58
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9af196d78bf8651de03ee495e4d115be490794cf
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9af5a1b29196f103190ab18c92704f7082c6b271 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9af5a1b29196f103190ab18c92704f7082c6b271
new file mode 100644
index 0000000000..508ebec117
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9af5a1b29196f103190ab18c92704f7082c6b271
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9b48fd4471f6d515bed4bffa94a639365d395b99 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9b48fd4471f6d515bed4bffa94a639365d395b99
new file mode 100644
index 0000000000..463512d3fe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9b48fd4471f6d515bed4bffa94a639365d395b99
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9bdad64c1862a8d642f398bf7bb62e22a1cd4270 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9bdad64c1862a8d642f398bf7bb62e22a1cd4270
new file mode 100644
index 0000000000..e93de73d28
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9bdad64c1862a8d642f398bf7bb62e22a1cd4270
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9db023b0a0d183149764d21e7f8b2b2990530848 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9db023b0a0d183149764d21e7f8b2b2990530848
new file mode 100644
index 0000000000..b24db3eb44
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9db023b0a0d183149764d21e7f8b2b2990530848
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9e8e83f61559c6dcc7e870f7ccb3ab13f1224229 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9e8e83f61559c6dcc7e870f7ccb3ab13f1224229
new file mode 100644
index 0000000000..c32a095630
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9e8e83f61559c6dcc7e870f7ccb3ab13f1224229
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9e92e4e30e68bf65fb59e9f34ed4967463212df9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/9e92e4e30e68bf65fb59e9f34ed4967463212df9
new file mode 100644
index 0000000000..5c88f5ee59
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9e92e4e30e68bf65fb59e9f34ed4967463212df9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9eeac17d6b28b8ab214d4164a49576ce500316dd b/test/core/end2end/fuzzers/api_fuzzer_corpus/9eeac17d6b28b8ab214d4164a49576ce500316dd
new file mode 100644
index 0000000000..2cec47ff1b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9eeac17d6b28b8ab214d4164a49576ce500316dd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9ef6a972458b736cdcb1b875bf896104b3a1c74c b/test/core/end2end/fuzzers/api_fuzzer_corpus/9ef6a972458b736cdcb1b875bf896104b3a1c74c
new file mode 100644
index 0000000000..2fd38f498a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9ef6a972458b736cdcb1b875bf896104b3a1c74c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/9fc918600ddb20914d93a0b979646b49530ce46d b/test/core/end2end/fuzzers/api_fuzzer_corpus/9fc918600ddb20914d93a0b979646b49530ce46d
new file mode 100644
index 0000000000..0566305cef
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/9fc918600ddb20914d93a0b979646b49530ce46d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a0290b63e02c1785b3cc80863343076a7f3e1a7b b/test/core/end2end/fuzzers/api_fuzzer_corpus/a0290b63e02c1785b3cc80863343076a7f3e1a7b
new file mode 100644
index 0000000000..0a9e0ef5a8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a0290b63e02c1785b3cc80863343076a7f3e1a7b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a083ea58077e52898ae8a9a4dedee4cf8de89229 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a083ea58077e52898ae8a9a4dedee4cf8de89229
new file mode 100644
index 0000000000..87c3df56f2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a083ea58077e52898ae8a9a4dedee4cf8de89229
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a1446ccd5f12ac05d1cd4fcbad5ce1d3a6cc7e96 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a1446ccd5f12ac05d1cd4fcbad5ce1d3a6cc7e96
new file mode 100644
index 0000000000..d2dfcc7804
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a1446ccd5f12ac05d1cd4fcbad5ce1d3a6cc7e96
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a2b9d39f9d1aa03f26b41f780c7a4f5ff826e6e1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a2b9d39f9d1aa03f26b41f780c7a4f5ff826e6e1
new file mode 100644
index 0000000000..d2e9966b38
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a2b9d39f9d1aa03f26b41f780c7a4f5ff826e6e1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a2eb6f5e20c5171e7144f177d296eb00181ce461 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a2eb6f5e20c5171e7144f177d296eb00181ce461
new file mode 100644
index 0000000000..0f8d768345
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a2eb6f5e20c5171e7144f177d296eb00181ce461
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a3469cc29207d27c818b2299bab7e7c5dde3ffaa b/test/core/end2end/fuzzers/api_fuzzer_corpus/a3469cc29207d27c818b2299bab7e7c5dde3ffaa
new file mode 100644
index 0000000000..45e17f5b7f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a3469cc29207d27c818b2299bab7e7c5dde3ffaa
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a3c40637baff1a88fe081a0768bfae5dc3942006 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a3c40637baff1a88fe081a0768bfae5dc3942006
new file mode 100644
index 0000000000..5bc6619b75
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a3c40637baff1a88fe081a0768bfae5dc3942006
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a404f3f4dbe1521cc977ed94ea50c49dbd6e32a2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a404f3f4dbe1521cc977ed94ea50c49dbd6e32a2
new file mode 100644
index 0000000000..00d6cb96a7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a404f3f4dbe1521cc977ed94ea50c49dbd6e32a2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a5089985010ccfa7630185464308aa5247f55de1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a5089985010ccfa7630185464308aa5247f55de1
new file mode 100644
index 0000000000..9a2d8e80c3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a5089985010ccfa7630185464308aa5247f55de1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a660e999019a7dd3e950b51d6fa8f453390fb504 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a660e999019a7dd3e950b51d6fa8f453390fb504
new file mode 100644
index 0000000000..0354317720
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a660e999019a7dd3e950b51d6fa8f453390fb504
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a675a6268dee809602632cddca94ea708473bba1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a675a6268dee809602632cddca94ea708473bba1
new file mode 100644
index 0000000000..279d9d141f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a675a6268dee809602632cddca94ea708473bba1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a736ade657d046ea859cf50fe1ef044e02ca38e5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a736ade657d046ea859cf50fe1ef044e02ca38e5
new file mode 100644
index 0000000000..bcdcc31d21
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a736ade657d046ea859cf50fe1ef044e02ca38e5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a85197b7cf312c8df9701404af23088f8681313d b/test/core/end2end/fuzzers/api_fuzzer_corpus/a85197b7cf312c8df9701404af23088f8681313d
new file mode 100644
index 0000000000..307fdb6d05
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a85197b7cf312c8df9701404af23088f8681313d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a89d59f59e43670ca3e8baf454fea723ae295653 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a89d59f59e43670ca3e8baf454fea723ae295653
new file mode 100644
index 0000000000..9aacad1cff
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a89d59f59e43670ca3e8baf454fea723ae295653
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a8be97dcf19ed2a7786763b4edfb48ca7f2790f6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a8be97dcf19ed2a7786763b4edfb48ca7f2790f6
new file mode 100644
index 0000000000..f5a9d6bf77
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a8be97dcf19ed2a7786763b4edfb48ca7f2790f6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a8c9f7043c578e48be49661be5207ceb9ec1b61f b/test/core/end2end/fuzzers/api_fuzzer_corpus/a8c9f7043c578e48be49661be5207ceb9ec1b61f
new file mode 100644
index 0000000000..5d6ce5b177
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a8c9f7043c578e48be49661be5207ceb9ec1b61f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/a9772b34aba5938ee56f517134db801a158f2849 b/test/core/end2end/fuzzers/api_fuzzer_corpus/a9772b34aba5938ee56f517134db801a158f2849
new file mode 100644
index 0000000000..e26aba71b9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/a9772b34aba5938ee56f517134db801a158f2849
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ab48d54113cb27083943467533d1872ec13da0e7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ab48d54113cb27083943467533d1872ec13da0e7
new file mode 100644
index 0000000000..6e7e2f2f6d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ab48d54113cb27083943467533d1872ec13da0e7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ac386c17e9e82472939d4052ff7959aeb1d5dea0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac386c17e9e82472939d4052ff7959aeb1d5dea0
new file mode 100644
index 0000000000..1b5056f1e9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac386c17e9e82472939d4052ff7959aeb1d5dea0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ac59c58dd4b05b6e3c4bae4db3b39f44d12a60db b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac59c58dd4b05b6e3c4bae4db3b39f44d12a60db
new file mode 100644
index 0000000000..222d80aea3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac59c58dd4b05b6e3c4bae4db3b39f44d12a60db
@@ -0,0 +1 @@
+ë \ No newline at end of file
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ac7b2971ff39a368145148524511dd68df83d522 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac7b2971ff39a368145148524511dd68df83d522
new file mode 100644
index 0000000000..3010cc7830
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ac7b2971ff39a368145148524511dd68df83d522
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/adf1ecc62e1089054db8af9e380cd77323b62970 b/test/core/end2end/fuzzers/api_fuzzer_corpus/adf1ecc62e1089054db8af9e380cd77323b62970
new file mode 100644
index 0000000000..58f024ac77
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/adf1ecc62e1089054db8af9e380cd77323b62970
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/aee8da0d3f1d4f3c54bfefb5d53df17c6740fb37 b/test/core/end2end/fuzzers/api_fuzzer_corpus/aee8da0d3f1d4f3c54bfefb5d53df17c6740fb37
new file mode 100644
index 0000000000..a0467c9954
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/aee8da0d3f1d4f3c54bfefb5d53df17c6740fb37
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/af321dcdfe085aae585cf48f59b51233b60df59b b/test/core/end2end/fuzzers/api_fuzzer_corpus/af321dcdfe085aae585cf48f59b51233b60df59b
new file mode 100644
index 0000000000..dd42bd9f84
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/af321dcdfe085aae585cf48f59b51233b60df59b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/afd047f5586f07990fa2efd6c67d3a7c55099c53 b/test/core/end2end/fuzzers/api_fuzzer_corpus/afd047f5586f07990fa2efd6c67d3a7c55099c53
new file mode 100644
index 0000000000..e29916e828
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/afd047f5586f07990fa2efd6c67d3a7c55099c53
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/afd6dab057fcf62e73429067d983a5f442f3a70e b/test/core/end2end/fuzzers/api_fuzzer_corpus/afd6dab057fcf62e73429067d983a5f442f3a70e
new file mode 100644
index 0000000000..6be4908444
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/afd6dab057fcf62e73429067d983a5f442f3a70e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b129aaeced0d135d8431960a3b3f85bef20f552b b/test/core/end2end/fuzzers/api_fuzzer_corpus/b129aaeced0d135d8431960a3b3f85bef20f552b
new file mode 100644
index 0000000000..11b84e619a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b129aaeced0d135d8431960a3b3f85bef20f552b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b2d1b3137b5ecdc255a76bf6206ed21ea927b6b0 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b2d1b3137b5ecdc255a76bf6206ed21ea927b6b0
new file mode 100644
index 0000000000..054a1def84
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b2d1b3137b5ecdc255a76bf6206ed21ea927b6b0
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b3776ef844b4910a2cd6d149dc13fb57bd523ac3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b3776ef844b4910a2cd6d149dc13fb57bd523ac3
new file mode 100644
index 0000000000..7ecb9e4847
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b3776ef844b4910a2cd6d149dc13fb57bd523ac3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b378146c4a1b41bd16319156c653534f1e391c7d b/test/core/end2end/fuzzers/api_fuzzer_corpus/b378146c4a1b41bd16319156c653534f1e391c7d
new file mode 100644
index 0000000000..6818b6fa33
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b378146c4a1b41bd16319156c653534f1e391c7d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b536cad032468c127123ee059efe977f7fe6894d b/test/core/end2end/fuzzers/api_fuzzer_corpus/b536cad032468c127123ee059efe977f7fe6894d
new file mode 100644
index 0000000000..6729d41487
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b536cad032468c127123ee059efe977f7fe6894d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b5efe698d1ee1d878ef6db9a19d5f7c951514fae b/test/core/end2end/fuzzers/api_fuzzer_corpus/b5efe698d1ee1d878ef6db9a19d5f7c951514fae
new file mode 100644
index 0000000000..58e369ee1f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b5efe698d1ee1d878ef6db9a19d5f7c951514fae
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b70abef1bf2c649cf31720136a099a88cff8d562 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b70abef1bf2c649cf31720136a099a88cff8d562
new file mode 100644
index 0000000000..d24d80ed32
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b70abef1bf2c649cf31720136a099a88cff8d562
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ad6cf88b52c0d558ef6a122c67b7807a659f36 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ad6cf88b52c0d558ef6a122c67b7807a659f36
new file mode 100644
index 0000000000..4f5834334a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ad6cf88b52c0d558ef6a122c67b7807a659f36
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ce7c97e81ecd2db09491172235b43340f4b352 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ce7c97e81ecd2db09491172235b43340f4b352
new file mode 100644
index 0000000000..df5aef3b4f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b7ce7c97e81ecd2db09491172235b43340f4b352
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b86f7032cb6eae67d834bde583597ba802f5d252 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b86f7032cb6eae67d834bde583597ba802f5d252
new file mode 100644
index 0000000000..95b0321922
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b86f7032cb6eae67d834bde583597ba802f5d252
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b8f18df0db1484d024e41f58d15e8afb710b35ee b/test/core/end2end/fuzzers/api_fuzzer_corpus/b8f18df0db1484d024e41f58d15e8afb710b35ee
new file mode 100644
index 0000000000..46d3d02787
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b8f18df0db1484d024e41f58d15e8afb710b35ee
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/b94cf6089a6e37c5aaac27741d61f71bbb7eeee7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/b94cf6089a6e37c5aaac27741d61f71bbb7eeee7
new file mode 100644
index 0000000000..6d39b17230
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/b94cf6089a6e37c5aaac27741d61f71bbb7eeee7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ba73b25c18f6fa6aeca8fca834852d3750b079d1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ba73b25c18f6fa6aeca8fca834852d3750b079d1
new file mode 100644
index 0000000000..e664af3dfd
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ba73b25c18f6fa6aeca8fca834852d3750b079d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ba8c20002a96d94f326dcc9a83c58241d35091c3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ba8c20002a96d94f326dcc9a83c58241d35091c3
new file mode 100644
index 0000000000..41a1b6684b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ba8c20002a96d94f326dcc9a83c58241d35091c3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/bab597264c721da916f0245906c4c471547aba89 b/test/core/end2end/fuzzers/api_fuzzer_corpus/bab597264c721da916f0245906c4c471547aba89
new file mode 100644
index 0000000000..e6b5a5340b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/bab597264c721da916f0245906c4c471547aba89
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/bae341809e6f5bfa1d24064e2d5adc2c793f4240 b/test/core/end2end/fuzzers/api_fuzzer_corpus/bae341809e6f5bfa1d24064e2d5adc2c793f4240
new file mode 100644
index 0000000000..6b24c09b08
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/bae341809e6f5bfa1d24064e2d5adc2c793f4240
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/bb36649f74dfe7113fd1391f24d490ceae8f9b21 b/test/core/end2end/fuzzers/api_fuzzer_corpus/bb36649f74dfe7113fd1391f24d490ceae8f9b21
new file mode 100644
index 0000000000..8bc9a9b833
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/bb36649f74dfe7113fd1391f24d490ceae8f9b21
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/bccdc1e95be1de56746e95d167a24ba805f9172a b/test/core/end2end/fuzzers/api_fuzzer_corpus/bccdc1e95be1de56746e95d167a24ba805f9172a
new file mode 100644
index 0000000000..d28de5065a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/bccdc1e95be1de56746e95d167a24ba805f9172a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/be53fc99a0c00fb2172b6960389a78b2e2a55b4c b/test/core/end2end/fuzzers/api_fuzzer_corpus/be53fc99a0c00fb2172b6960389a78b2e2a55b4c
new file mode 100644
index 0000000000..32fe875d90
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/be53fc99a0c00fb2172b6960389a78b2e2a55b4c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c059728bdb63747b6ebb3e345ac4c5ec5f8363af b/test/core/end2end/fuzzers/api_fuzzer_corpus/c059728bdb63747b6ebb3e345ac4c5ec5f8363af
new file mode 100644
index 0000000000..8ad5a94bb2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c059728bdb63747b6ebb3e345ac4c5ec5f8363af
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c08401badfe37023ba5e0e751d022616fcbefcbb b/test/core/end2end/fuzzers/api_fuzzer_corpus/c08401badfe37023ba5e0e751d022616fcbefcbb
new file mode 100644
index 0000000000..0403c89e0c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c08401badfe37023ba5e0e751d022616fcbefcbb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c2006fdf68d2a4cc0b31410d00e4dfca59315e85 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c2006fdf68d2a4cc0b31410d00e4dfca59315e85
new file mode 100644
index 0000000000..243f8bcb72
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c2006fdf68d2a4cc0b31410d00e4dfca59315e85
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c200cd4190048ba3b72b76274b2976b04110efc9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c200cd4190048ba3b72b76274b2976b04110efc9
new file mode 100644
index 0000000000..7f2e81e779
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c200cd4190048ba3b72b76274b2976b04110efc9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c27d7d33b13570c014385799dddf1d8805fc1735 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c27d7d33b13570c014385799dddf1d8805fc1735
new file mode 100644
index 0000000000..b8b2b7e3c1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c27d7d33b13570c014385799dddf1d8805fc1735
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c39dab787a7c73972a3cbd69fef3775f55c90639 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c39dab787a7c73972a3cbd69fef3775f55c90639
new file mode 100644
index 0000000000..ae586b37cd
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c39dab787a7c73972a3cbd69fef3775f55c90639
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c467053b901e28634f7e7891ea361961d94b097b b/test/core/end2end/fuzzers/api_fuzzer_corpus/c467053b901e28634f7e7891ea361961d94b097b
new file mode 100644
index 0000000000..d224342f3e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c467053b901e28634f7e7891ea361961d94b097b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c54b7c1255412a6d4e9608d14fbdb235a7a86d9d b/test/core/end2end/fuzzers/api_fuzzer_corpus/c54b7c1255412a6d4e9608d14fbdb235a7a86d9d
new file mode 100644
index 0000000000..6afe2ffe51
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c54b7c1255412a6d4e9608d14fbdb235a7a86d9d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c5590a6799d6633ba08cc1f75e1a7d0a54d37e68 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5590a6799d6633ba08cc1f75e1a7d0a54d37e68
new file mode 100644
index 0000000000..bf5354659b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5590a6799d6633ba08cc1f75e1a7d0a54d37e68
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c58819f4e12e3ee2ce3adb89b6f93567db2d5c8a b/test/core/end2end/fuzzers/api_fuzzer_corpus/c58819f4e12e3ee2ce3adb89b6f93567db2d5c8a
new file mode 100644
index 0000000000..7efdb3cbc8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c58819f4e12e3ee2ce3adb89b6f93567db2d5c8a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c5dbc50d9174bde5542b2bb18c63f6583a23ff13 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5dbc50d9174bde5542b2bb18c63f6583a23ff13
new file mode 100644
index 0000000000..5ca351764e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5dbc50d9174bde5542b2bb18c63f6583a23ff13
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f36039c543bb52b1b2ad235934790c4c34dccd b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f36039c543bb52b1b2ad235934790c4c34dccd
new file mode 100644
index 0000000000..1eca7b3e24
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f36039c543bb52b1b2ad235934790c4c34dccd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f3e7e54fb624b5f5436e1101fb8dd74d2dac19 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f3e7e54fb624b5f5436e1101fb8dd74d2dac19
new file mode 100644
index 0000000000..4beefe1716
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c5f3e7e54fb624b5f5436e1101fb8dd74d2dac19
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c604f2a6f2a3c2f38e8cf0ce99c78e2750a83454 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c604f2a6f2a3c2f38e8cf0ce99c78e2750a83454
new file mode 100644
index 0000000000..0420324d5c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c604f2a6f2a3c2f38e8cf0ce99c78e2750a83454
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c60e077197a6659e362fba14ff9e4eacee647674 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c60e077197a6659e362fba14ff9e4eacee647674
new file mode 100644
index 0000000000..9b79bf917e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c60e077197a6659e362fba14ff9e4eacee647674
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c649b5285bd40e0614cb8b8b4001b80c3d3cb4a5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c649b5285bd40e0614cb8b8b4001b80c3d3cb4a5
new file mode 100644
index 0000000000..c068317756
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c649b5285bd40e0614cb8b8b4001b80c3d3cb4a5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c6932577ed27915bf469939c61b1283354308a68 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c6932577ed27915bf469939c61b1283354308a68
new file mode 100644
index 0000000000..10878a8867
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c6932577ed27915bf469939c61b1283354308a68
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c8ccc96fa43f1446ca99e81e7440a3542b3a6ee2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8ccc96fa43f1446ca99e81e7440a3542b3a6ee2
new file mode 100644
index 0000000000..4d384388a3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8ccc96fa43f1446ca99e81e7440a3542b3a6ee2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e01950d56d7c8d08a5cce94c6306c03a135219 b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e01950d56d7c8d08a5cce94c6306c03a135219
new file mode 100644
index 0000000000..668f27280b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e01950d56d7c8d08a5cce94c6306c03a135219
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e12ea9590ffbf0d6a10a582338856fa217ff6d b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e12ea9590ffbf0d6a10a582338856fa217ff6d
new file mode 100644
index 0000000000..59fa524f11
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c8e12ea9590ffbf0d6a10a582338856fa217ff6d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/c90aaaf79d46aeaf533e62dab54506d8ab2a3e5f b/test/core/end2end/fuzzers/api_fuzzer_corpus/c90aaaf79d46aeaf533e62dab54506d8ab2a3e5f
new file mode 100644
index 0000000000..2fc14daec9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/c90aaaf79d46aeaf533e62dab54506d8ab2a3e5f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ca54a837cfaf7edc71961ff1fe52d4c3cd86675e b/test/core/end2end/fuzzers/api_fuzzer_corpus/ca54a837cfaf7edc71961ff1fe52d4c3cd86675e
new file mode 100644
index 0000000000..4ee9fbce3c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ca54a837cfaf7edc71961ff1fe52d4c3cd86675e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cae359a6dabcf11786350360c2cd2aebf0b7a094 b/test/core/end2end/fuzzers/api_fuzzer_corpus/cae359a6dabcf11786350360c2cd2aebf0b7a094
new file mode 100644
index 0000000000..e087ae9c90
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cae359a6dabcf11786350360c2cd2aebf0b7a094
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cba1122fd86ce20b417cb34edc294f19f1303faa b/test/core/end2end/fuzzers/api_fuzzer_corpus/cba1122fd86ce20b417cb34edc294f19f1303faa
new file mode 100644
index 0000000000..c108108ae2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cba1122fd86ce20b417cb34edc294f19f1303faa
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cbace6de751ef04cd6c12f74f37c5bb3e3b0b219 b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbace6de751ef04cd6c12f74f37c5bb3e3b0b219
new file mode 100644
index 0000000000..d6644837c2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbace6de751ef04cd6c12f74f37c5bb3e3b0b219
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cbd7f8b4148a1cac0c012afd3c73baade2dc572c b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbd7f8b4148a1cac0c012afd3c73baade2dc572c
new file mode 100644
index 0000000000..d7b13af8ef
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbd7f8b4148a1cac0c012afd3c73baade2dc572c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cbde71efff4119c58459a93b2e1692182521b960 b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbde71efff4119c58459a93b2e1692182521b960
new file mode 100644
index 0000000000..8e2bde7965
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cbde71efff4119c58459a93b2e1692182521b960
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cc1b857893cf971cf7783d53d25693e642b03eff b/test/core/end2end/fuzzers/api_fuzzer_corpus/cc1b857893cf971cf7783d53d25693e642b03eff
new file mode 100644
index 0000000000..9e76df81dd
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cc1b857893cf971cf7783d53d25693e642b03eff
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cd5982304e5979e6056a77c4053b232e0963e0e5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/cd5982304e5979e6056a77c4053b232e0963e0e5
new file mode 100644
index 0000000000..6cbfa3742a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cd5982304e5979e6056a77c4053b232e0963e0e5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ce72561eada7f9b9e8b0f0e658ccebb4f5b983d6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ce72561eada7f9b9e8b0f0e658ccebb4f5b983d6
new file mode 100644
index 0000000000..b3cc41b46a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ce72561eada7f9b9e8b0f0e658ccebb4f5b983d6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ce95d2fc5b099365cd781aa7e2b297ac92a215b3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ce95d2fc5b099365cd781aa7e2b297ac92a215b3
new file mode 100644
index 0000000000..8b87565221
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ce95d2fc5b099365cd781aa7e2b297ac92a215b3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/cf3fd86be6611e52e7a3faefd2d1e0082c3a8859 b/test/core/end2end/fuzzers/api_fuzzer_corpus/cf3fd86be6611e52e7a3faefd2d1e0082c3a8859
new file mode 100644
index 0000000000..c7f79aa7a2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/cf3fd86be6611e52e7a3faefd2d1e0082c3a8859
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0597bbdd657fa4ed14443994c9147a1a7bbc205f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0597bbdd657fa4ed14443994c9147a1a7bbc205f
new file mode 100644
index 0000000000..732f3d7297
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0597bbdd657fa4ed14443994c9147a1a7bbc205f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0f6e7b5dd0ad53297bd9daa497dbf851b5385b16 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0f6e7b5dd0ad53297bd9daa497dbf851b5385b16
new file mode 100644
index 0000000000..db9e033743
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-0f6e7b5dd0ad53297bd9daa497dbf851b5385b16
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-113a1e09a1c0787f1be875c6cdcf4415f8155ee3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-113a1e09a1c0787f1be875c6cdcf4415f8155ee3
new file mode 100644
index 0000000000..b1dbcfac7a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-113a1e09a1c0787f1be875c6cdcf4415f8155ee3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-168a72ed6115591c637fe99f50cac5e6bf7ded79 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-168a72ed6115591c637fe99f50cac5e6bf7ded79
new file mode 100644
index 0000000000..f8c164a8d4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-168a72ed6115591c637fe99f50cac5e6bf7ded79
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17ad251e24eaa152ded652bfe04d656fdcad28c4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17ad251e24eaa152ded652bfe04d656fdcad28c4
new file mode 100644
index 0000000000..094f82a0b4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17ad251e24eaa152ded652bfe04d656fdcad28c4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17c0775f8b51f7b8742602e4321ac5827e64e3eb b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17c0775f8b51f7b8742602e4321ac5827e64e3eb
new file mode 100644
index 0000000000..04c21e0fba
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-17c0775f8b51f7b8742602e4321ac5827e64e3eb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-1bf04a83c67f216c7643d69677da5e6cbc708d88 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-1bf04a83c67f216c7643d69677da5e6cbc708d88
new file mode 100644
index 0000000000..3b36cb8a1e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-1bf04a83c67f216c7643d69677da5e6cbc708d88
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-23a35ebad0178cc632fd62f6852d2f6fa5d1fe32 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-23a35ebad0178cc632fd62f6852d2f6fa5d1fe32
new file mode 100644
index 0000000000..e487b5f04a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-23a35ebad0178cc632fd62f6852d2f6fa5d1fe32
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-24bb600e0530fcce70d21fece0cd70056ed8a6b9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-24bb600e0530fcce70d21fece0cd70056ed8a6b9
new file mode 100644
index 0000000000..399a5afac5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-24bb600e0530fcce70d21fece0cd70056ed8a6b9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-278279ec7b937b1c944029bc57ae0ff0fbb13415 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-278279ec7b937b1c944029bc57ae0ff0fbb13415
new file mode 100644
index 0000000000..2574788990
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-278279ec7b937b1c944029bc57ae0ff0fbb13415
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-2cc124fe461b11185467384aebe18711f28bcfb7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-2cc124fe461b11185467384aebe18711f28bcfb7
new file mode 100644
index 0000000000..8606eec49c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-2cc124fe461b11185467384aebe18711f28bcfb7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-3699c47aaa794b48df814bd3b5a982c377063bc7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-3699c47aaa794b48df814bd3b5a982c377063bc7
new file mode 100644
index 0000000000..3807931fba
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-3699c47aaa794b48df814bd3b5a982c377063bc7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-404a40c85b887a53235484f4620da325872eca49 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-404a40c85b887a53235484f4620da325872eca49
new file mode 100644
index 0000000000..c98b973303
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-404a40c85b887a53235484f4620da325872eca49
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4195e7f3655955a8b386d1b17ab855c08ebec548 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4195e7f3655955a8b386d1b17ab855c08ebec548
new file mode 100644
index 0000000000..c39d4fc948
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4195e7f3655955a8b386d1b17ab855c08ebec548
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-41ad52e1376596e9ac3c22be039975e223645b4a b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-41ad52e1376596e9ac3c22be039975e223645b4a
new file mode 100644
index 0000000000..350e1fa2bb
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-41ad52e1376596e9ac3c22be039975e223645b4a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-42d2e80906545a50b4b5b37278132b764296c031 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-42d2e80906545a50b4b5b37278132b764296c031
new file mode 100644
index 0000000000..82de2d57ba
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-42d2e80906545a50b4b5b37278132b764296c031
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-43f9633b24fd27f1bbe8884ec506197e52001797 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-43f9633b24fd27f1bbe8884ec506197e52001797
new file mode 100644
index 0000000000..27072f6757
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-43f9633b24fd27f1bbe8884ec506197e52001797
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-454e9d66253c206916e1bea69bdaabd8bb8c982c b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-454e9d66253c206916e1bea69bdaabd8bb8c982c
new file mode 100644
index 0000000000..7862116a09
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-454e9d66253c206916e1bea69bdaabd8bb8c982c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-497e1c1554a8e021ba6c02ffdd2a4d809669c60f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-497e1c1554a8e021ba6c02ffdd2a4d809669c60f
new file mode 100644
index 0000000000..6d74b04504
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-497e1c1554a8e021ba6c02ffdd2a4d809669c60f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-49c4f247eb2aaa8f4474aec363e203e557948bc2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-49c4f247eb2aaa8f4474aec363e203e557948bc2
new file mode 100644
index 0000000000..e34de16ff9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-49c4f247eb2aaa8f4474aec363e203e557948bc2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4af36327fb381a5e5af2072f038a10e36368bdd3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4af36327fb381a5e5af2072f038a10e36368bdd3
new file mode 100644
index 0000000000..9e82d231e5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4af36327fb381a5e5af2072f038a10e36368bdd3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4d51faa099fbe0900fcf30461a6be12dc80dde16 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4d51faa099fbe0900fcf30461a6be12dc80dde16
new file mode 100644
index 0000000000..9add789db8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4d51faa099fbe0900fcf30461a6be12dc80dde16
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e19149430212fc0ed7be30854bfe538572d33b6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e19149430212fc0ed7be30854bfe538572d33b6
new file mode 100644
index 0000000000..4bcca63342
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e19149430212fc0ed7be30854bfe538572d33b6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e297b6205976cf94c8ccbcbf12277efb8ade986 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e297b6205976cf94c8ccbcbf12277efb8ade986
new file mode 100644
index 0000000000..e46a2e5f2e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e297b6205976cf94c8ccbcbf12277efb8ade986
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e6ec3d9abdaf620dad4cd2f2c206c29e8d9ecc8 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e6ec3d9abdaf620dad4cd2f2c206c29e8d9ecc8
new file mode 100644
index 0000000000..f1279e3934
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4e6ec3d9abdaf620dad4cd2f2c206c29e8d9ecc8
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-50e18d167be26c8e19877d88e9b53591f4c8b029 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-50e18d167be26c8e19877d88e9b53591f4c8b029
new file mode 100644
index 0000000000..51f182dc81
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-50e18d167be26c8e19877d88e9b53591f4c8b029
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5827f4af3145108483e4f410e1427e7a41c4d3cc b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5827f4af3145108483e4f410e1427e7a41c4d3cc
new file mode 100644
index 0000000000..e38f09594d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5827f4af3145108483e4f410e1427e7a41c4d3cc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5854cfbb68190f86a40492c5ca8e15c0fc062168 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5854cfbb68190f86a40492c5ca8e15c0fc062168
new file mode 100644
index 0000000000..75807455e9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5854cfbb68190f86a40492c5ca8e15c0fc062168
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59e58120d4f37a833a79e68372c4eaf361a92240 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59e58120d4f37a833a79e68372c4eaf361a92240
new file mode 100644
index 0000000000..6b847ae3a4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59e58120d4f37a833a79e68372c4eaf361a92240
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59f857e19c386154d65c48a72cf1e4e69aefd1ba b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59f857e19c386154d65c48a72cf1e4e69aefd1ba
new file mode 100644
index 0000000000..e99f2f9ffa
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-59f857e19c386154d65c48a72cf1e4e69aefd1ba
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5ba35fa4177ca59450b597dd1a2d48f8a68959dd b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5ba35fa4177ca59450b597dd1a2d48f8a68959dd
new file mode 100644
index 0000000000..d52c7a0326
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5ba35fa4177ca59450b597dd1a2d48f8a68959dd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5c52df7b4025baa05218c14a3cd535914445c42f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5c52df7b4025baa05218c14a3cd535914445c42f
new file mode 100644
index 0000000000..22efd27721
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-5c52df7b4025baa05218c14a3cd535914445c42f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-603222da20c147a532188e80fc1a26e4e8bc4bee b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-603222da20c147a532188e80fc1a26e4e8bc4bee
new file mode 100644
index 0000000000..d0bd7a775b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-603222da20c147a532188e80fc1a26e4e8bc4bee
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f1b8715edddbf0aa17fe9ee0fbf02ff7c92807c b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f1b8715edddbf0aa17fe9ee0fbf02ff7c92807c
new file mode 100644
index 0000000000..900f95b520
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f1b8715edddbf0aa17fe9ee0fbf02ff7c92807c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f5c899196cb31232d2d6694be43e1ac0a662f48 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f5c899196cb31232d2d6694be43e1ac0a662f48
new file mode 100644
index 0000000000..d872203981
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6f5c899196cb31232d2d6694be43e1ac0a662f48
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6fad807070626f184704ea082667ebe780369f74 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6fad807070626f184704ea082667ebe780369f74
new file mode 100644
index 0000000000..a0b75268b5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-6fad807070626f184704ea082667ebe780369f74
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-775a43af5d81808d1ccbcc43aec12ce14aed8a53 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-775a43af5d81808d1ccbcc43aec12ce14aed8a53
new file mode 100644
index 0000000000..5fddb86269
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-775a43af5d81808d1ccbcc43aec12ce14aed8a53
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-787fc772315a87e40b63fbc25fb703a87581f0e7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-787fc772315a87e40b63fbc25fb703a87581f0e7
new file mode 100644
index 0000000000..75e0c393a9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-787fc772315a87e40b63fbc25fb703a87581f0e7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7a4ce28ac085ce3763fe91e24bdd92914d134a3f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7a4ce28ac085ce3763fe91e24bdd92914d134a3f
new file mode 100644
index 0000000000..a80b1b3dc9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7a4ce28ac085ce3763fe91e24bdd92914d134a3f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7c6eb73a27b693a346f309370e965d0d62048503 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7c6eb73a27b693a346f309370e965d0d62048503
new file mode 100644
index 0000000000..49da3aaeed
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7c6eb73a27b693a346f309370e965d0d62048503
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7dd4bf6d825fb4e9a43506aff001119c7e8f00ac b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7dd4bf6d825fb4e9a43506aff001119c7e8f00ac
new file mode 100644
index 0000000000..2c13d8aeae
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-7dd4bf6d825fb4e9a43506aff001119c7e8f00ac
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-83f6929c001d26c25c5d0f63ba0bcc099b9959bc b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-83f6929c001d26c25c5d0f63ba0bcc099b9959bc
new file mode 100644
index 0000000000..2e0f1ef5c0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-83f6929c001d26c25c5d0f63ba0bcc099b9959bc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-85fd89292e43c2a2338f86e46d10fffb6f85ed88 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-85fd89292e43c2a2338f86e46d10fffb6f85ed88
new file mode 100644
index 0000000000..9ec9583b27
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-85fd89292e43c2a2338f86e46d10fffb6f85ed88
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-864c58c601ce89a5191fc6e665dff0812a6e4bfb b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-864c58c601ce89a5191fc6e665dff0812a6e4bfb
new file mode 100644
index 0000000000..6bcdf2b2bc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-864c58c601ce89a5191fc6e665dff0812a6e4bfb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-8c44d14673d21592ff930297b2307096d9f7136f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-8c44d14673d21592ff930297b2307096d9f7136f
new file mode 100644
index 0000000000..8e4a94fb68
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-8c44d14673d21592ff930297b2307096d9f7136f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9137b1dc16097e720a1837a2117f43b940180f3d b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9137b1dc16097e720a1837a2117f43b940180f3d
new file mode 100644
index 0000000000..15887c72ac
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9137b1dc16097e720a1837a2117f43b940180f3d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-91964f1b7d1bc2460d93775fb64c7e6f737ce634 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-91964f1b7d1bc2460d93775fb64c7e6f737ce634
new file mode 100644
index 0000000000..954e121e64
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-91964f1b7d1bc2460d93775fb64c7e6f737ce634
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-949b13ffa41b1c202fd74d4c9cd45e840aa9d0f6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-949b13ffa41b1c202fd74d4c9cd45e840aa9d0f6
new file mode 100644
index 0000000000..3138357906
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-949b13ffa41b1c202fd74d4c9cd45e840aa9d0f6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-95e740aca3d281f30929d51a628cdfab4ca863ad b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-95e740aca3d281f30929d51a628cdfab4ca863ad
new file mode 100644
index 0000000000..780a4c5778
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-95e740aca3d281f30929d51a628cdfab4ca863ad
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9b205954747d5f120b36e004116fa2fe22cd5105 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9b205954747d5f120b36e004116fa2fe22cd5105
new file mode 100644
index 0000000000..26897a6407
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9b205954747d5f120b36e004116fa2fe22cd5105
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9c2cf43a9cdba7a35485fadb0b0424a88f7d7b8a b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9c2cf43a9cdba7a35485fadb0b0424a88f7d7b8a
new file mode 100644
index 0000000000..9b6561d709
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9c2cf43a9cdba7a35485fadb0b0424a88f7d7b8a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9f50180d69973cd2187ecba50fc2894edf6a341e b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9f50180d69973cd2187ecba50fc2894edf6a341e
new file mode 100644
index 0000000000..57ab601e33
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9f50180d69973cd2187ecba50fc2894edf6a341e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9fd80ce4eeb83cdea4eedd9995ffc53d640e692e b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9fd80ce4eeb83cdea4eedd9995ffc53d640e692e
new file mode 100644
index 0000000000..9787e4a89a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-9fd80ce4eeb83cdea4eedd9995ffc53d640e692e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a15f2c17a8fa204f3183fd7422876f28ef7c85ee b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a15f2c17a8fa204f3183fd7422876f28ef7c85ee
new file mode 100644
index 0000000000..89774f834d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a15f2c17a8fa204f3183fd7422876f28ef7c85ee
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a21d5f69a1433ba0580840405fbd66f3b3569104 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a21d5f69a1433ba0580840405fbd66f3b3569104
new file mode 100644
index 0000000000..98e5ec09c3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a21d5f69a1433ba0580840405fbd66f3b3569104
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a2ff9a686f9775c715870fa2f25b600471ca8c01 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a2ff9a686f9775c715870fa2f25b600471ca8c01
new file mode 100644
index 0000000000..476d0c0ccc
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a2ff9a686f9775c715870fa2f25b600471ca8c01
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a6ec7e9fef2e54036de257f5e7da3e87ea1f39f2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a6ec7e9fef2e54036de257f5e7da3e87ea1f39f2
new file mode 100644
index 0000000000..be3d8b3f06
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a6ec7e9fef2e54036de257f5e7da3e87ea1f39f2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ab3ecf04012140fdabae0d037189eedb24516d04 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ab3ecf04012140fdabae0d037189eedb24516d04
new file mode 100644
index 0000000000..2dd5eaf11c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ab3ecf04012140fdabae0d037189eedb24516d04
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b39ce8e62e5c9e046d67e946436609e01f067a53 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b39ce8e62e5c9e046d67e946436609e01f067a53
new file mode 100644
index 0000000000..d934685765
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b39ce8e62e5c9e046d67e946436609e01f067a53
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b479e66d221f3db92c31b6b6aace69599f648d51 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b479e66d221f3db92c31b6b6aace69599f648d51
new file mode 100644
index 0000000000..6f425b4456
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-b479e66d221f3db92c31b6b6aace69599f648d51
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-bd17ab1e7e9328739f455641e8dfa11951ac742a b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-bd17ab1e7e9328739f455641e8dfa11951ac742a
new file mode 100644
index 0000000000..1fcbbb7bed
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-bd17ab1e7e9328739f455641e8dfa11951ac742a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c0413dd6857d1ed3e5484df5e70656356f3c997a b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c0413dd6857d1ed3e5484df5e70656356f3c997a
new file mode 100644
index 0000000000..b043fc5872
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c0413dd6857d1ed3e5484df5e70656356f3c997a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c1a4c1aa8b4f1b081993f93ca92a1136a7302be5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c1a4c1aa8b4f1b081993f93ca92a1136a7302be5
new file mode 100644
index 0000000000..4fcb303ef2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c1a4c1aa8b4f1b081993f93ca92a1136a7302be5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c42d2add77ba492df95cfaf2e4e08e56818368ce b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c42d2add77ba492df95cfaf2e4e08e56818368ce
new file mode 100644
index 0000000000..e7c8586db6
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-c42d2add77ba492df95cfaf2e4e08e56818368ce
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ccb9f8221fd8fcacc5fb4a3c251fc06104027ddd b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ccb9f8221fd8fcacc5fb4a3c251fc06104027ddd
new file mode 100644
index 0000000000..45451fc0b2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ccb9f8221fd8fcacc5fb4a3c251fc06104027ddd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d5b0e587cafc10b7878bc691b6fcb7c1164e7558 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d5b0e587cafc10b7878bc691b6fcb7c1164e7558
new file mode 100644
index 0000000000..4c7441aca0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d5b0e587cafc10b7878bc691b6fcb7c1164e7558
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d61454675241d9df9049f5bd57f47326059d7132 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d61454675241d9df9049f5bd57f47326059d7132
new file mode 100644
index 0000000000..fd174ab11c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-d61454675241d9df9049f5bd57f47326059d7132
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ddac3b604ee6d4a51161a267b688a3b72fb6768d b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ddac3b604ee6d4a51161a267b688a3b72fb6768d
new file mode 100644
index 0000000000..8fb1727e67
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ddac3b604ee6d4a51161a267b688a3b72fb6768d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-decf36e136646eb3ab44fc4c5f327ccd99ddea88 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-decf36e136646eb3ab44fc4c5f327ccd99ddea88
new file mode 100644
index 0000000000..ce11954e69
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-decf36e136646eb3ab44fc4c5f327ccd99ddea88
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-e4d4b51cc7731d12daee738c4b81158a03302ebb b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-e4d4b51cc7731d12daee738c4b81158a03302ebb
new file mode 100644
index 0000000000..644fa899a3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-e4d4b51cc7731d12daee738c4b81158a03302ebb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eb5d258a429fa9c20f8513211a33100abd5f8f3f b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eb5d258a429fa9c20f8513211a33100abd5f8f3f
new file mode 100644
index 0000000000..b37ce7a2ef
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eb5d258a429fa9c20f8513211a33100abd5f8f3f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ee032544a2c1487469cc17f870043f4d513999f7 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ee032544a2c1487469cc17f870043f4d513999f7
new file mode 100644
index 0000000000..75813f9c7e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-ee032544a2c1487469cc17f870043f4d513999f7
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eec019a7a40f5d8f8c0e9c72215286f442a9b150 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eec019a7a40f5d8f8c0e9c72215286f442a9b150
new file mode 100644
index 0000000000..1845b7260b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-eec019a7a40f5d8f8c0e9c72215286f442a9b150
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-f0c7e2cc8f8587bcab636a63191b2fd37e0cf8ae b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-f0c7e2cc8f8587bcab636a63191b2fd37e0cf8ae
new file mode 100644
index 0000000000..5f3bc3a090
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-f0c7e2cc8f8587bcab636a63191b2fd37e0cf8ae
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-fc088cee74d4e8dd791291b5575fc0fe9fe7378d b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-fc088cee74d4e8dd791291b5575fc0fe9fe7378d
new file mode 100644
index 0000000000..3fe07f3527
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-fc088cee74d4e8dd791291b5575fc0fe9fe7378d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d0541179f78beb9037070ca52969526b83eb608a b/test/core/end2end/fuzzers/api_fuzzer_corpus/d0541179f78beb9037070ca52969526b83eb608a
new file mode 100644
index 0000000000..b778596db9
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d0541179f78beb9037070ca52969526b83eb608a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d05a854e44c9c6f0dd0c58e6bd305e6fe48c32f5 b/test/core/end2end/fuzzers/api_fuzzer_corpus/d05a854e44c9c6f0dd0c58e6bd305e6fe48c32f5
new file mode 100644
index 0000000000..6574cb33de
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d05a854e44c9c6f0dd0c58e6bd305e6fe48c32f5
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d2a63dcb354906d4d67104ba2a1f5e97a6196183 b/test/core/end2end/fuzzers/api_fuzzer_corpus/d2a63dcb354906d4d67104ba2a1f5e97a6196183
new file mode 100644
index 0000000000..6f8a3a80cb
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d2a63dcb354906d4d67104ba2a1f5e97a6196183
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d33e33320e5165dac72007845a86a9709d75c42e b/test/core/end2end/fuzzers/api_fuzzer_corpus/d33e33320e5165dac72007845a86a9709d75c42e
new file mode 100644
index 0000000000..23292b2d33
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d33e33320e5165dac72007845a86a9709d75c42e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d48c4a56dc90b16a14dbf9934fc3ce7c9706104e b/test/core/end2end/fuzzers/api_fuzzer_corpus/d48c4a56dc90b16a14dbf9934fc3ce7c9706104e
new file mode 100644
index 0000000000..4546c96ff2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d48c4a56dc90b16a14dbf9934fc3ce7c9706104e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d4a7be7c4a826d8151d5d7c1c781143baf90ff28 b/test/core/end2end/fuzzers/api_fuzzer_corpus/d4a7be7c4a826d8151d5d7c1c781143baf90ff28
new file mode 100644
index 0000000000..65d4c4b5d5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d4a7be7c4a826d8151d5d7c1c781143baf90ff28
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d53b67bdedf136125bbee00d136720efa23898dc b/test/core/end2end/fuzzers/api_fuzzer_corpus/d53b67bdedf136125bbee00d136720efa23898dc
new file mode 100644
index 0000000000..f5eeffdfb2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d53b67bdedf136125bbee00d136720efa23898dc
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d63dab7d78a0a58c37631e488b1eeb7c2bb67e34 b/test/core/end2end/fuzzers/api_fuzzer_corpus/d63dab7d78a0a58c37631e488b1eeb7c2bb67e34
new file mode 100644
index 0000000000..02c478367a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d63dab7d78a0a58c37631e488b1eeb7c2bb67e34
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d73ee327123be0e9bc72485b5517dd1bf691e249 b/test/core/end2end/fuzzers/api_fuzzer_corpus/d73ee327123be0e9bc72485b5517dd1bf691e249
new file mode 100644
index 0000000000..6e8dcbe5c8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d73ee327123be0e9bc72485b5517dd1bf691e249
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/d7e298c12f97064ebe494593ecbe26df96f7f84d b/test/core/end2end/fuzzers/api_fuzzer_corpus/d7e298c12f97064ebe494593ecbe26df96f7f84d
new file mode 100644
index 0000000000..0efac7621a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/d7e298c12f97064ebe494593ecbe26df96f7f84d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dc6db500586253e4b9b0adeb20214327990d790d b/test/core/end2end/fuzzers/api_fuzzer_corpus/dc6db500586253e4b9b0adeb20214327990d790d
new file mode 100644
index 0000000000..752fbb77b1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dc6db500586253e4b9b0adeb20214327990d790d
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dcb9a8007d2693d35911dfcde7ae960adbeb2601 b/test/core/end2end/fuzzers/api_fuzzer_corpus/dcb9a8007d2693d35911dfcde7ae960adbeb2601
new file mode 100644
index 0000000000..871b65b4db
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dcb9a8007d2693d35911dfcde7ae960adbeb2601
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dcf71fe33130be78708d234005f8bb4f4b06d75c b/test/core/end2end/fuzzers/api_fuzzer_corpus/dcf71fe33130be78708d234005f8bb4f4b06d75c
new file mode 100644
index 0000000000..82f021c0e7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dcf71fe33130be78708d234005f8bb4f4b06d75c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dd19b226a1c60dceee7e656cee561b4acfe77aee b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd19b226a1c60dceee7e656cee561b4acfe77aee
new file mode 100644
index 0000000000..f6c431c387
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd19b226a1c60dceee7e656cee561b4acfe77aee
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dd6d1ddb251fc3574733232c4a85dabdcf60d4c3 b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd6d1ddb251fc3574733232c4a85dabdcf60d4c3
new file mode 100644
index 0000000000..af0cdd88b0
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd6d1ddb251fc3574733232c4a85dabdcf60d4c3
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8989a51df53e6f0a59959a8b5ad411c9fa0ba2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8989a51df53e6f0a59959a8b5ad411c9fa0ba2
new file mode 100644
index 0000000000..aee842e90b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8989a51df53e6f0a59959a8b5ad411c9fa0ba2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8c099f1687f8b0581481a75f8844f6118d4a66 b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8c099f1687f8b0581481a75f8844f6118d4a66
new file mode 100644
index 0000000000..ab89806234
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dd8c099f1687f8b0581481a75f8844f6118d4a66
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/de0f7b6518fb5dd14f29ec66dddc5af50370b3fa b/test/core/end2end/fuzzers/api_fuzzer_corpus/de0f7b6518fb5dd14f29ec66dddc5af50370b3fa
new file mode 100644
index 0000000000..91187e4c02
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/de0f7b6518fb5dd14f29ec66dddc5af50370b3fa
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dec7ea8faa2bbbbada2adc0a9e52d0335004869f b/test/core/end2end/fuzzers/api_fuzzer_corpus/dec7ea8faa2bbbbada2adc0a9e52d0335004869f
new file mode 100644
index 0000000000..5a7a5bc425
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dec7ea8faa2bbbbada2adc0a9e52d0335004869f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/df272aa4f3370128af034e7f5dd1524246b72d83 b/test/core/end2end/fuzzers/api_fuzzer_corpus/df272aa4f3370128af034e7f5dd1524246b72d83
new file mode 100644
index 0000000000..978b8c9842
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/df272aa4f3370128af034e7f5dd1524246b72d83
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dfb8a3c29f657d533b0d940ffefe599cdb85120f b/test/core/end2end/fuzzers/api_fuzzer_corpus/dfb8a3c29f657d533b0d940ffefe599cdb85120f
new file mode 100644
index 0000000000..d863356403
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dfb8a3c29f657d533b0d940ffefe599cdb85120f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/dfd6e1fef6b2737e4d1c56db648a958bcce0a889 b/test/core/end2end/fuzzers/api_fuzzer_corpus/dfd6e1fef6b2737e4d1c56db648a958bcce0a889
new file mode 100644
index 0000000000..03672553c2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/dfd6e1fef6b2737e4d1c56db648a958bcce0a889
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e048e989af2d9aec0d63f72fa8feede387114779 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e048e989af2d9aec0d63f72fa8feede387114779
new file mode 100644
index 0000000000..af7be6db53
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e048e989af2d9aec0d63f72fa8feede387114779
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e0588c306f2ab329d6c4bd3226e8a55e83708c1e b/test/core/end2end/fuzzers/api_fuzzer_corpus/e0588c306f2ab329d6c4bd3226e8a55e83708c1e
new file mode 100644
index 0000000000..55adcf004f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e0588c306f2ab329d6c4bd3226e8a55e83708c1e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e061b554b941636414621e0a54d2d1c7014a1ac4 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e061b554b941636414621e0a54d2d1c7014a1ac4
new file mode 100644
index 0000000000..84bf920e0e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e061b554b941636414621e0a54d2d1c7014a1ac4
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e14dbfabfdbfa666e68562b0e854544e76f5446d b/test/core/end2end/fuzzers/api_fuzzer_corpus/e14dbfabfdbfa666e68562b0e854544e76f5446d
new file mode 100644
index 0000000000..f86fdaf268
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e14dbfabfdbfa666e68562b0e854544e76f5446d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e16c732d28873c13aa0e6cc4af1880c8c6eb7367 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e16c732d28873c13aa0e6cc4af1880c8c6eb7367
new file mode 100644
index 0000000000..e6ff571bb1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e16c732d28873c13aa0e6cc4af1880c8c6eb7367
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e280d72b157d00bf77608bd7b16afd2f5550a06f b/test/core/end2end/fuzzers/api_fuzzer_corpus/e280d72b157d00bf77608bd7b16afd2f5550a06f
new file mode 100644
index 0000000000..ce5b3bb973
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e280d72b157d00bf77608bd7b16afd2f5550a06f
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e29bab478641dd412057dfb6b0a0d78afd96dd60 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e29bab478641dd412057dfb6b0a0d78afd96dd60
new file mode 100644
index 0000000000..0890a7ae05
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e29bab478641dd412057dfb6b0a0d78afd96dd60
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e2abd47fcabc336d25a4e65f2c46867234c85cfa b/test/core/end2end/fuzzers/api_fuzzer_corpus/e2abd47fcabc336d25a4e65f2c46867234c85cfa
new file mode 100644
index 0000000000..ab9fc6c2da
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e2abd47fcabc336d25a4e65f2c46867234c85cfa
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e2b07847cba288469491f873561bf4f2acf09393 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e2b07847cba288469491f873561bf4f2acf09393
new file mode 100644
index 0000000000..b1ca588683
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e2b07847cba288469491f873561bf4f2acf09393
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e3854bc2e1bc52f498780be3147d6f870e85d8af b/test/core/end2end/fuzzers/api_fuzzer_corpus/e3854bc2e1bc52f498780be3147d6f870e85d8af
new file mode 100644
index 0000000000..4343803386
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e3854bc2e1bc52f498780be3147d6f870e85d8af
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e3c84286df55942bc2673eaaca844ebf5892b080 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e3c84286df55942bc2673eaaca844ebf5892b080
new file mode 100644
index 0000000000..ba11b0cfce
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e3c84286df55942bc2673eaaca844ebf5892b080
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e4238ff612439be100fc2188bffa6aac1d7e5e5c b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4238ff612439be100fc2188bffa6aac1d7e5e5c
new file mode 100644
index 0000000000..2895f44883
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4238ff612439be100fc2188bffa6aac1d7e5e5c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e42a3228f11b2c16ab3ec082c521905e390e356e b/test/core/end2end/fuzzers/api_fuzzer_corpus/e42a3228f11b2c16ab3ec082c521905e390e356e
new file mode 100644
index 0000000000..93ab91b6a5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e42a3228f11b2c16ab3ec082c521905e390e356e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e45762f05b01eb2c781cc8cb15db74a31d97566b b/test/core/end2end/fuzzers/api_fuzzer_corpus/e45762f05b01eb2c781cc8cb15db74a31d97566b
new file mode 100644
index 0000000000..0ce2b4d066
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e45762f05b01eb2c781cc8cb15db74a31d97566b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e48ae5d10ab8c349250e8c6b9a491a154b4a861d b/test/core/end2end/fuzzers/api_fuzzer_corpus/e48ae5d10ab8c349250e8c6b9a491a154b4a861d
new file mode 100644
index 0000000000..7dce27f84e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e48ae5d10ab8c349250e8c6b9a491a154b4a861d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e4da3ef8c789c4c243b9d0787f94aca5ab232103 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4da3ef8c789c4c243b9d0787f94aca5ab232103
new file mode 100644
index 0000000000..a259f66947
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4da3ef8c789c4c243b9d0787f94aca5ab232103
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e4db5d1742f4336c13a7941b3aacfd352a6db462 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4db5d1742f4336c13a7941b3aacfd352a6db462
new file mode 100644
index 0000000000..dc048a85b8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e4db5d1742f4336c13a7941b3aacfd352a6db462
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e62a93cf5ead5a0c5e4cd13bce4cfe83c54b1c5a b/test/core/end2end/fuzzers/api_fuzzer_corpus/e62a93cf5ead5a0c5e4cd13bce4cfe83c54b1c5a
new file mode 100644
index 0000000000..4f07e3e60a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e62a93cf5ead5a0c5e4cd13bce4cfe83c54b1c5a
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e6523bc48bc3bbd56cbaf034e016c1fe56b76096 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e6523bc48bc3bbd56cbaf034e016c1fe56b76096
new file mode 100644
index 0000000000..258b888be2
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e6523bc48bc3bbd56cbaf034e016c1fe56b76096
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e7ac184d872400a6d5af852ade5adf9d68c97058 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e7ac184d872400a6d5af852ade5adf9d68c97058
new file mode 100644
index 0000000000..512d51a5c1
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e7ac184d872400a6d5af852ade5adf9d68c97058
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e814c704e36a84f75c235985a13d58fd1eaa8e01 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e814c704e36a84f75c235985a13d58fd1eaa8e01
new file mode 100644
index 0000000000..fe22eee894
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e814c704e36a84f75c235985a13d58fd1eaa8e01
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e8324e1c5c1541f327f848821074ed0b9b0a4b41 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e8324e1c5c1541f327f848821074ed0b9b0a4b41
new file mode 100644
index 0000000000..7232ce6260
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e8324e1c5c1541f327f848821074ed0b9b0a4b41
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e8616e0840a6d4077b322fa2b1906d1fd4c406bd b/test/core/end2end/fuzzers/api_fuzzer_corpus/e8616e0840a6d4077b322fa2b1906d1fd4c406bd
new file mode 100644
index 0000000000..991ab1b4c8
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e8616e0840a6d4077b322fa2b1906d1fd4c406bd
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/e9ae17566804496b92d2ddcf99129436d771fb81 b/test/core/end2end/fuzzers/api_fuzzer_corpus/e9ae17566804496b92d2ddcf99129436d771fb81
new file mode 100644
index 0000000000..8fdbed2c5e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/e9ae17566804496b92d2ddcf99129436d771fb81
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ea5ba8919404e2a04f38b17e7e3031a5586a2d0c b/test/core/end2end/fuzzers/api_fuzzer_corpus/ea5ba8919404e2a04f38b17e7e3031a5586a2d0c
new file mode 100644
index 0000000000..11806736ab
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ea5ba8919404e2a04f38b17e7e3031a5586a2d0c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/eaf587f7f303dda3ccc5becc6e645af7a47b36bf b/test/core/end2end/fuzzers/api_fuzzer_corpus/eaf587f7f303dda3ccc5becc6e645af7a47b36bf
new file mode 100644
index 0000000000..1435880338
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/eaf587f7f303dda3ccc5becc6e645af7a47b36bf
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ec89eb7e84e6cf7859ab478362e0ae5227a5e154 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ec89eb7e84e6cf7859ab478362e0ae5227a5e154
new file mode 100644
index 0000000000..f0547e5451
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ec89eb7e84e6cf7859ab478362e0ae5227a5e154
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ecf186f5cf01d52568516a56b3f5d752edd56827 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ecf186f5cf01d52568516a56b3f5d752edd56827
new file mode 100644
index 0000000000..0a42b7f31c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ecf186f5cf01d52568516a56b3f5d752edd56827
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ed3b22b78763a426595a8ebc05d07004cc80aaff b/test/core/end2end/fuzzers/api_fuzzer_corpus/ed3b22b78763a426595a8ebc05d07004cc80aaff
new file mode 100644
index 0000000000..b5e839ac75
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ed3b22b78763a426595a8ebc05d07004cc80aaff
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ed96c5df96beb5a2bdc4424c38e60fe74da080a2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ed96c5df96beb5a2bdc4424c38e60fe74da080a2
new file mode 100644
index 0000000000..a023a0053d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ed96c5df96beb5a2bdc4424c38e60fe74da080a2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/edac3a36778a1b2db96c3c07435696b9aca94c24 b/test/core/end2end/fuzzers/api_fuzzer_corpus/edac3a36778a1b2db96c3c07435696b9aca94c24
new file mode 100644
index 0000000000..7ee3f0659e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/edac3a36778a1b2db96c3c07435696b9aca94c24
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ee147e7d7ca7937fe37d2bc2aed053ef1e396b07 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ee147e7d7ca7937fe37d2bc2aed053ef1e396b07
new file mode 100644
index 0000000000..a500bf03fe
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ee147e7d7ca7937fe37d2bc2aed053ef1e396b07
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/eed65ac63a044c87423f333f3b9c5f0d3bc7bd3b b/test/core/end2end/fuzzers/api_fuzzer_corpus/eed65ac63a044c87423f333f3b9c5f0d3bc7bd3b
new file mode 100644
index 0000000000..1ad9d286ca
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/eed65ac63a044c87423f333f3b9c5f0d3bc7bd3b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/efc7a168a1060d04234a3acd3da42a80e49eb72e b/test/core/end2end/fuzzers/api_fuzzer_corpus/efc7a168a1060d04234a3acd3da42a80e49eb72e
new file mode 100644
index 0000000000..83cb4412d3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/efc7a168a1060d04234a3acd3da42a80e49eb72e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f0d8a858c5459aa5f6b2777b50a736dc8645708d b/test/core/end2end/fuzzers/api_fuzzer_corpus/f0d8a858c5459aa5f6b2777b50a736dc8645708d
new file mode 100644
index 0000000000..0a33aafa8d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f0d8a858c5459aa5f6b2777b50a736dc8645708d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f0fdf87e2d0f86481b6ae05a55cb108c5763ab53 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f0fdf87e2d0f86481b6ae05a55cb108c5763ab53
new file mode 100644
index 0000000000..bdcf216d98
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f0fdf87e2d0f86481b6ae05a55cb108c5763ab53
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f157bcc470de43462d90bc95ed4a063caac77a93 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f157bcc470de43462d90bc95ed4a063caac77a93
new file mode 100644
index 0000000000..c32327d205
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f157bcc470de43462d90bc95ed4a063caac77a93
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f1f390731dc9ae4194a528df462fb07736796e5d b/test/core/end2end/fuzzers/api_fuzzer_corpus/f1f390731dc9ae4194a528df462fb07736796e5d
new file mode 100644
index 0000000000..43970b603f
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f1f390731dc9ae4194a528df462fb07736796e5d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f27b422b6c15da10aa282fbcdc0f1ad9e4813c83 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f27b422b6c15da10aa282fbcdc0f1ad9e4813c83
new file mode 100644
index 0000000000..2ab9e01420
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f27b422b6c15da10aa282fbcdc0f1ad9e4813c83
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f28eabe16ec69e9200f3febad09e4ae4514ec0e2 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f28eabe16ec69e9200f3febad09e4ae4514ec0e2
new file mode 100644
index 0000000000..30ba513765
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f28eabe16ec69e9200f3febad09e4ae4514ec0e2
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f3259c7e2397f3c8d0664c7c5e1a6758c0874e51 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3259c7e2397f3c8d0664c7c5e1a6758c0874e51
new file mode 100644
index 0000000000..7d2334da9a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3259c7e2397f3c8d0664c7c5e1a6758c0874e51
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f3809c7a3770a31e892dc396a388642c02624713 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3809c7a3770a31e892dc396a388642c02624713
new file mode 100644
index 0000000000..b30ab939cb
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3809c7a3770a31e892dc396a388642c02624713
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f399656ccd610dfdf61556d22d3e1044d7335d6d b/test/core/end2end/fuzzers/api_fuzzer_corpus/f399656ccd610dfdf61556d22d3e1044d7335d6d
new file mode 100644
index 0000000000..4e1cd2a89c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f399656ccd610dfdf61556d22d3e1044d7335d6d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f3fba021c9e4cdee8ea694017ae1e40f55fead5d b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3fba021c9e4cdee8ea694017ae1e40f55fead5d
new file mode 100644
index 0000000000..2fa4bd27b7
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f3fba021c9e4cdee8ea694017ae1e40f55fead5d
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f5921e18d4b2628142abb0597d87eab72c535c19 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f5921e18d4b2628142abb0597d87eab72c535c19
new file mode 100644
index 0000000000..047b37c3ac
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f5921e18d4b2628142abb0597d87eab72c535c19
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f567d97a49158b053ebdc1b20e9ab5640ffb5b b/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f567d97a49158b053ebdc1b20e9ab5640ffb5b
new file mode 100644
index 0000000000..a996b05025
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f567d97a49158b053ebdc1b20e9ab5640ffb5b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f76d0247a67a5be4a32b33756cba36b16bc025 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f76d0247a67a5be4a32b33756cba36b16bc025
new file mode 100644
index 0000000000..f38898d66b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f7f76d0247a67a5be4a32b33756cba36b16bc025
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f80ebea47ad5fefe472da7af6cfb3eb0e3b5f516 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f80ebea47ad5fefe472da7af6cfb3eb0e3b5f516
new file mode 100644
index 0000000000..37dede088e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f80ebea47ad5fefe472da7af6cfb3eb0e3b5f516
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f8247b46413793b558009f646e262029edc0a319 b/test/core/end2end/fuzzers/api_fuzzer_corpus/f8247b46413793b558009f646e262029edc0a319
new file mode 100644
index 0000000000..46f148387e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f8247b46413793b558009f646e262029edc0a319
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/f969f53d5cfed53ceb7df67bfe619b08f6b0841b b/test/core/end2end/fuzzers/api_fuzzer_corpus/f969f53d5cfed53ceb7df67bfe619b08f6b0841b
new file mode 100644
index 0000000000..0925494c06
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/f969f53d5cfed53ceb7df67bfe619b08f6b0841b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fa2ff7bb76b0025211b2f8bd05ef62e42db92621 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fa2ff7bb76b0025211b2f8bd05ef62e42db92621
new file mode 100644
index 0000000000..de173cface
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fa2ff7bb76b0025211b2f8bd05ef62e42db92621
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fb4e6a537eb5540e22108fc9e9fc14bfe4eb6acb b/test/core/end2end/fuzzers/api_fuzzer_corpus/fb4e6a537eb5540e22108fc9e9fc14bfe4eb6acb
new file mode 100644
index 0000000000..4912f4087c
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fb4e6a537eb5540e22108fc9e9fc14bfe4eb6acb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fb76689d3c70bd5927b3256eda9738a2208e2b13 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fb76689d3c70bd5927b3256eda9738a2208e2b13
new file mode 100644
index 0000000000..b69004c254
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fb76689d3c70bd5927b3256eda9738a2208e2b13
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fc3c6bdc85b45374d3417035e813eff18e07614e b/test/core/end2end/fuzzers/api_fuzzer_corpus/fc3c6bdc85b45374d3417035e813eff18e07614e
new file mode 100644
index 0000000000..738bca4945
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fc3c6bdc85b45374d3417035e813eff18e07614e
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fc5f8421028a5f12b68be86eb12af4c945947f69 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fc5f8421028a5f12b68be86eb12af4c945947f69
new file mode 100644
index 0000000000..0c8732b76e
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fc5f8421028a5f12b68be86eb12af4c945947f69
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fccbb9620ab9c570f5dda169c7dd8ab907ea3161 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fccbb9620ab9c570f5dda169c7dd8ab907ea3161
new file mode 100644
index 0000000000..0840f0eaaf
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fccbb9620ab9c570f5dda169c7dd8ab907ea3161
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fd825fd14341b700853b72e4fea0899c2dfb441b b/test/core/end2end/fuzzers/api_fuzzer_corpus/fd825fd14341b700853b72e4fea0899c2dfb441b
new file mode 100644
index 0000000000..6448213877
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fd825fd14341b700853b72e4fea0899c2dfb441b
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fd9e3ed58eeac32972d96a3adf1857bb598896b9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fd9e3ed58eeac32972d96a3adf1857bb598896b9
new file mode 100644
index 0000000000..89dd30b5d3
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fd9e3ed58eeac32972d96a3adf1857bb598896b9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fda1d52ffb49a46cb9d3ccedfc82e2425f6d4dfb b/test/core/end2end/fuzzers/api_fuzzer_corpus/fda1d52ffb49a46cb9d3ccedfc82e2425f6d4dfb
new file mode 100644
index 0000000000..ed4d96c62d
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fda1d52ffb49a46cb9d3ccedfc82e2425f6d4dfb
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fdecd05733278ece9993eb2bef13917675cc062c b/test/core/end2end/fuzzers/api_fuzzer_corpus/fdecd05733278ece9993eb2bef13917675cc062c
new file mode 100644
index 0000000000..796956c823
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fdecd05733278ece9993eb2bef13917675cc062c
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/fef08f9549a14a65f1135a00da7d6b4eb7a03e80 b/test/core/end2end/fuzzers/api_fuzzer_corpus/fef08f9549a14a65f1135a00da7d6b4eb7a03e80
new file mode 100644
index 0000000000..c5c26c0772
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/fef08f9549a14a65f1135a00da7d6b4eb7a03e80
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/ffae95db59780f530e4d891bb26f6843cf361bc9 b/test/core/end2end/fuzzers/api_fuzzer_corpus/ffae95db59780f530e4d891bb26f6843cf361bc9
new file mode 100644
index 0000000000..28a72001b4
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/ffae95db59780f530e4d891bb26f6843cf361bc9
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-1b475868d1f5313d0b7c58fc1652108d84da6112 b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-1b475868d1f5313d0b7c58fc1652108d84da6112
new file mode 100644
index 0000000000..48237e5c45
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-1b475868d1f5313d0b7c58fc1652108d84da6112
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-a1b05639643aee995cb8995e26e7698911c182f6 b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-a1b05639643aee995cb8995e26e7698911c182f6
new file mode 100644
index 0000000000..957f1a1cf5
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-a1b05639643aee995cb8995e26e7698911c182f6
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-e861dafbe5a18d7ba97d92c49a3ce09df2877804 b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-e861dafbe5a18d7ba97d92c49a3ce09df2877804
new file mode 100644
index 0000000000..d9793d308b
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout-e861dafbe5a18d7ba97d92c49a3ce09df2877804
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer.c b/test/core/end2end/fuzzers/client_fuzzer.c
index 00e650a30b..c5260cd287 100644
--- a/test/core/end2end/fuzzers/client_fuzzer.c
+++ b/test/core/end2end/fuzzers/client_fuzzer.c
@@ -44,7 +44,7 @@
bool squelch = true;
bool leak_check = true;
-static void discard_write(gpr_slice slice) {}
+static void discard_write(grpc_slice slice) {}
static void *tag(int n) { return (void *)(uintptr_t)n; }
@@ -58,7 +58,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_endpoint *mock_endpoint = grpc_mock_endpoint_create(discard_write);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("client_fuzzer");
+ grpc_endpoint *mock_endpoint =
+ grpc_mock_endpoint_create(discard_write, resource_quota);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
grpc_transport *transport =
@@ -117,7 +121,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_mock_endpoint_put_read(
&exec_ctx, mock_endpoint,
- gpr_slice_from_copied_buffer((const char *)data, size));
+ grpc_slice_from_copied_buffer((const char *)data, size));
grpc_event ev;
while (1) {
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4 b/test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4
new file mode 100644
index 0000000000..6349ad1989
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8f b/test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8f
new file mode 100644
index 0000000000..16924a8463
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7 b/test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7
new file mode 100644
index 0000000000..100ed42598
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36 b/test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36
new file mode 100644
index 0000000000..dbfa835e5c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3eb b/test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3eb
new file mode 100644
index 0000000000..cad65f9004
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3eb
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780 b/test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780
new file mode 100644
index 0000000000..24f1303e8d
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5d b/test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5d
new file mode 100644
index 0000000000..331ee2041c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61 b/test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61
new file mode 100644
index 0000000000..9189e1d1c1
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858e b/test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858e
new file mode 100644
index 0000000000..7b460e857e
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4d b/test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4d
new file mode 100644
index 0000000000..0ba3da12f8
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cd b/test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cd
new file mode 100644
index 0000000000..8f1170b88f
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cd
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844 b/test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844
new file mode 100644
index 0000000000..7a89a2d93d
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85 b/test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85
new file mode 100644
index 0000000000..ed10b33fb4
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229 b/test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229
new file mode 100644
index 0000000000..47de5fcf88
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918 b/test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918
new file mode 100644
index 0000000000..4f8f752825
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0c b/test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0c
new file mode 100644
index 0000000000..56e026d3b7
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0c
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9 b/test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9
new file mode 100644
index 0000000000..6a693d63cb
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92 b/test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92
new file mode 100644
index 0000000000..824e2b5734
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bde b/test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bde
new file mode 100644
index 0000000000..2f51f8aa20
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bde
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39 b/test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39
new file mode 100644
index 0000000000..69d0d2dc99
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22 b/test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22
new file mode 100644
index 0000000000..953cc45739
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457edd b/test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457edd
new file mode 100644
index 0000000000..a7a06f0940
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457edd
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4 b/test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4
new file mode 100644
index 0000000000..87fe560a2b
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6f b/test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6f
new file mode 100644
index 0000000000..d7c5a904d8
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863 b/test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863
new file mode 100644
index 0000000000..6da2172acc
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19 b/test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19
new file mode 100644
index 0000000000..930145bb58
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03 b/test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03
new file mode 100644
index 0000000000..5fe5c751cd
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01 b/test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01
new file mode 100644
index 0000000000..3be5ddab83
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159 b/test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159
new file mode 100644
index 0000000000..86b4e4f46c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0ac b/test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0ac
new file mode 100644
index 0000000000..a137768e61
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0ac
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269 b/test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269
new file mode 100644
index 0000000000..e27cfd0a5e
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4 b/test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4
new file mode 100644
index 0000000000..c689dc0743
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357 b/test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357
new file mode 100644
index 0000000000..a16ab5f832
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230 b/test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230
new file mode 100644
index 0000000000..b9ec3a289c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995 b/test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995
new file mode 100644
index 0000000000..68f9acbfd6
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cf b/test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cf
new file mode 100644
index 0000000000..2a54775cf9
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cf
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192 b/test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192
new file mode 100644
index 0000000000..9287c0e2ac
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0 b/test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0
new file mode 100644
index 0000000000..d837546c74
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991 b/test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991
new file mode 100644
index 0000000000..b7459cc16b
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106aba b/test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106aba
new file mode 100644
index 0000000000..565ded1d56
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106aba
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8f b/test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8f
new file mode 100644
index 0000000000..06bf037820
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1 b/test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1
new file mode 100644
index 0000000000..d9898ce366
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcf b/test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcf
new file mode 100644
index 0000000000..88b661d2fa
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcf
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712 b/test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712
new file mode 100644
index 0000000000..eb29d7dc4d
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150 b/test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150
new file mode 100644
index 0000000000..edcffff2c5
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565a b/test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565a
new file mode 100644
index 0000000000..f1b7311602
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565a
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e b/test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e
new file mode 100644
index 0000000000..04bbc439f5
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01 b/test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01
new file mode 100644
index 0000000000..28192824b3
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19c b/test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19c
new file mode 100644
index 0000000000..cee1c74aa4
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19c
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67 b/test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67
new file mode 100644
index 0000000000..a01e127d40
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50f b/test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50f
new file mode 100644
index 0000000000..cc4cf76a89
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502a b/test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502a
new file mode 100644
index 0000000000..4808a6b2f3
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502a
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78 b/test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78
new file mode 100644
index 0000000000..a7bd93aae9
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4 b/test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4
new file mode 100644
index 0000000000..a6d6b68c3c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437 b/test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437
new file mode 100644
index 0000000000..68c89f2e74
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7 b/test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7
new file mode 100644
index 0000000000..23ccb6290b
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4c b/test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4c
new file mode 100644
index 0000000000..72fd25d869
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4c
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286 b/test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286
new file mode 100644
index 0000000000..4271aceac0
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0a b/test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0a
new file mode 100644
index 0000000000..eab8c6fab6
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0a
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74 b/test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74
new file mode 100644
index 0000000000..a08fdfbafd
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009 b/test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009
new file mode 100644
index 0000000000..445452288d
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1 b/test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1
new file mode 100644
index 0000000000..0fc82e3ed8
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5 b/test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5
new file mode 100644
index 0000000000..7bf9394be7
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04 b/test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04
new file mode 100644
index 0000000000..28d5fa1f8b
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6e b/test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6e
new file mode 100644
index 0000000000..f0f4205518
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fd b/test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fd
new file mode 100644
index 0000000000..c6e40f4d6e
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fd
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352d b/test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352d
new file mode 100644
index 0000000000..8bd48c793c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9d b/test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9d
new file mode 100644
index 0000000000..fc361574a7
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6 b/test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6
new file mode 100644
index 0000000000..4c9e4cc1bf
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824 b/test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824
new file mode 100644
index 0000000000..b0bd00b169
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0 b/test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0
new file mode 100644
index 0000000000..a22ac1a0e4
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56 b/test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56
new file mode 100644
index 0000000000..ff59f11045
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217c b/test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217c
new file mode 100644
index 0000000000..04e63de1a0
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217c
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245b b/test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245b
new file mode 100644
index 0000000000..24572673a3
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245b
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719 b/test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719
new file mode 100644
index 0000000000..168cdf95f3
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9 b/test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9
new file mode 100644
index 0000000000..be561c8277
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6 b/test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6
new file mode 100644
index 0000000000..cf3974a2c5
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eef b/test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eef
new file mode 100644
index 0000000000..c92a360ccf
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eef
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cddd b/test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cddd
new file mode 100644
index 0000000000..6f0690eeb4
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cddd
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4 b/test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4
new file mode 100644
index 0000000000..81d92a4828
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20 b/test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20
new file mode 100644
index 0000000000..519cc1d4c8
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18 b/test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18
new file mode 100644
index 0000000000..b2d745bc1c
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9 b/test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9
new file mode 100644
index 0000000000..8813fd4234
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152c b/test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152c
new file mode 100644
index 0000000000..f04cff2890
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152c
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8 b/test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8
new file mode 100644
index 0000000000..1e4394a4c6
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490e b/test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490e
new file mode 100644
index 0000000000..b53b5036c0
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92 b/test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92
new file mode 100644
index 0000000000..13c55f0b6f
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339b b/test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339b
new file mode 100644
index 0000000000..59bea4cc08
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339b
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4e b/test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4e
new file mode 100644
index 0000000000..24a10c02cb
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5d b/test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5d
new file mode 100644
index 0000000000..99e59110a5
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0 b/test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0
new file mode 100644
index 0000000000..e542cd8412
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac b/test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac
new file mode 100644
index 0000000000..eb7a935045
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3 b/test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3
new file mode 100644
index 0000000000..c66e5b074a
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7f b/test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7f
new file mode 100644
index 0000000000..9fdf55ce22
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc b/test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc
new file mode 100644
index 0000000000..0839fa3b2f
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7 b/test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7
new file mode 100644
index 0000000000..c36b601f16
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379 b/test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379
new file mode 100644
index 0000000000..98ebef2bdf
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116 b/test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116
new file mode 100644
index 0000000000..c391f56a11
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aea b/test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aea
new file mode 100644
index 0000000000..2d6585e4b6
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aea
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7e b/test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7e
new file mode 100644
index 0000000000..6c202e4b78
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7e
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653 b/test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653
new file mode 100644
index 0000000000..340f89aa88
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162 b/test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162
new file mode 100644
index 0000000000..a1e3118af5
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2 b/test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2
new file mode 100644
index 0000000000..710933be06
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_header b/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_header
new file mode 100644
index 0000000000..d2abd17464
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_header
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2 b/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2
new file mode 100644
index 0000000000..752af468ba
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884f b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884f
new file mode 100644
index 0000000000..49b2086ff3
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884f
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7 b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7
new file mode 100644
index 0000000000..0540c66155
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20a b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20a
new file mode 100644
index 0000000000..f72c62284f
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20a
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8 b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8
new file mode 100644
index 0000000000..c908d5e0b1
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9 b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9
new file mode 100644
index 0000000000..03531646e6
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9d b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9d
new file mode 100644
index 0000000000..b1cac238a7
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9d
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5 b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5
new file mode 100644
index 0000000000..b9183c2a1f
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5 b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5
new file mode 100644
index 0000000000..1a8084f3ac
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0 b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0
new file mode 100644
index 0000000000..a55c4dbfaa
--- /dev/null
+++ b/test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0
Binary files differ
diff --git a/test/core/client_config/BUILD b/test/core/end2end/fuzzers/generate_client_examples_of_bad_closing_streams.py
index 856206d8ff..d80c1e0442 100644..100755
--- a/test/core/client_config/BUILD
+++ b/test/core/end2end/fuzzers/generate_client_examples_of_bad_closing_streams.py
@@ -1,4 +1,5 @@
-# Copyright 2016, Google Inc.
+#!/usr/bin/env python2.7
+# Copyright 2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -27,13 +28,22 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
+import os
+import sys
-grpc_fuzzer(
- name = "uri_fuzzer",
- srcs = ["uri_fuzzer_test.c"],
- deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util"],
- corpus = "uri_corpus",
- copts = ["-std=c99"],
-)
+os.chdir(os.path.dirname(sys.argv[0]))
+streams = {
+ 'server_hanging_response_1_header': (
+ [0,0,0,4,0,0,0,0,0] + # settings frame
+ [0,0,0,1,5,0,0,0,1] # trailers
+ ),
+ 'server_hanging_response_2_header2': (
+ [0,0,0,4,0,0,0,0,0] + # settings frame
+ [0,0,0,1,4,0,0,0,1] + # headers
+ [0,0,0,1,5,0,0,0,1] # trailers
+ ),
+}
+
+for name, stream in streams.items():
+ open('client_fuzzer_corpus/%s' % name, 'w').write(bytearray(stream))
diff --git a/test/core/end2end/fuzzers/server_fuzzer.c b/test/core/end2end/fuzzers/server_fuzzer.c
index 79eaad70c5..164022ec79 100644
--- a/test/core/end2end/fuzzers/server_fuzzer.c
+++ b/test/core/end2end/fuzzers/server_fuzzer.c
@@ -41,7 +41,7 @@
bool squelch = true;
bool leak_check = true;
-static void discard_write(gpr_slice slice) {}
+static void discard_write(grpc_slice slice) {}
static void *tag(int n) { return (void *)(uintptr_t)n; }
static int detag(void *p) { return (int)(uintptr_t)p; }
@@ -56,10 +56,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_endpoint *mock_endpoint = grpc_mock_endpoint_create(discard_write);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("server_fuzzer");
+ grpc_endpoint *mock_endpoint =
+ grpc_mock_endpoint_create(discard_write, resource_quota);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_mock_endpoint_put_read(
&exec_ctx, mock_endpoint,
- gpr_slice_from_copied_buffer((const char *)data, size));
+ grpc_slice_from_copied_buffer((const char *)data, size));
grpc_server *server = grpc_server_create(NULL, NULL);
grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc b/test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc
new file mode 100644
index 0000000000..51bd2e2111
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41 b/test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41
new file mode 100644
index 0000000000..9d8ff4ebf1
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671 b/test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671
new file mode 100644
index 0000000000..e46216d548
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a b/test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a
new file mode 100644
index 0000000000..af1b9060a4
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e b/test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e
new file mode 100644
index 0000000000..d89946b027
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c b/test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c
new file mode 100644
index 0000000000..85e9e1cbd5
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1 b/test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1
new file mode 100644
index 0000000000..8e73152e24
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21d b/test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21d
new file mode 100644
index 0000000000..bc41578930
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21d
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9c b/test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9c
new file mode 100644
index 0000000000..14fa54b37b
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9c
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1 b/test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1
new file mode 100644
index 0000000000..ef0b1c6fe4
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069 b/test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069
new file mode 100644
index 0000000000..ced60a4956
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71f b/test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71f
new file mode 100644
index 0000000000..bc3b3a7966
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71f
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9 b/test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9
new file mode 100644
index 0000000000..887343dd82
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054 b/test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054
new file mode 100644
index 0000000000..f3f73062b4
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397 b/test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397
new file mode 100644
index 0000000000..b659ab76f9
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212 b/test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212
new file mode 100644
index 0000000000..ee71599c8c
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13e b/test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13e
new file mode 100644
index 0000000000..109e65afb5
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13e
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1a b/test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1a
new file mode 100644
index 0000000000..d259cf38ae
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783 b/test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783
new file mode 100644
index 0000000000..ec69b8387a
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176 b/test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176
new file mode 100644
index 0000000000..14b38ae106
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47a b/test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47a
new file mode 100644
index 0000000000..57fc82a0be
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffa b/test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffa
new file mode 100644
index 0000000000..7f2043faf9
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffa
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7 b/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7
new file mode 100644
index 0000000000..7422f1e239
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89 b/test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89
new file mode 100644
index 0000000000..e08021fe0b
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7 b/test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7
new file mode 100644
index 0000000000..04f89c8074
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedf b/test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedf
new file mode 100644
index 0000000000..5def714a1d
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedf
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57 b/test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57
new file mode 100644
index 0000000000..d65b3bc707
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941 b/test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941
new file mode 100644
index 0000000000..f530e0baf0
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941
Binary files differ
diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py
new file mode 100755
index 0000000000..201a92a1fd
--- /dev/null
+++ b/test/core/end2end/gen_build_yaml.py
@@ -0,0 +1,304 @@
+#!/usr/bin/env python2.7
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""Generates the appropriate build.json data for all the end2end tests."""
+
+
+import yaml
+import collections
+import hashlib
+
+
+FixtureOptions = collections.namedtuple(
+ 'FixtureOptions',
+ 'fullstack includes_proxy dns_resolver secure platforms ci_mac tracing exclude_configs exclude_iomgrs large_writes')
+default_unsecure_fixture_options = FixtureOptions(
+ True, False, True, False, ['windows', 'linux', 'mac', 'posix'], True, False, [], [], True)
+socketpair_unsecure_fixture_options = default_unsecure_fixture_options._replace(fullstack=False, dns_resolver=False)
+default_secure_fixture_options = default_unsecure_fixture_options._replace(secure=True)
+uds_fixture_options = default_unsecure_fixture_options._replace(dns_resolver=False, platforms=['linux', 'mac', 'posix'], exclude_iomgrs=['uv'])
+fd_unsecure_fixture_options = default_unsecure_fixture_options._replace(
+ dns_resolver=False, fullstack=False, platforms=['linux', 'mac', 'posix'], exclude_iomgrs=['uv'])
+
+
+# maps fixture name to whether it requires the security library
+END2END_FIXTURES = {
+ 'h2_compress': default_unsecure_fixture_options,
+
+ 'h2_census': default_unsecure_fixture_options,
+ 'h2_load_reporting': default_unsecure_fixture_options,
+ 'h2_fakesec': default_secure_fixture_options._replace(ci_mac=False),
+ 'h2_fd': fd_unsecure_fixture_options,
+ 'h2_full': default_unsecure_fixture_options,
+ 'h2_full+pipe': default_unsecure_fixture_options._replace(
+ platforms=['linux'], exclude_iomgrs=['uv']),
+ 'h2_full+trace': default_unsecure_fixture_options._replace(tracing=True),
+ 'h2_http_proxy': default_unsecure_fixture_options._replace(
+ ci_mac=False, exclude_iomgrs=['uv']),
+ 'h2_oauth2': default_secure_fixture_options._replace(
+ ci_mac=False, exclude_iomgrs=['uv']),
+ 'h2_proxy': default_unsecure_fixture_options._replace(
+ includes_proxy=True, ci_mac=False, exclude_iomgrs=['uv']),
+ 'h2_sockpair_1byte': socketpair_unsecure_fixture_options._replace(
+ ci_mac=False, exclude_configs=['msan'], large_writes=False,
+ exclude_iomgrs=['uv']),
+ 'h2_sockpair': socketpair_unsecure_fixture_options._replace(
+ ci_mac=False, exclude_iomgrs=['uv']),
+ 'h2_sockpair+trace': socketpair_unsecure_fixture_options._replace(
+ ci_mac=False, tracing=True, large_writes=False, exclude_iomgrs=['uv']),
+ 'h2_ssl': default_secure_fixture_options,
+ 'h2_ssl_cert': default_secure_fixture_options,
+ 'h2_ssl_proxy': default_secure_fixture_options._replace(
+ includes_proxy=True, ci_mac=False, exclude_iomgrs=['uv']),
+ 'h2_uds': uds_fixture_options,
+}
+
+TestOptions = collections.namedtuple(
+ 'TestOptions',
+ 'needs_fullstack needs_dns proxyable secure traceable cpu_cost exclude_iomgrs large_writes flaky')
+default_test_options = TestOptions(False, False, True, False, True, 1.0, [], False, False)
+connectivity_test_options = default_test_options._replace(needs_fullstack=True)
+
+LOWCPU = 0.1
+
+# maps test names to options
+END2END_TESTS = {
+ 'bad_hostname': default_test_options,
+ 'binary_metadata': default_test_options,
+ 'resource_quota_server': default_test_options._replace(large_writes=True,
+ proxyable=False),
+ 'call_creds': default_test_options._replace(secure=True),
+ 'cancel_after_accept': default_test_options._replace(cpu_cost=LOWCPU),
+ 'cancel_after_client_done': default_test_options,
+ 'cancel_after_invoke': default_test_options._replace(cpu_cost=LOWCPU),
+ 'cancel_before_invoke': default_test_options._replace(cpu_cost=LOWCPU),
+ 'cancel_in_a_vacuum': default_test_options._replace(cpu_cost=LOWCPU),
+ 'cancel_with_status': default_test_options._replace(cpu_cost=LOWCPU),
+ 'compressed_payload': default_test_options._replace(proxyable=False),
+ 'connectivity': connectivity_test_options._replace(
+ proxyable=False, cpu_cost=LOWCPU, exclude_iomgrs=['uv']),
+ 'default_host': default_test_options._replace(needs_fullstack=True,
+ needs_dns=True),
+ 'disappearing_server': connectivity_test_options._replace(flaky=True),
+ 'empty_batch': default_test_options,
+ 'filter_causes_close': default_test_options,
+ 'filter_call_init_fails': default_test_options,
+ 'filter_latency': default_test_options,
+ 'graceful_server_shutdown': default_test_options._replace(cpu_cost=LOWCPU),
+ 'hpack_size': default_test_options._replace(proxyable=False,
+ traceable=False),
+ 'high_initial_seqno': default_test_options,
+ 'idempotent_request': default_test_options,
+ 'invoke_large_request': default_test_options,
+ 'large_metadata': default_test_options,
+ 'max_concurrent_streams': default_test_options._replace(proxyable=False),
+ 'max_message_length': default_test_options,
+ 'negative_deadline': default_test_options,
+ 'network_status_change': default_test_options,
+ 'no_logging': default_test_options._replace(traceable=False),
+ 'no_op': default_test_options,
+ 'payload': default_test_options,
+ 'load_reporting_hook': default_test_options,
+ 'ping_pong_streaming': default_test_options,
+ 'ping': connectivity_test_options._replace(proxyable=False),
+ 'registered_call': default_test_options,
+ 'request_with_flags': default_test_options._replace(
+ proxyable=False, cpu_cost=LOWCPU),
+ 'request_with_payload': default_test_options,
+ 'server_finishes_request': default_test_options,
+ 'shutdown_finishes_calls': default_test_options,
+ 'shutdown_finishes_tags': default_test_options,
+ 'simple_cacheable_request': default_test_options,
+ 'simple_delayed_request': connectivity_test_options,
+ 'simple_metadata': default_test_options,
+ 'simple_request': default_test_options,
+ 'streaming_error_response': default_test_options,
+ 'trailing_metadata': default_test_options,
+ 'authority_not_supported': default_test_options,
+}
+
+
+def compatible(f, t):
+ if END2END_TESTS[t].needs_fullstack:
+ if not END2END_FIXTURES[f].fullstack:
+ return False
+ if END2END_TESTS[t].needs_dns:
+ if not END2END_FIXTURES[f].dns_resolver:
+ return False
+ if not END2END_TESTS[t].proxyable:
+ if END2END_FIXTURES[f].includes_proxy:
+ return False
+ if not END2END_TESTS[t].traceable:
+ if END2END_FIXTURES[f].tracing:
+ return False
+ if END2END_TESTS[t].large_writes:
+ if not END2END_FIXTURES[f].large_writes:
+ return False
+ return True
+
+
+def without(l, e):
+ l = l[:]
+ l.remove(e)
+ return l
+
+
+def main():
+ sec_deps = [
+ 'grpc_test_util',
+ 'grpc',
+ 'gpr_test_util',
+ 'gpr'
+ ]
+ unsec_deps = [
+ 'grpc_test_util_unsecure',
+ 'grpc_unsecure',
+ 'gpr_test_util',
+ 'gpr'
+ ]
+ json = {
+ '#': 'generated with test/end2end/gen_build_json.py',
+ 'libs': [
+ {
+ 'name': 'end2end_tests',
+ 'build': 'private',
+ 'language': 'c',
+ 'secure': True,
+ 'src': ['test/core/end2end/end2end_tests.c',
+ 'test/core/end2end/end2end_test_utils.c'] + [
+ 'test/core/end2end/tests/%s.c' % t
+ for t in sorted(END2END_TESTS.keys())],
+ 'headers': ['test/core/end2end/tests/cancel_test_helpers.h',
+ 'test/core/end2end/end2end_tests.h'],
+ 'deps': sec_deps,
+ 'vs_proj_dir': 'test/end2end/tests',
+ }
+ ] + [
+ {
+ 'name': 'end2end_nosec_tests',
+ 'build': 'private',
+ 'language': 'c',
+ 'secure': False,
+ 'src': ['test/core/end2end/end2end_nosec_tests.c',
+ 'test/core/end2end/end2end_test_utils.c'] + [
+ 'test/core/end2end/tests/%s.c' % t
+ for t in sorted(END2END_TESTS.keys())
+ if not END2END_TESTS[t].secure],
+ 'headers': ['test/core/end2end/tests/cancel_test_helpers.h',
+ 'test/core/end2end/end2end_tests.h'],
+ 'deps': unsec_deps,
+ 'vs_proj_dir': 'test/end2end/tests',
+ }
+ ],
+ 'targets': [
+ {
+ 'name': '%s_test' % f,
+ 'build': 'test',
+ 'language': 'c',
+ 'run': False,
+ 'src': ['test/core/end2end/fixtures/%s.c' % f],
+ 'platforms': END2END_FIXTURES[f].platforms,
+ 'ci_platforms': (END2END_FIXTURES[f].platforms
+ if END2END_FIXTURES[f].ci_mac else without(
+ END2END_FIXTURES[f].platforms, 'mac')),
+ 'deps': [
+ 'end2end_tests'
+ ] + sec_deps,
+ 'vs_proj_dir': 'test/end2end/fixtures',
+ }
+ for f in sorted(END2END_FIXTURES.keys())
+ ] + [
+ {
+ 'name': '%s_nosec_test' % f,
+ 'build': 'test',
+ 'language': 'c',
+ 'secure': False,
+ 'src': ['test/core/end2end/fixtures/%s.c' % f],
+ 'run': False,
+ 'platforms': END2END_FIXTURES[f].platforms,
+ 'ci_platforms': (END2END_FIXTURES[f].platforms
+ if END2END_FIXTURES[f].ci_mac else without(
+ END2END_FIXTURES[f].platforms, 'mac')),
+ 'deps': [
+ 'end2end_nosec_tests'
+ ] + unsec_deps,
+ 'vs_proj_dir': 'test/end2end/fixtures',
+ }
+ for f in sorted(END2END_FIXTURES.keys())
+ if not END2END_FIXTURES[f].secure
+ ],
+ 'tests': [
+ {
+ 'name': '%s_test' % f,
+ 'args': [t],
+ 'exclude_configs': END2END_FIXTURES[f].exclude_configs,
+ 'exclude_iomgrs': list(set(END2END_FIXTURES[f].exclude_iomgrs) |
+ set(END2END_TESTS[t].exclude_iomgrs)),
+ 'platforms': END2END_FIXTURES[f].platforms,
+ 'ci_platforms': (END2END_FIXTURES[f].platforms
+ if END2END_FIXTURES[f].ci_mac else without(
+ END2END_FIXTURES[f].platforms, 'mac')),
+ 'flaky': END2END_TESTS[t].flaky,
+ 'language': 'c',
+ 'cpu_cost': END2END_TESTS[t].cpu_cost,
+ }
+ for f in sorted(END2END_FIXTURES.keys())
+ for t in sorted(END2END_TESTS.keys()) if compatible(f, t)
+ ] + [
+ {
+ 'name': '%s_nosec_test' % f,
+ 'args': [t],
+ 'exclude_configs': END2END_FIXTURES[f].exclude_configs,
+ 'exclude_iomgrs': list(set(END2END_FIXTURES[f].exclude_iomgrs) |
+ set(END2END_TESTS[t].exclude_iomgrs)),
+ 'platforms': END2END_FIXTURES[f].platforms,
+ 'ci_platforms': (END2END_FIXTURES[f].platforms
+ if END2END_FIXTURES[f].ci_mac else without(
+ END2END_FIXTURES[f].platforms, 'mac')),
+ 'flaky': END2END_TESTS[t].flaky,
+ 'language': 'c',
+ 'cpu_cost': END2END_TESTS[t].cpu_cost,
+ }
+ for f in sorted(END2END_FIXTURES.keys())
+ if not END2END_FIXTURES[f].secure
+ for t in sorted(END2END_TESTS.keys())
+ if compatible(f, t) and not END2END_TESTS[t].secure
+ ],
+ 'core_end2end_tests': dict(
+ (t, END2END_TESTS[t].secure)
+ for t in END2END_TESTS.keys()
+ )
+ }
+ print yaml.dump(json)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c
index a8c7b2be5a..cd68b390bb 100644
--- a/test/core/end2end/goaway_server_test.c
+++ b/test/core/end2end/goaway_server_test.c
@@ -126,8 +126,16 @@ int main(int argc, char **argv) {
char *addr;
+ grpc_channel_args client_args;
+ grpc_arg arg_array[1];
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = 1000;
+ client_args.args = arg_array;
+ client_args.num_args = 1;
+
/* create a channel that picks first amongst the servers */
- grpc_channel *chan = grpc_insecure_channel_create("test", NULL, NULL);
+ grpc_channel *chan = grpc_insecure_channel_create("test", &client_args, NULL);
/* and an initial call to them */
grpc_call *call1 = grpc_channel_create_call(
chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq, "/foo", "127.0.0.1",
diff --git a/test/core/end2end/invalid_call_argument_test.c b/test/core/end2end/invalid_call_argument_test.c
index 2b9904a244..d974d2c8ff 100644
--- a/test/core/end2end/invalid_call_argument_test.c
+++ b/test/core/end2end/invalid_call_argument_test.c
@@ -251,7 +251,8 @@ static void test_send_messages_at_the_same_time() {
gpr_log(GPR_INFO, "test_send_messages_at_the_same_time");
grpc_op *op;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
prepare_test(1);
@@ -572,6 +573,29 @@ static void test_recv_close_on_server_twice() {
cleanup_test();
}
+static void test_invalid_initial_metadata_reserved_key() {
+ gpr_log(GPR_INFO, "test_invalid_initial_metadata_reserved_key");
+
+ grpc_metadata metadata;
+ metadata.key = ":start_with_colon";
+ metadata.value = "value";
+ metadata.value_length = 6;
+
+ grpc_op *op;
+ prepare_test(1);
+ op = g_state.ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 1;
+ op->data.send_initial_metadata.metadata = &metadata;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ GPR_ASSERT(GRPC_CALL_ERROR_INVALID_METADATA ==
+ grpc_call_start_batch(g_state.call, g_state.ops,
+ (size_t)(op - g_state.ops), tag(1), NULL));
+ cleanup_test();
+}
+
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
grpc_init();
@@ -594,6 +618,7 @@ int main(int argc, char **argv) {
test_send_server_status_twice();
test_recv_close_on_server_with_invalid_flags();
test_recv_close_on_server_twice();
+ test_invalid_initial_metadata_reserved_key();
grpc_shutdown();
return 0;
diff --git a/test/core/end2end/tests/authority_not_supported.c b/test/core/end2end/tests/authority_not_supported.c
new file mode 100644
index 0000000000..705970f6ca
--- /dev/null
+++ b/test/core/end2end/tests/authority_not_supported.c
@@ -0,0 +1,194 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <grpc/support/useful.h>
+#include "test/core/end2end/cq_verifier.h"
+
+static void *tag(intptr_t t) { return (void *)t; }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char *test_name,
+ grpc_channel_args *client_args,
+ grpc_channel_args *server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_time(int n) {
+ return GRPC_TIMEOUT_SECONDS_TO_DEADLINE(n);
+}
+
+static gpr_timespec five_seconds_time(void) { return n_seconds_time(5); }
+
+static void drain_cq(grpc_completion_queue *cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_time(), NULL);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture *f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(
+ f->cq, tag(1000), GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5), NULL)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = NULL;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture *f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = NULL;
+}
+
+static void end_test(grpc_end2end_test_fixture *f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+}
+
+/* Request/response with metadata and payload.*/
+static void test_with_authority_header(grpc_end2end_test_config config) {
+ grpc_call *c;
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_byte_buffer *request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ gpr_timespec deadline = five_seconds_time();
+ grpc_metadata meta_c[2] = {
+ {"key1", "val1", 4, 0, {{NULL, NULL, NULL, NULL}}},
+ {"key2", "val2", 4, 0, {{NULL, NULL, NULL, NULL}}}};
+ grpc_end2end_test_fixture f =
+ begin_test(config, "test_with_authority_header", NULL, NULL);
+ cq_verifier *cqv = cq_verifier_create(f.cq);
+ grpc_op ops[6];
+ grpc_op *op;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_byte_buffer *response_payload_recv = NULL;
+ grpc_status_code status;
+ grpc_call_error error;
+ char *details = NULL;
+ size_t details_capacity = 0;
+
+ c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ "/foo", "foo.test.google.fr", deadline, NULL);
+ GPR_ASSERT(c);
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 2;
+ op->data.send_initial_metadata.metadata = meta_c;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message = request_payload;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata = &initial_metadata_recv;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message = &response_payload_recv;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op->data.recv_status_on_client.status_details_capacity = &details_capacity;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
+ cq_verify(cqv);
+
+ GPR_ASSERT(status == GRPC_STATUS_CANCELLED);
+
+ gpr_free(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+
+ grpc_call_destroy(c);
+
+ cq_verifier_destroy(cqv);
+
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(response_payload_recv);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+void authority_not_supported(grpc_end2end_test_config config) {
+ if (config.feature_mask & FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER) {
+ return;
+ }
+ test_with_authority_header(config);
+}
+
+void authority_not_supported_pre_init(void) {}
diff --git a/test/core/end2end/tests/bad_hostname.c b/test/core/end2end/tests/bad_hostname.c
index 85258dd288..e0c7ac7c02 100644
--- a/test/core/end2end/tests/bad_hostname.c
+++ b/test/core/end2end/tests/bad_hostname.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
grpc_end2end_test_fixture f;
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
config.init_server(&f, server_args);
return f;
}
diff --git a/test/core/end2end/tests/binary_metadata.c b/test/core/end2end/tests/binary_metadata.c
index 73b0f17c24..dd7a8a9ad3 100644
--- a/test/core/end2end/tests/binary_metadata.c
+++ b/test/core/end2end/tests/binary_metadata.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -100,8 +100,10 @@ static void test_request_response_with_metadata_and_payload(
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
@@ -146,8 +148,10 @@ static void test_request_response_with_metadata_and_payload(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -234,7 +238,22 @@ static void test_request_response_with_metadata_and_payload(
op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
op->data.send_status_from_server.trailing_metadata_count = 0;
op->data.send_status_from_server.status = GRPC_STATUS_OK;
- op->data.send_status_from_server.status_details = "xyz";
+ op->data.send_status_from_server.status_details =
+ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12"
+ "\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24"
+ "\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36"
+ "\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48"
+ "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a"
+ "\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c"
+ "\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e"
+ "\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
+ "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2"
+ "\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4"
+ "\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6"
+ "\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
+ "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea"
+ "\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc"
+ "\xfd\xfe\xff";
op->flags = 0;
op->reserved = NULL;
op++;
@@ -246,9 +265,28 @@ static void test_request_response_with_metadata_and_payload(
cq_verify(cqv);
GPR_ASSERT(status == GRPC_STATUS_OK);
- GPR_ASSERT(0 == strcmp(details, "xyz"));
+ GPR_ASSERT(
+ 0 ==
+ strcmp(details,
+ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
+ "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
+ "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
+ "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
+ "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
+ "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
+ "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
+ "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
+ "\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
+ "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
+ "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
+ "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
+ "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
+ "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
+ "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
+ "\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
diff --git a/test/core/end2end/tests/call_creds.c b/test/core/end2end/tests/call_creds.c
index 99c5d94e39..606938fff6 100644
--- a/test/core/end2end/tests/call_creds.c
+++ b/test/core/end2end/tests/call_creds.c
@@ -61,7 +61,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
grpc_end2end_test_fixture f;
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(NULL, NULL);
- config.init_client(&f, NULL, NULL);
+ config.init_client(&f, NULL);
if (fail_server_auth_check) {
grpc_arg fail_auth_arg = {
GRPC_ARG_STRING, FAIL_AUTH_CHECK_SERVER_ARG_NAME, {NULL}};
@@ -135,8 +135,10 @@ static void request_response_with_payload_and_call_creds(
override_mode mode) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
@@ -164,8 +166,10 @@ static void request_response_with_payload_and_call_creds(
f = begin_test(config, test_name, 0);
cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
creds = grpc_google_iam_credentials_create(iam_token, iam_selector, NULL);
GPR_ASSERT(creds != NULL);
@@ -294,7 +298,8 @@ static void request_response_with_payload_and_call_creds(
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
@@ -389,7 +394,8 @@ static void test_request_with_server_rejecting_client_creds(
char *details = NULL;
size_t details_capacity = 0;
grpc_byte_buffer *response_payload_recv = NULL;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_call_credentials *creds;
@@ -397,8 +403,10 @@ static void test_request_with_server_rejecting_client_creds(
f = begin_test(config, "test_request_with_server_rejecting_client_creds", 1);
cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
creds = grpc_google_iam_credentials_create(iam_token, iam_selector, NULL);
diff --git a/test/core/end2end/tests/cancel_after_accept.c b/test/core/end2end/tests/cancel_after_accept.c
index 9f49815527..e582c59f2d 100644
--- a/test/core/end2end/tests/cancel_after_accept.c
+++ b/test/core/end2end/tests/cancel_after_accept.c
@@ -41,6 +41,11 @@
#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include <grpc/support/useful.h>
+
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/transport/metadata.h"
+#include "src/core/lib/transport/service_config.h"
+
#include "test/core/end2end/cq_verifier.h"
#include "test/core/end2end/tests/cancel_test_helpers.h"
@@ -49,13 +54,12 @@ static void *tag(intptr_t t) { return (void *)t; }
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
const char *test_name,
grpc_channel_args *client_args,
- grpc_channel_args *server_args,
- const char *query_args) {
+ grpc_channel_args *server_args) {
grpc_end2end_test_fixture f;
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, query_args);
+ config.init_client(&f, client_args);
return f;
}
@@ -118,27 +122,41 @@ static void test_cancel_after_accept(grpc_end2end_test_config config,
size_t details_capacity = 0;
grpc_byte_buffer *request_payload_recv = NULL;
grpc_byte_buffer *response_payload_recv = NULL;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
int was_cancelled = 2;
- const char *query_args = NULL;
+ grpc_channel_args *args = NULL;
if (use_service_config) {
- query_args =
- "method_name=/service/method"
- "&timeout_seconds=5";
+ grpc_arg arg;
+ arg.type = GRPC_ARG_STRING;
+ arg.key = GRPC_ARG_SERVICE_CONFIG;
+ arg.value.string =
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"timeout\": \"5s\"\n"
+ " } ]\n"
+ "}";
+ args = grpc_channel_args_copy_and_add(args, &arg, 1);
}
+
grpc_end2end_test_fixture f =
- begin_test(config, "cancel_after_accept", NULL, NULL, query_args);
+ begin_test(config, "cancel_after_accept", args, NULL);
cq_verifier *cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/service/method", "foo.test.google.fr",
- deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/service/method",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -233,6 +251,8 @@ static void test_cancel_after_accept(grpc_end2end_test_config config,
grpc_call_destroy(c);
grpc_call_destroy(s);
+ if (args != NULL) grpc_channel_args_destroy(args);
+
cq_verifier_destroy(cqv);
end_test(&f);
config.tear_down_data(&f);
@@ -244,15 +264,10 @@ void cancel_after_accept(grpc_end2end_test_config config) {
for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
test_cancel_after_accept(config, cancellation_modes[i],
false /* use_service_config */);
- }
-
- if (config.feature_mask & FEATURE_MASK_SUPPORTS_QUERY_ARGS) {
- for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
- if (cancellation_modes[i].expect_status ==
- GRPC_STATUS_DEADLINE_EXCEEDED) {
- test_cancel_after_accept(config, cancellation_modes[i],
- true /* use_service_config */);
- }
+ if (config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL &&
+ cancellation_modes[i].expect_status == GRPC_STATUS_DEADLINE_EXCEEDED) {
+ test_cancel_after_accept(config, cancellation_modes[i],
+ true /* use_service_config */);
}
}
}
diff --git a/test/core/end2end/tests/cancel_after_client_done.c b/test/core/end2end/tests/cancel_after_client_done.c
index f61a404b2d..7742f9d179 100644
--- a/test/core/end2end/tests/cancel_after_client_done.c
+++ b/test/core/end2end/tests/cancel_after_client_done.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -117,16 +117,20 @@ static void test_cancel_after_accept_and_writes_closed(
size_t details_capacity = 0;
grpc_byte_buffer *request_payload_recv = NULL;
grpc_byte_buffer *response_payload_recv = NULL;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c
index c31582bf2e..c3c5418f20 100644
--- a/test/core/end2end/tests/cancel_after_invoke.c
+++ b/test/core/end2end/tests/cancel_after_invoke.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s/%s", test_name, config.name, mode.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -116,12 +116,15 @@ static void test_cancel_after_invoke(grpc_end2end_test_config config,
char *details = NULL;
size_t details_capacity = 0;
grpc_byte_buffer *response_payload_recv = NULL;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
diff --git a/test/core/end2end/tests/cancel_before_invoke.c b/test/core/end2end/tests/cancel_before_invoke.c
index 5dcd44e7b4..d4842829c0 100644
--- a/test/core/end2end/tests/cancel_before_invoke.c
+++ b/test/core/end2end/tests/cancel_before_invoke.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -114,12 +114,15 @@ static void test_cancel_before_invoke(grpc_end2end_test_config config,
char *details = NULL;
size_t details_capacity = 0;
grpc_byte_buffer *response_payload_recv = NULL;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_cancel(c, NULL));
diff --git a/test/core/end2end/tests/cancel_in_a_vacuum.c b/test/core/end2end/tests/cancel_in_a_vacuum.c
index 7f75a92e4a..5be850b6ea 100644
--- a/test/core/end2end/tests/cancel_in_a_vacuum.c
+++ b/test/core/end2end/tests/cancel_in_a_vacuum.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -105,8 +105,10 @@ static void test_cancel_in_a_vacuum(grpc_end2end_test_config config,
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
GPR_ASSERT(GRPC_CALL_OK == mode.initiate_cancel(c, NULL));
diff --git a/test/core/end2end/tests/cancel_with_status.c b/test/core/end2end/tests/cancel_with_status.c
index 5cf3eb6be6..3aecaf7159 100644
--- a/test/core/end2end/tests/cancel_with_status.c
+++ b/test/core/end2end/tests/cancel_with_status.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f, size_t num_ops) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f, size_t num_ops) {
grpc_call *c;
gpr_timespec deadline = five_seconds_time();
cq_verifier *cqv = cq_verifier_create(f.cq);
@@ -112,9 +113,10 @@ static void simple_request_body(grpc_end2end_test_fixture f, size_t num_ops) {
gpr_log(GPR_DEBUG, "test with %" PRIuPTR " ops", num_ops);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -170,7 +172,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config,
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_simple_request", NULL, NULL);
- simple_request_body(f, num_ops);
+ simple_request_body(config, f, num_ops);
end_test(&f);
config.tear_down_data(&f);
}
diff --git a/test/core/end2end/tests/compressed_payload.c b/test/core/end2end/tests/compressed_payload.c
index f598a3812b..81fc7091f8 100644
--- a/test/core/end2end/tests/compressed_payload.c
+++ b/test/core/end2end/tests/compressed_payload.c
@@ -60,7 +60,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -110,7 +110,7 @@ static void request_for_disabled_algorithm(
grpc_status_code expected_error, grpc_metadata *client_metadata) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice;
+ grpc_slice request_payload_slice;
grpc_byte_buffer *request_payload;
gpr_timespec deadline = five_seconds_time();
grpc_channel_args *client_args;
@@ -133,7 +133,7 @@ static void request_for_disabled_algorithm(
memset(str, 'x', 1023);
str[1023] = '\0';
- request_payload_slice = gpr_slice_from_copied_string(str);
+ request_payload_slice = grpc_slice_from_copied_string(str);
request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
client_args = grpc_channel_args_set_compression_algorithm(
@@ -146,8 +146,10 @@ static void request_for_disabled_algorithm(
f = begin_test(config, test_name, client_args, server_args);
cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -242,7 +244,8 @@ static void request_for_disabled_algorithm(
GPR_ASSERT(0 == strcmp(details, expected_details));
gpr_free(expected_details);
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
gpr_free(details);
grpc_metadata_array_destroy(&initial_metadata_recv);
@@ -255,7 +258,7 @@ static void request_for_disabled_algorithm(
cq_verifier_destroy(cqv);
- gpr_slice_unref(request_payload_slice);
+ grpc_slice_unref(request_payload_slice);
grpc_byte_buffer_destroy(request_payload);
grpc_byte_buffer_destroy(request_payload_recv);
@@ -277,7 +280,7 @@ static void request_with_payload_template(
grpc_compression_level server_compression_level) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice;
+ grpc_slice request_payload_slice;
grpc_byte_buffer *request_payload;
gpr_timespec deadline = five_seconds_time();
grpc_channel_args *client_args;
@@ -307,8 +310,9 @@ static void request_with_payload_template(
memset(response_str, 'y', 1023);
response_str[1023] = '\0';
- request_payload_slice = gpr_slice_from_copied_string(request_str);
- gpr_slice response_payload_slice = gpr_slice_from_copied_string(response_str);
+ request_payload_slice = grpc_slice_from_copied_string(request_str);
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string(response_str);
client_args = grpc_channel_args_set_compression_algorithm(
NULL, default_client_channel_compression_algorithm);
@@ -318,8 +322,10 @@ static void request_with_payload_template(
f = begin_test(config, test_name, client_args, server_args);
cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -458,8 +464,8 @@ static void request_with_payload_template(
grpc_byte_buffer_destroy(response_payload_recv);
}
- gpr_slice_unref(request_payload_slice);
- gpr_slice_unref(response_payload_slice);
+ grpc_slice_unref(request_payload_slice);
+ grpc_slice_unref(response_payload_slice);
memset(ops, 0, sizeof(ops));
op = ops;
@@ -491,7 +497,8 @@ static void request_with_payload_template(
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
gpr_free(details);
diff --git a/test/core/end2end/tests/connectivity.c b/test/core/end2end/tests/connectivity.c
index 4a99165666..42475c7331 100644
--- a/test/core/end2end/tests/connectivity.c
+++ b/test/core/end2end/tests/connectivity.c
@@ -68,7 +68,15 @@ static void test_connectivity(grpc_end2end_test_config config) {
gpr_thd_options thdopt = gpr_thd_options_default();
gpr_thd_id thdid;
- config.init_client(&f, NULL, NULL);
+ grpc_channel_args client_args;
+ grpc_arg arg_array[1];
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = 1000;
+ client_args.args = arg_array;
+ client_args.num_args = 1;
+
+ config.init_client(&f, &client_args);
ce.channel = f.client;
ce.cq = f.cq;
diff --git a/test/core/end2end/tests/default_host.c b/test/core/end2end/tests/default_host.c
index 5b32b50c03..208e31697e 100644
--- a/test/core/end2end/tests/default_host.c
+++ b/test/core/end2end/tests/default_host.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
grpc_end2end_test_fixture f;
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
config.init_server(&f, server_args);
return f;
}
diff --git a/test/core/end2end/tests/disappearing_server.c b/test/core/end2end/tests/disappearing_server.c
index d8d76f8c38..8ebf7e643e 100644
--- a/test/core/end2end/tests/disappearing_server.c
+++ b/test/core/end2end/tests/disappearing_server.c
@@ -79,7 +79,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void do_request_and_shutdown_server(grpc_end2end_test_fixture *f,
+static void do_request_and_shutdown_server(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture *f,
cq_verifier *cqv) {
grpc_call *c;
grpc_call *s;
@@ -96,9 +97,10 @@ static void do_request_and_shutdown_server(grpc_end2end_test_fixture *f,
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f->client, NULL, GRPC_PROPAGATE_DEFAULTS, f->cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f->client, NULL, GRPC_PROPAGATE_DEFAULTS, f->cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -174,7 +176,8 @@ static void do_request_and_shutdown_server(grpc_end2end_test_fixture *f,
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -193,15 +196,15 @@ static void disappearing_server_test(grpc_end2end_test_config config) {
gpr_log(GPR_INFO, "%s/%s", "disappearing_server_test", config.name);
- config.init_client(&f, NULL, NULL);
+ config.init_client(&f, NULL);
config.init_server(&f, NULL);
- do_request_and_shutdown_server(&f, cqv);
+ do_request_and_shutdown_server(config, &f, cqv);
/* now destroy and recreate the server */
config.init_server(&f, NULL);
- do_request_and_shutdown_server(&f, cqv);
+ do_request_and_shutdown_server(config, &f, cqv);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/empty_batch.c b/test/core/end2end/tests/empty_batch.c
index bc27b1ac14..dc8e52a60f 100644
--- a/test/core/end2end/tests/empty_batch.c
+++ b/test/core/end2end/tests/empty_batch.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,15 +97,18 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void empty_batch_body(grpc_end2end_test_fixture f) {
+static void empty_batch_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
gpr_timespec deadline = five_seconds_time();
cq_verifier *cqv = cq_verifier_create(f.cq);
grpc_call_error error;
grpc_op *op = NULL;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
error = grpc_call_start_batch(c, op, 0, tag(1), NULL);
@@ -122,7 +125,7 @@ static void test_invoke_empty_body(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_empty_body", NULL, NULL);
- empty_batch_body(f);
+ empty_batch_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
diff --git a/test/core/end2end/tests/filter_call_init_fails.c b/test/core/end2end/tests/filter_call_init_fails.c
index 0e5692f4c9..6d9351ed8c 100644
--- a/test/core/end2end/tests/filter_call_init_fails.c
+++ b/test/core/end2end/tests/filter_call_init_fails.c
@@ -61,7 +61,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -108,7 +108,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test_request(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -127,8 +128,10 @@ static void test_request(grpc_end2end_test_config config) {
char *details = NULL;
size_t details_capacity = 0;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -213,9 +216,11 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
const grpc_call_final_info *final_info,
void *and_free_memory) {}
-static void init_channel_elem(grpc_exec_ctx *exec_ctx,
- grpc_channel_element *elem,
- grpc_channel_element_args *args) {}
+static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
+ grpc_channel_element *elem,
+ grpc_channel_element_args *args) {
+ return GRPC_ERROR_NONE;
+}
static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
grpc_channel_element *elem) {}
@@ -231,6 +236,7 @@ static const grpc_channel_filter test_filter = {
init_channel_elem,
destroy_channel_elem,
grpc_call_next_get_peer,
+ grpc_channel_next_get_info,
"filter_call_init_fails"};
/*******************************************************************************
diff --git a/test/core/end2end/tests/filter_causes_close.c b/test/core/end2end/tests/filter_causes_close.c
index d5eddc7330..21905b98fa 100644
--- a/test/core/end2end/tests/filter_causes_close.c
+++ b/test/core/end2end/tests/filter_causes_close.c
@@ -58,7 +58,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -104,7 +104,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test_request(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -123,8 +124,10 @@ static void test_request(grpc_end2end_test_config config) {
char *details = NULL;
size_t details_capacity = 0;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -207,8 +210,8 @@ static void recv_im_ready(grpc_exec_ctx *exec_ctx, void *arg,
call_data *calld = elem->call_data;
if (error == GRPC_ERROR_NONE) {
// close the stream with an error.
- gpr_slice message =
- gpr_slice_from_copied_string("Failure that's not preventable.");
+ grpc_slice message =
+ grpc_slice_from_copied_string("Failure that's not preventable.");
grpc_transport_stream_op *op = grpc_make_transport_stream_op(NULL);
grpc_transport_stream_op_add_close(op, GRPC_STATUS_PERMISSION_DENIED,
&message);
@@ -240,9 +243,11 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
const grpc_call_final_info *final_info,
void *and_free_memory) {}
-static void init_channel_elem(grpc_exec_ctx *exec_ctx,
- grpc_channel_element *elem,
- grpc_channel_element_args *args) {}
+static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
+ grpc_channel_element *elem,
+ grpc_channel_element_args *args) {
+ return GRPC_ERROR_NONE;
+}
static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
grpc_channel_element *elem) {}
@@ -258,6 +263,7 @@ static const grpc_channel_filter test_filter = {
init_channel_elem,
destroy_channel_elem,
grpc_call_next_get_peer,
+ grpc_channel_next_get_info,
"filter_causes_close"};
/*******************************************************************************
diff --git a/test/core/end2end/tests/filter_latency.c b/test/core/end2end/tests/filter_latency.c
new file mode 100644
index 0000000000..e10204863b
--- /dev/null
+++ b/test/core/end2end/tests/filter_latency.c
@@ -0,0 +1,367 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <grpc/support/useful.h>
+
+#include "src/core/lib/channel/channel_stack_builder.h"
+#include "src/core/lib/surface/channel_init.h"
+#include "test/core/end2end/cq_verifier.h"
+
+enum { TIMEOUT = 200000 };
+
+static bool g_enable_filter = false;
+static gpr_mu g_mu;
+static gpr_timespec g_client_latency;
+static gpr_timespec g_server_latency;
+
+static void *tag(intptr_t t) { return (void *)t; }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char *test_name,
+ grpc_channel_args *client_args,
+ grpc_channel_args *server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_time(int n) {
+ return GRPC_TIMEOUT_SECONDS_TO_DEADLINE(n);
+}
+
+static gpr_timespec five_seconds_time(void) { return n_seconds_time(5); }
+
+static void drain_cq(grpc_completion_queue *cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_time(), NULL);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture *f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(
+ f->cq, tag(1000), GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5), NULL)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = NULL;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture *f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = NULL;
+}
+
+static void end_test(grpc_end2end_test_fixture *f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+}
+
+// Simple request via a server filter that saves the reported latency value.
+static void test_request(grpc_end2end_test_config config) {
+ grpc_call *c;
+ grpc_call *s;
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_byte_buffer *request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ gpr_timespec deadline = five_seconds_time();
+ grpc_end2end_test_fixture f =
+ begin_test(config, "filter_latency", NULL, NULL);
+ cq_verifier *cqv = cq_verifier_create(f.cq);
+ grpc_op ops[6];
+ grpc_op *op;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_metadata_array request_metadata_recv;
+ grpc_byte_buffer *request_payload_recv = NULL;
+ grpc_call_details call_details;
+ grpc_status_code status;
+ grpc_call_error error;
+ char *details = NULL;
+ size_t details_capacity = 0;
+ int was_cancelled = 2;
+
+ gpr_mu_lock(&g_mu);
+ g_client_latency = gpr_time_0(GPR_TIMESPAN);
+ g_server_latency = gpr_time_0(GPR_TIMESPAN);
+ gpr_mu_unlock(&g_mu);
+ const gpr_timespec start_time = gpr_now(GPR_CLOCK_MONOTONIC);
+
+ c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ "/foo", "foo.test.google.fr", deadline, NULL);
+ GPR_ASSERT(c);
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+ grpc_metadata_array_init(&request_metadata_recv);
+ grpc_call_details_init(&call_details);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op->data.send_initial_metadata.metadata = NULL;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message = request_payload;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata = &initial_metadata_recv;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op->data.recv_status_on_client.status_details_capacity = &details_capacity;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ error =
+ grpc_server_request_call(f.server, &s, &call_details,
+ &request_metadata_recv, f.cq, f.cq, tag(101));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
+ cq_verify(cqv);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
+ op->data.send_status_from_server.trailing_metadata_count = 0;
+ op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
+ op->data.send_status_from_server.status_details = "xyz";
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+ op->data.recv_close_on_server.cancelled = &was_cancelled;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
+ CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
+ cq_verify(cqv);
+
+ GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
+ GPR_ASSERT(0 == strcmp(details, "xyz"));
+
+ gpr_free(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ grpc_metadata_array_destroy(&request_metadata_recv);
+ grpc_call_details_destroy(&call_details);
+
+ grpc_call_destroy(s);
+ grpc_call_destroy(c);
+
+ cq_verifier_destroy(cqv);
+
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(request_payload_recv);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+
+ const gpr_timespec end_time = gpr_now(GPR_CLOCK_MONOTONIC);
+ const gpr_timespec max_latency = gpr_time_sub(end_time, start_time);
+
+ // Perform checks after test tear-down
+ // Guards against the case that there's outstanding channel-related work on a
+ // call prior to verification
+ gpr_mu_lock(&g_mu);
+ GPR_ASSERT(gpr_time_cmp(max_latency, g_client_latency) >= 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_0(GPR_TIMESPAN), g_client_latency) <= 0);
+ GPR_ASSERT(gpr_time_cmp(max_latency, g_server_latency) >= 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_0(GPR_TIMESPAN), g_server_latency) <= 0);
+ // Server latency should always be smaller than client latency, however since
+ // we only calculate latency at destruction time, and that might mean that we
+ // need to wait for outstanding channel-related work, this isn't verifiable
+ // right now (the server MAY hold on to the call for longer than the client).
+ // GPR_ASSERT(gpr_time_cmp(g_server_latency, g_client_latency) < 0);
+ gpr_mu_unlock(&g_mu);
+}
+
+/*******************************************************************************
+ * Test latency filter
+ */
+
+static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem,
+ grpc_call_element_args *args) {
+ return GRPC_ERROR_NONE;
+}
+
+static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem,
+ const grpc_call_final_info *final_info,
+ void *and_free_memory) {
+ gpr_mu_lock(&g_mu);
+ g_client_latency = final_info->stats.latency;
+ gpr_mu_unlock(&g_mu);
+}
+
+static void server_destroy_call_elem(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem,
+ const grpc_call_final_info *final_info,
+ void *and_free_memory) {
+ gpr_mu_lock(&g_mu);
+ g_server_latency = final_info->stats.latency;
+ gpr_mu_unlock(&g_mu);
+}
+
+static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
+ grpc_channel_element *elem,
+ grpc_channel_element_args *args) {
+ return GRPC_ERROR_NONE;
+}
+
+static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
+ grpc_channel_element *elem) {}
+
+static const grpc_channel_filter test_client_filter = {
+ grpc_call_next_op,
+ grpc_channel_next_op,
+ 0,
+ init_call_elem,
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
+ client_destroy_call_elem,
+ 0,
+ init_channel_elem,
+ destroy_channel_elem,
+ grpc_call_next_get_peer,
+ grpc_channel_next_get_info,
+ "client_filter_latency"};
+
+static const grpc_channel_filter test_server_filter = {
+ grpc_call_next_op,
+ grpc_channel_next_op,
+ 0,
+ init_call_elem,
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
+ server_destroy_call_elem,
+ 0,
+ init_channel_elem,
+ destroy_channel_elem,
+ grpc_call_next_get_peer,
+ grpc_channel_next_get_info,
+ "server_filter_latency"};
+
+/*******************************************************************************
+ * Registration
+ */
+
+static bool maybe_add_filter(grpc_channel_stack_builder *builder, void *arg) {
+ grpc_channel_filter *filter = arg;
+ if (g_enable_filter) {
+ // Want to add the filter as close to the end as possible, to make
+ // sure that all of the filters work well together. However, we
+ // can't add it at the very end, because the connected channel filter
+ // must be the last one. So we add it right before the last one.
+ grpc_channel_stack_builder_iterator *it =
+ grpc_channel_stack_builder_create_iterator_at_last(builder);
+ GPR_ASSERT(grpc_channel_stack_builder_move_prev(it));
+ const bool retval =
+ grpc_channel_stack_builder_add_filter_before(it, filter, NULL, NULL);
+ grpc_channel_stack_builder_iterator_destroy(it);
+ return retval;
+ } else {
+ return true;
+ }
+}
+
+static void init_plugin(void) {
+ gpr_mu_init(&g_mu);
+ grpc_channel_init_register_stage(GRPC_CLIENT_CHANNEL, INT_MAX,
+ maybe_add_filter,
+ (void *)&test_client_filter);
+ grpc_channel_init_register_stage(GRPC_CLIENT_DIRECT_CHANNEL, INT_MAX,
+ maybe_add_filter,
+ (void *)&test_client_filter);
+ grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX,
+ maybe_add_filter,
+ (void *)&test_server_filter);
+}
+
+static void destroy_plugin(void) { gpr_mu_destroy(&g_mu); }
+
+void filter_latency(grpc_end2end_test_config config) {
+ g_enable_filter = true;
+ test_request(config);
+ g_enable_filter = false;
+}
+
+void filter_latency_pre_init(void) {
+ grpc_register_plugin(init_plugin, destroy_plugin);
+}
diff --git a/test/core/end2end/tests/graceful_server_shutdown.c b/test/core/end2end/tests/graceful_server_shutdown.c
index e098a63f8b..5fecadbe44 100644
--- a/test/core/end2end/tests/graceful_server_shutdown.c
+++ b/test/core/end2end/tests/graceful_server_shutdown.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -111,8 +111,10 @@ static void test_early_server_shutdown_finishes_inflight_calls(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -190,7 +192,8 @@ static void test_early_server_shutdown_finishes_inflight_calls(
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
diff --git a/test/core/end2end/tests/high_initial_seqno.c b/test/core/end2end/tests/high_initial_seqno.c
index 193706b8cf..01a4909ccd 100644
--- a/test/core/end2end/tests/high_initial_seqno.c
+++ b/test/core/end2end/tests/high_initial_seqno.c
@@ -57,7 +57,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -99,7 +99,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -116,9 +117,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -189,7 +191,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -229,7 +232,7 @@ static void test_invoke_10_simple_requests(grpc_end2end_test_config config,
initial_sequence_number);
f = begin_test(config, name, &client_args, NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f);
+ simple_request_body(config, f);
gpr_log(GPR_INFO, "Passed simple request %d", i);
}
end_test(&f);
diff --git a/test/core/end2end/tests/hpack_size.c b/test/core/end2end/tests/hpack_size.c
index 78afdb5594..cec8b2faae 100644
--- a/test/core/end2end/tests/hpack_size.c
+++ b/test/core/end2end/tests/hpack_size.c
@@ -197,7 +197,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -239,7 +239,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f, size_t index) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f, size_t index) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -268,9 +269,10 @@ static void simple_request_body(grpc_end2end_test_fixture f, size_t index) {
extra_metadata[2].value = dragons[index % GPR_ARRAY_SIZE(dragons)];
extra_metadata[2].value_length = strlen(extra_metadata[2].value);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -342,7 +344,8 @@ static void simple_request_body(grpc_end2end_test_fixture f, size_t index) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -383,7 +386,7 @@ static void test_size(grpc_end2end_test_config config, int encode_size,
f = begin_test(config, name, encode_size != 4096 ? &client_args : NULL,
decode_size != 4096 ? &server_args : NULL);
for (i = 0; i < 4 * GPR_ARRAY_SIZE(hobbits); i++) {
- simple_request_body(f, i);
+ simple_request_body(config, f, i);
}
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/idempotent_request.c b/test/core/end2end/tests/idempotent_request.c
index b53e00386b..4f6d3bb808 100644
--- a/test/core/end2end/tests/idempotent_request.c
+++ b/test/core/end2end/tests/idempotent_request.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -115,9 +116,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
int was_cancelled = 2;
char *peer;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
peer = grpc_call_get_peer(c);
@@ -202,7 +204,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST == call_details.flags);
GPR_ASSERT(was_cancelled == 1);
@@ -222,7 +225,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_simple_request", NULL, NULL);
- simple_request_body(f);
+ simple_request_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
@@ -232,7 +235,7 @@ static void test_invoke_10_simple_requests(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f =
begin_test(config, "test_invoke_10_simple_requests", NULL, NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f);
+ simple_request_body(config, f);
gpr_log(GPR_INFO, "Passed simple request %d", i);
}
end_test(&f);
diff --git a/test/core/end2end/tests/invoke_large_request.c b/test/core/end2end/tests/invoke_large_request.c
index 3820504e11..24abfa2ea0 100644
--- a/test/core/end2end/tests/invoke_large_request.c
+++ b/test/core/end2end/tests/invoke_large_request.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -94,9 +94,9 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static gpr_slice large_slice(void) {
- gpr_slice slice = gpr_slice_malloc(1000000);
- memset(GPR_SLICE_START_PTR(slice), 'x', GPR_SLICE_LENGTH(slice));
+static grpc_slice large_slice(void) {
+ grpc_slice slice = grpc_slice_malloc(1000000);
+ memset(GRPC_SLICE_START_PTR(slice), 'x', GRPC_SLICE_LENGTH(slice));
return slice;
}
@@ -120,8 +120,8 @@ static void test_invoke_large_request(grpc_end2end_test_config config,
begin_test(config, name, &channel_args, &channel_args);
gpr_free(name);
- gpr_slice request_payload_slice = large_slice();
- gpr_slice response_payload_slice = large_slice();
+ grpc_slice request_payload_slice = large_slice();
+ grpc_slice response_payload_slice = large_slice();
grpc_call *c;
grpc_call *s;
grpc_byte_buffer *request_payload =
@@ -144,8 +144,10 @@ static void test_invoke_large_request(grpc_end2end_test_config config,
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -244,7 +246,8 @@ static void test_invoke_large_request(grpc_end2end_test_config config,
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -262,8 +265,8 @@ static void test_invoke_large_request(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload);
grpc_byte_buffer_destroy(request_payload_recv);
grpc_byte_buffer_destroy(response_payload_recv);
- gpr_slice_unref(request_payload_slice);
- gpr_slice_unref(response_payload_slice);
+ grpc_slice_unref(request_payload_slice);
+ grpc_slice_unref(response_payload_slice);
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/large_metadata.c b/test/core/end2end/tests/large_metadata.c
index 6107836b12..69b4b24b06 100644
--- a/test/core/end2end/tests/large_metadata.c
+++ b/test/core/end2end/tests/large_metadata.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -99,7 +99,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test_request_with_large_metadata(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -125,8 +126,10 @@ static void test_request_with_large_metadata(grpc_end2end_test_config config) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
meta.key = "key";
@@ -227,7 +230,8 @@ static void test_request_with_large_metadata(grpc_end2end_test_config config) {
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
GPR_ASSERT(contains_metadata(&request_metadata_recv, "key", meta.value));
diff --git a/test/core/end2end/tests/load_reporting_hook.c b/test/core/end2end/tests/load_reporting_hook.c
index 0915730a02..5b75f26bd2 100644
--- a/test/core/end2end/tests/load_reporting_hook.c
+++ b/test/core/end2end/tests/load_reporting_hook.c
@@ -78,7 +78,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -121,14 +121,13 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void request_response_with_payload(grpc_end2end_test_fixture f,
- const char *method_name,
- const char *request_msg,
- const char *response_msg,
- grpc_metadata *initial_lr_metadata,
- grpc_metadata *trailing_lr_metadata) {
- gpr_slice request_payload_slice = gpr_slice_from_static_string(request_msg);
- gpr_slice response_payload_slice = gpr_slice_from_static_string(response_msg);
+static void request_response_with_payload(
+ grpc_end2end_test_config config, grpc_end2end_test_fixture f,
+ const char *method_name, const char *request_msg, const char *response_msg,
+ grpc_metadata *initial_lr_metadata, grpc_metadata *trailing_lr_metadata) {
+ grpc_slice request_payload_slice = grpc_slice_from_static_string(request_msg);
+ grpc_slice response_payload_slice =
+ grpc_slice_from_static_string(response_msg);
grpc_call *c;
grpc_call *s;
grpc_byte_buffer *request_payload =
@@ -151,9 +150,10 @@ static void request_response_with_payload(grpc_end2end_test_fixture f,
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- method_name, "foo.test.google.fr", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, method_name,
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -307,8 +307,9 @@ static void test_load_reporting_hook(grpc_end2end_test_config config) {
memset(&trailing_lr_metadata.internal_data, 0,
sizeof(trailing_lr_metadata.internal_data));
- request_response_with_payload(f, method_name, request_msg, response_msg,
- &initial_lr_metadata, &trailing_lr_metadata);
+ request_response_with_payload(config, f, method_name, request_msg,
+ response_msg, &initial_lr_metadata,
+ &trailing_lr_metadata);
end_test(&f);
grpc_channel_args_destroy(lr_server_args);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/max_concurrent_streams.c b/test/core/end2end/tests/max_concurrent_streams.c
index 6c7bf9f531..9338bc5f0d 100644
--- a/test/core/end2end/tests/max_concurrent_streams.c
+++ b/test/core/end2end/tests/max_concurrent_streams.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -95,7 +95,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -112,9 +113,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -185,7 +187,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -250,20 +253,22 @@ static void test_max_concurrent_streams(grpc_end2end_test_config config) {
/* perform a ping-pong to ensure that settings have had a chance to round
trip */
- simple_request_body(f);
+ simple_request_body(config, f);
/* perform another one to make sure that the one stream case still works */
- simple_request_body(f);
+ simple_request_body(config, f);
/* start two requests - ensuring that the second is not accepted until
the first completes */
deadline = n_seconds_time(1000);
- c1 = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/alpha", "foo.test.google.fr:1234", deadline,
- NULL);
+ c1 = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/alpha",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c1);
- c2 = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/beta", "foo.test.google.fr:1234", deadline,
- NULL);
+ c2 = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/beta",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c2);
GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c
index e698987a0a..c222d9dfae 100644
--- a/test/core/end2end/tests/max_message_length.c
+++ b/test/core/end2end/tests/max_message_length.c
@@ -41,6 +41,11 @@
#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include <grpc/support/useful.h>
+
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/transport/metadata.h"
+#include "src/core/lib/transport/service_config.h"
+
#include "test/core/end2end/cq_verifier.h"
static void *tag(intptr_t t) { return (void *)t; }
@@ -48,8 +53,7 @@ static void *tag(intptr_t t) { return (void *)t; }
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
const char *test_name,
grpc_channel_args *client_args,
- grpc_channel_args *server_args,
- const char *query_args) {
+ grpc_channel_args *server_args) {
grpc_end2end_test_fixture f;
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
// We intentionally do not pass the client and server args to
@@ -57,7 +61,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
// proxy, only on the backend server.
f = config.create_fixture(NULL, NULL);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, query_args);
+ config.init_client(&f, client_args);
return f;
}
@@ -109,14 +113,13 @@ static void test_max_message_length_on_request(grpc_end2end_test_config config,
send_limit, use_service_config);
grpc_end2end_test_fixture f;
- grpc_arg channel_arg;
- grpc_channel_args channel_args;
grpc_call *c = NULL;
grpc_call *s = NULL;
cq_verifier *cqv;
grpc_op ops[6];
grpc_op *op;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *recv_payload = NULL;
@@ -130,37 +133,50 @@ static void test_max_message_length_on_request(grpc_end2end_test_config config,
size_t details_capacity = 0;
int was_cancelled = 2;
- char *query_args = NULL;
grpc_channel_args *client_args = NULL;
grpc_channel_args *server_args = NULL;
if (use_service_config) {
// We don't currently support service configs on the server side.
GPR_ASSERT(send_limit);
- query_args =
- "method_name=/service/method"
- "&max_request_message_bytes=5";
+ grpc_arg arg;
+ arg.type = GRPC_ARG_STRING;
+ arg.key = GRPC_ARG_SERVICE_CONFIG;
+ arg.value.string =
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"maxRequestMessageBytes\": \"5\"\n"
+ " } ]\n"
+ "}";
+ client_args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
} else {
// Set limit via channel args.
- channel_arg.key = send_limit ? GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
- : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
- channel_arg.type = GRPC_ARG_INTEGER;
- channel_arg.value.integer = 5;
- channel_args.num_args = 1;
- channel_args.args = &channel_arg;
+ grpc_arg arg;
+ arg.key = send_limit ? GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
+ arg.type = GRPC_ARG_INTEGER;
+ arg.value.integer = 5;
+ grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
if (send_limit) {
- client_args = &channel_args;
+ client_args = args;
} else {
- server_args = &channel_args;
+ server_args = args;
}
}
f = begin_test(config, "test_max_request_message_length", client_args,
- server_args, query_args);
+ server_args);
+ if (client_args != NULL) grpc_channel_args_destroy(client_args);
+ if (server_args != NULL) grpc_channel_args_destroy(server_args);
+
cqv = cq_verifier_create(f.cq);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/service/method", "foo.test.google.fr:1234",
- gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/service/method",
+ get_host_override_string("foo.test.google.fr:1234", config),
+ gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -233,7 +249,8 @@ static void test_max_message_length_on_request(grpc_end2end_test_config config,
cq_verify(cqv);
GPR_ASSERT(0 == strcmp(call_details.method, "/service/method"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
done:
@@ -270,15 +287,13 @@ static void test_max_message_length_on_response(grpc_end2end_test_config config,
send_limit, use_service_config);
grpc_end2end_test_fixture f;
- grpc_arg channel_arg;
- grpc_channel_args channel_args;
grpc_call *c = NULL;
grpc_call *s = NULL;
cq_verifier *cqv;
grpc_op ops[6];
grpc_op *op;
- gpr_slice response_payload_slice =
- gpr_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *response_payload =
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
grpc_byte_buffer *recv_payload = NULL;
@@ -292,32 +307,44 @@ static void test_max_message_length_on_response(grpc_end2end_test_config config,
size_t details_capacity = 0;
int was_cancelled = 2;
- char *query_args = NULL;
grpc_channel_args *client_args = NULL;
grpc_channel_args *server_args = NULL;
if (use_service_config) {
// We don't currently support service configs on the server side.
GPR_ASSERT(!send_limit);
- query_args =
- "method_name=/service/method"
- "&max_response_message_bytes=5";
+ grpc_arg arg;
+ arg.type = GRPC_ARG_STRING;
+ arg.key = GRPC_ARG_SERVICE_CONFIG;
+ arg.value.string =
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"maxResponseMessageBytes\": \"5\"\n"
+ " } ]\n"
+ "}";
+ client_args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
} else {
// Set limit via channel args.
- channel_arg.key = send_limit ? GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
- : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
- channel_arg.type = GRPC_ARG_INTEGER;
- channel_arg.value.integer = 5;
- channel_args.num_args = 1;
- channel_args.args = &channel_arg;
+ grpc_arg arg;
+ arg.key = send_limit ? GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
+ arg.type = GRPC_ARG_INTEGER;
+ arg.value.integer = 5;
+ grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
if (send_limit) {
- server_args = &channel_args;
+ server_args = args;
} else {
- client_args = &channel_args;
+ client_args = args;
}
}
f = begin_test(config, "test_max_response_message_length", client_args,
- server_args, query_args);
+ server_args);
+ if (client_args != NULL) grpc_channel_args_destroy(client_args);
+ if (server_args != NULL) grpc_channel_args_destroy(server_args);
+
cqv = cq_verifier_create(f.cq);
c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
@@ -402,7 +429,6 @@ static void test_max_message_length_on_response(grpc_end2end_test_config config,
GPR_ASSERT(0 == strcmp(call_details.method, "/service/method"));
GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
- GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(status == GRPC_STATUS_INVALID_ARGUMENT);
GPR_ASSERT(strcmp(details,
@@ -436,12 +462,10 @@ void max_message_length(grpc_end2end_test_config config) {
false /* use_service_config */);
test_max_message_length_on_response(config, true /* send_limit */,
false /* use_service_config */);
- if (config.feature_mask & FEATURE_MASK_SUPPORTS_QUERY_ARGS) {
- test_max_message_length_on_request(config, true /* send_limit */,
- true /* use_service_config */);
- test_max_message_length_on_response(config, false /* send_limit */,
- true /* use_service_config */);
- }
+ test_max_message_length_on_request(config, true /* send_limit */,
+ true /* use_service_config */);
+ test_max_message_length_on_response(config, false /* send_limit */,
+ true /* use_service_config */);
}
void max_message_length_pre_init(void) {}
diff --git a/test/core/end2end/tests/negative_deadline.c b/test/core/end2end/tests/negative_deadline.c
index 12c6a0f2bd..929777d39e 100644
--- a/test/core/end2end/tests/negative_deadline.c
+++ b/test/core/end2end/tests/negative_deadline.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f, size_t num_ops) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f, size_t num_ops) {
grpc_call *c;
gpr_timespec deadline = gpr_inf_past(GPR_CLOCK_REALTIME);
cq_verifier *cqv = cq_verifier_create(f.cq);
@@ -112,9 +113,10 @@ static void simple_request_body(grpc_end2end_test_fixture f, size_t num_ops) {
gpr_log(GPR_DEBUG, "test with %" PRIuPTR " ops", num_ops);
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -167,7 +169,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config,
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_simple_request", NULL, NULL);
- simple_request_body(f, num_ops);
+ simple_request_body(config, f, num_ops);
end_test(&f);
config.tear_down_data(&f);
}
diff --git a/test/core/end2end/tests/network_status_change.c b/test/core/end2end/tests/network_status_change.c
index 8d6b8f8784..2ebda2ccb8 100644
--- a/test/core/end2end/tests/network_status_change.c
+++ b/test/core/end2end/tests/network_status_change.c
@@ -56,7 +56,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -102,7 +102,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test_invoke_network_status_change(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -122,8 +123,10 @@ static void test_invoke_network_status_change(grpc_end2end_test_config config) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -212,8 +215,8 @@ static void test_invoke_network_status_change(grpc_end2end_test_config config) {
// Expected behavior of a RPC when network is lost.
GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE);
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
- GPR_ASSERT(was_cancelled == 0);
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
gpr_free(details);
grpc_metadata_array_destroy(&initial_metadata_recv);
diff --git a/test/core/end2end/tests/no_logging.c b/test/core/end2end/tests/no_logging.c
index 8f9ef78ba2..54614cb029 100644
--- a/test/core/end2end/tests/no_logging.c
+++ b/test/core/end2end/tests/no_logging.c
@@ -83,7 +83,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -125,7 +125,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -143,9 +144,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
int was_cancelled = 2;
char *peer;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
peer = grpc_call_get_peer(c);
@@ -227,7 +229,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(0 == call_details.flags);
GPR_ASSERT(was_cancelled == 1);
@@ -248,7 +251,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config) {
f = begin_test(config, "test_invoke_simple_request_with_no_error_logging",
NULL, NULL);
- simple_request_body(f);
+ simple_request_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
@@ -259,10 +262,10 @@ static void test_invoke_10_simple_requests(grpc_end2end_test_config config) {
begin_test(config, "test_invoke_10_simple_requests_with_no_error_logging",
NULL, NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f);
+ simple_request_body(config, f);
gpr_log(GPR_INFO, "Passed simple request %d", i);
}
- simple_request_body(f);
+ simple_request_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
@@ -283,10 +286,10 @@ static void test_no_logging_in_one_request(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f =
begin_test(config, "test_no_logging_in_last_request", NULL, NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f);
+ simple_request_body(config, f);
}
gpr_atm_no_barrier_store(&g_log_func, (gpr_atm)test_no_log);
- simple_request_body(f);
+ simple_request_body(config, f);
gpr_atm_no_barrier_store(&g_log_func, (gpr_atm)gpr_default_log);
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/no_op.c b/test/core/end2end/tests/no_op.c
index a1c61cb8d1..8b29c219dc 100644
--- a/test/core/end2end/tests/no_op.c
+++ b/test/core/end2end/tests/no_op.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
diff --git a/test/core/end2end/tests/payload.c b/test/core/end2end/tests/payload.c
index 8353ea32fd..4a88c5f2a8 100644
--- a/test/core/end2end/tests/payload.c
+++ b/test/core/end2end/tests/payload.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -95,8 +95,9 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-/* Creates and returns a gpr_slice containing random alphanumeric characters. */
-static gpr_slice generate_random_slice() {
+/* Creates and returns a grpc_slice containing random alphanumeric characters.
+ */
+static grpc_slice generate_random_slice() {
size_t i;
static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
char *output;
@@ -106,17 +107,18 @@ static gpr_slice generate_random_slice() {
output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
}
output[output_size - 1] = '\0';
- gpr_slice out = gpr_slice_from_copied_string(output);
+ grpc_slice out = grpc_slice_from_copied_string(output);
gpr_free(output);
return out;
}
-static void request_response_with_payload(grpc_end2end_test_fixture f) {
+static void request_response_with_payload(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
/* Create large request and response bodies. These are big enough to require
* multiple round trips to deliver to the peer, and their exact contents of
* will be verified on completion. */
- gpr_slice request_payload_slice = generate_random_slice();
- gpr_slice response_payload_slice = generate_random_slice();
+ grpc_slice request_payload_slice = generate_random_slice();
+ grpc_slice response_payload_slice = generate_random_slice();
grpc_call *c;
grpc_call *s;
@@ -124,7 +126,7 @@ static void request_response_with_payload(grpc_end2end_test_fixture f) {
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
- gpr_timespec deadline = five_seconds_time();
+ gpr_timespec deadline = n_seconds_time(60);
cq_verifier *cqv = cq_verifier_create(f.cq);
grpc_op ops[6];
grpc_op *op;
@@ -140,8 +142,10 @@ static void request_response_with_payload(grpc_end2end_test_fixture f) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -240,7 +244,8 @@ static void request_response_with_payload(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_slice(request_payload_recv, request_payload_slice));
GPR_ASSERT(
@@ -269,7 +274,7 @@ static void test_invoke_request_response_with_payload(
grpc_end2end_test_config config) {
grpc_end2end_test_fixture f = begin_test(
config, "test_invoke_request_response_with_payload", NULL, NULL);
- request_response_with_payload(f);
+ request_response_with_payload(config, f);
end_test(&f);
config.tear_down_data(&f);
}
@@ -280,7 +285,7 @@ static void test_invoke_10_request_response_with_payload(
grpc_end2end_test_fixture f = begin_test(
config, "test_invoke_10_request_response_with_payload", NULL, NULL);
for (i = 0; i < 10; i++) {
- request_response_with_payload(f);
+ request_response_with_payload(config, f);
}
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/ping.c b/test/core/end2end/tests/ping.c
index f7e119cc2f..5e5169dedc 100644
--- a/test/core/end2end/tests/ping.c
+++ b/test/core/end2end/tests/ping.c
@@ -48,7 +48,7 @@ static void test_ping(grpc_end2end_test_config config) {
grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
int i;
- config.init_client(&f, NULL, NULL);
+ config.init_client(&f, NULL);
config.init_server(&f, NULL);
grpc_channel_ping(f.client, f.cq, tag(0), NULL);
diff --git a/test/core/end2end/tests/ping_pong_streaming.c b/test/core/end2end/tests/ping_pong_streaming.c
index 30ea80043b..0a1566e9c2 100644
--- a/test/core/end2end/tests/ping_pong_streaming.c
+++ b/test/core/end2end/tests/ping_pong_streaming.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -120,12 +120,15 @@ static void test_pingpong_streaming(grpc_end2end_test_config config,
grpc_byte_buffer *response_payload;
grpc_byte_buffer *response_payload_recv;
int i;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
-
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
+
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -228,8 +231,8 @@ static void test_pingpong_streaming(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload_recv);
}
- gpr_slice_unref(request_payload_slice);
- gpr_slice_unref(response_payload_slice);
+ grpc_slice_unref(request_payload_slice);
+ grpc_slice_unref(response_payload_slice);
memset(ops, 0, sizeof(ops));
op = ops;
diff --git a/test/core/end2end/tests/registered_call.c b/test/core/end2end/tests/registered_call.c
index 4c094e1b8b..6594b420b9 100644
--- a/test/core/end2end/tests/registered_call.c
+++ b/test/core/end2end/tests/registered_call.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f, void *rc) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f, void *rc) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -186,7 +187,8 @@ static void simple_request_body(grpc_end2end_test_fixture f, void *rc) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -204,10 +206,11 @@ static void simple_request_body(grpc_end2end_test_fixture f, void *rc) {
static void test_invoke_simple_request(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f =
begin_test(config, "test_invoke_simple_request", NULL, NULL);
- void *rc = grpc_channel_register_call(f.client, "/foo",
- "foo.test.google.fr:1234", NULL);
+ void *rc = grpc_channel_register_call(
+ f.client, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), NULL);
- simple_request_body(f, rc);
+ simple_request_body(config, f, rc);
end_test(&f);
config.tear_down_data(&f);
}
@@ -216,11 +219,12 @@ static void test_invoke_10_simple_requests(grpc_end2end_test_config config) {
int i;
grpc_end2end_test_fixture f =
begin_test(config, "test_invoke_10_simple_requests", NULL, NULL);
- void *rc = grpc_channel_register_call(f.client, "/foo",
- "foo.test.google.fr:1234", NULL);
+ void *rc = grpc_channel_register_call(
+ f.client, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f, rc);
+ simple_request_body(config, f, rc);
gpr_log(GPR_INFO, "Passed simple request %d", i);
}
end_test(&f);
diff --git a/test/core/end2end/tests/request_with_flags.c b/test/core/end2end/tests/request_with_flags.c
index 69ad69af66..9c18e155f3 100644
--- a/test/core/end2end/tests/request_with_flags.c
+++ b/test/core/end2end/tests/request_with_flags.c
@@ -54,7 +54,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -100,7 +100,8 @@ static void test_invoke_request_with_flags(
grpc_end2end_test_config config, uint32_t *flags_for_op,
grpc_call_error call_start_batch_expected_result) {
grpc_call *c;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -120,8 +121,10 @@ static void test_invoke_request_with_flags(
size_t details_capacity = 0;
grpc_call_error expectation;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
diff --git a/test/core/end2end/tests/request_with_payload.c b/test/core/end2end/tests/request_with_payload.c
index 56ff83cdb4..c84e3ac5b5 100644
--- a/test/core/end2end/tests/request_with_payload.c
+++ b/test/core/end2end/tests/request_with_payload.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -99,7 +99,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -119,8 +120,10 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -208,7 +211,8 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
diff --git a/test/core/end2end/tests/resource_quota_server.c b/test/core/end2end/tests/resource_quota_server.c
new file mode 100644
index 0000000000..c919faea89
--- /dev/null
+++ b/test/core/end2end/tests/resource_quota_server.c
@@ -0,0 +1,381 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <grpc/support/useful.h>
+#include "test/core/end2end/cq_verifier.h"
+
+static void *tag(intptr_t t) { return (void *)t; }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char *test_name,
+ grpc_channel_args *client_args,
+ grpc_channel_args *server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_time(int n) {
+ return GRPC_TIMEOUT_SECONDS_TO_DEADLINE(n);
+}
+
+static gpr_timespec five_seconds_time(void) { return n_seconds_time(5); }
+
+static void drain_cq(grpc_completion_queue *cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_time(), NULL);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture *f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(
+ f->cq, tag(1000), GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5), NULL)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = NULL;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture *f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = NULL;
+}
+
+static void end_test(grpc_end2end_test_fixture *f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+}
+
+/* Creates and returns a grpc_slice containing random alphanumeric characters.
+ */
+static grpc_slice generate_random_slice() {
+ size_t i;
+ static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
+ char *output;
+ const size_t output_size = 1024 * 1024;
+ output = gpr_malloc(output_size);
+ for (i = 0; i < output_size - 1; ++i) {
+ output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
+ }
+ output[output_size - 1] = '\0';
+ grpc_slice out = grpc_slice_from_copied_string(output);
+ gpr_free(output);
+ return out;
+}
+
+void resource_quota_server(grpc_end2end_test_config config) {
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("test_server");
+ grpc_resource_quota_resize(resource_quota, 5 * 1024 * 1024);
+
+#define NUM_CALLS 100
+#define CLIENT_BASE_TAG 1000
+#define SERVER_START_BASE_TAG 2000
+#define SERVER_RECV_BASE_TAG 3000
+#define SERVER_END_BASE_TAG 4000
+
+ grpc_arg arg;
+ arg.key = GRPC_ARG_RESOURCE_QUOTA;
+ arg.type = GRPC_ARG_POINTER;
+ arg.value.pointer.p = resource_quota;
+ arg.value.pointer.vtable = grpc_resource_quota_arg_vtable();
+ grpc_channel_args args = {1, &arg};
+
+ grpc_end2end_test_fixture f =
+ begin_test(config, "resource_quota_server", NULL, &args);
+
+ /* Create large request and response bodies. These are big enough to require
+ * multiple round trips to deliver to the peer, and their exact contents of
+ * will be verified on completion. */
+ grpc_slice request_payload_slice = generate_random_slice();
+
+ grpc_call **client_calls = malloc(sizeof(grpc_call *) * NUM_CALLS);
+ grpc_call **server_calls = malloc(sizeof(grpc_call *) * NUM_CALLS);
+ grpc_metadata_array *initial_metadata_recv =
+ malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+ grpc_metadata_array *trailing_metadata_recv =
+ malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+ grpc_metadata_array *request_metadata_recv =
+ malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+ grpc_call_details *call_details =
+ malloc(sizeof(grpc_call_details) * NUM_CALLS);
+ grpc_status_code *status = malloc(sizeof(grpc_status_code) * NUM_CALLS);
+ char **details = malloc(sizeof(char *) * NUM_CALLS);
+ size_t *details_capacity = malloc(sizeof(size_t) * NUM_CALLS);
+ grpc_byte_buffer **request_payload_recv =
+ malloc(sizeof(grpc_byte_buffer *) * NUM_CALLS);
+ int *was_cancelled = malloc(sizeof(int) * NUM_CALLS);
+ grpc_call_error error;
+ int pending_client_calls = 0;
+ int pending_server_start_calls = 0;
+ int pending_server_recv_calls = 0;
+ int pending_server_end_calls = 0;
+ int cancelled_calls_on_client = 0;
+ int cancelled_calls_on_server = 0;
+
+ grpc_byte_buffer *request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+
+ grpc_op ops[6];
+ grpc_op *op;
+
+ for (int i = 0; i < NUM_CALLS; i++) {
+ grpc_metadata_array_init(&initial_metadata_recv[i]);
+ grpc_metadata_array_init(&trailing_metadata_recv[i]);
+ grpc_metadata_array_init(&request_metadata_recv[i]);
+ grpc_call_details_init(&call_details[i]);
+ details[i] = NULL;
+ details_capacity[i] = 0;
+ request_payload_recv[i] = NULL;
+ was_cancelled[i] = 0;
+ }
+
+ for (int i = 0; i < NUM_CALLS; i++) {
+ error = grpc_server_request_call(
+ f.server, &server_calls[i], &call_details[i], &request_metadata_recv[i],
+ f.cq, f.cq, tag(SERVER_START_BASE_TAG + i));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ pending_server_start_calls++;
+ }
+
+ for (int i = 0; i < NUM_CALLS; i++) {
+ client_calls[i] = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ "foo.test.google.fr", n_seconds_time(60), NULL);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message = request_payload;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata = &initial_metadata_recv[i];
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata =
+ &trailing_metadata_recv[i];
+ op->data.recv_status_on_client.status = &status[i];
+ op->data.recv_status_on_client.status_details = &details[i];
+ op->data.recv_status_on_client.status_details_capacity =
+ &details_capacity[i];
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error = grpc_call_start_batch(client_calls[i], ops, (size_t)(op - ops),
+ tag(CLIENT_BASE_TAG + i), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ pending_client_calls++;
+ }
+
+ while (pending_client_calls + pending_server_recv_calls +
+ pending_server_end_calls >
+ 0) {
+ grpc_event ev = grpc_completion_queue_next(f.cq, n_seconds_time(60), NULL);
+ GPR_ASSERT(ev.type == GRPC_OP_COMPLETE);
+
+ int ev_tag = (int)(intptr_t)ev.tag;
+ if (ev_tag < CLIENT_BASE_TAG) {
+ abort(); /* illegal tag */
+ } else if (ev_tag < SERVER_START_BASE_TAG) {
+ /* client call finished */
+ int call_id = ev_tag - CLIENT_BASE_TAG;
+ GPR_ASSERT(call_id >= 0);
+ GPR_ASSERT(call_id < NUM_CALLS);
+ switch (status[call_id]) {
+ case GRPC_STATUS_RESOURCE_EXHAUSTED:
+ cancelled_calls_on_client++;
+ break;
+ case GRPC_STATUS_OK:
+ break;
+ default:
+ gpr_log(GPR_ERROR, "Unexpected status code: %d", status[call_id]);
+ abort();
+ }
+ GPR_ASSERT(pending_client_calls > 0);
+
+ grpc_metadata_array_destroy(&initial_metadata_recv[call_id]);
+ grpc_metadata_array_destroy(&trailing_metadata_recv[call_id]);
+ grpc_call_destroy(client_calls[call_id]);
+ gpr_free(details[call_id]);
+
+ pending_client_calls--;
+ } else if (ev_tag < SERVER_RECV_BASE_TAG) {
+ /* new incoming call to the server */
+ int call_id = ev_tag - SERVER_START_BASE_TAG;
+ GPR_ASSERT(call_id >= 0);
+ GPR_ASSERT(call_id < NUM_CALLS);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message = &request_payload_recv[call_id];
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error =
+ grpc_call_start_batch(server_calls[call_id], ops, (size_t)(op - ops),
+ tag(SERVER_RECV_BASE_TAG + call_id), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ GPR_ASSERT(pending_server_start_calls > 0);
+ pending_server_start_calls--;
+ pending_server_recv_calls++;
+
+ grpc_call_details_destroy(&call_details[call_id]);
+ grpc_metadata_array_destroy(&request_metadata_recv[call_id]);
+ } else if (ev_tag < SERVER_END_BASE_TAG) {
+ /* finished read on the server */
+ int call_id = ev_tag - SERVER_RECV_BASE_TAG;
+ GPR_ASSERT(call_id >= 0);
+ GPR_ASSERT(call_id < NUM_CALLS);
+
+ if (ev.success) {
+ if (request_payload_recv[call_id] != NULL) {
+ grpc_byte_buffer_destroy(request_payload_recv[call_id]);
+ request_payload_recv[call_id] = NULL;
+ }
+ } else {
+ GPR_ASSERT(request_payload_recv[call_id] == NULL);
+ }
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+ op->data.recv_close_on_server.cancelled = &was_cancelled[call_id];
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
+ op->data.send_status_from_server.trailing_metadata_count = 0;
+ op->data.send_status_from_server.status = GRPC_STATUS_OK;
+ op->data.send_status_from_server.status_details = "xyz";
+ op->flags = 0;
+ op->reserved = NULL;
+ op++;
+ error =
+ grpc_call_start_batch(server_calls[call_id], ops, (size_t)(op - ops),
+ tag(SERVER_END_BASE_TAG + call_id), NULL);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ GPR_ASSERT(pending_server_recv_calls > 0);
+ pending_server_recv_calls--;
+ pending_server_end_calls++;
+ } else {
+ int call_id = ev_tag - SERVER_END_BASE_TAG;
+ GPR_ASSERT(call_id >= 0);
+ GPR_ASSERT(call_id < NUM_CALLS);
+
+ if (was_cancelled[call_id]) {
+ cancelled_calls_on_server++;
+ }
+ GPR_ASSERT(pending_server_end_calls > 0);
+ pending_server_end_calls--;
+
+ grpc_call_destroy(server_calls[call_id]);
+ }
+ }
+
+ gpr_log(
+ GPR_INFO,
+ "Done. %d total calls: %d cancelled at server, %d cancelled at client.",
+ NUM_CALLS, cancelled_calls_on_server, cancelled_calls_on_client);
+
+ /* The call may be cancelled after the server has sent its status but before
+ * the client has received it. This means that we should see strictly more
+ * failures on the client than on the server. */
+ GPR_ASSERT(cancelled_calls_on_client >= cancelled_calls_on_server);
+ /* However, we shouldn't see radically more... 0.9 is a guessed bound on what
+ * we'd want that ratio to be... to at least trigger some investigation should
+ * that ratio become much higher. */
+ GPR_ASSERT(cancelled_calls_on_server >= 0.9 * cancelled_calls_on_client);
+
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_slice_unref(request_payload_slice);
+ grpc_resource_quota_unref(resource_quota);
+
+ free(client_calls);
+ free(server_calls);
+ free(initial_metadata_recv);
+ free(trailing_metadata_recv);
+ free(request_metadata_recv);
+ free(call_details);
+ free(status);
+ free(details);
+ free(details_capacity);
+ free(request_payload_recv);
+ free(was_cancelled);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+void resource_quota_server_pre_init(void) {}
diff --git a/test/core/end2end/tests/server_finishes_request.c b/test/core/end2end/tests/server_finishes_request.c
index c23b7581f4..3bb25fd924 100644
--- a/test/core/end2end/tests/server_finishes_request.c
+++ b/test/core/end2end/tests/server_finishes_request.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -114,9 +115,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -183,7 +185,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -202,7 +205,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_simple_request", NULL, NULL);
- simple_request_body(f);
+ simple_request_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
diff --git a/test/core/end2end/tests/shutdown_finishes_calls.c b/test/core/end2end/tests/shutdown_finishes_calls.c
index a21a63ad78..b80a2e35f2 100644
--- a/test/core/end2end/tests/shutdown_finishes_calls.c
+++ b/test/core/end2end/tests/shutdown_finishes_calls.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -104,8 +104,10 @@ static void test_early_server_shutdown_finishes_inflight_calls(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -171,7 +173,8 @@ static void test_early_server_shutdown_finishes_inflight_calls(
GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE);
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
diff --git a/test/core/end2end/tests/shutdown_finishes_tags.c b/test/core/end2end/tests/shutdown_finishes_tags.c
index aca7c55b9f..1d110a74ea 100644
--- a/test/core/end2end/tests/shutdown_finishes_tags.c
+++ b/test/core/end2end/tests/shutdown_finishes_tags.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
diff --git a/test/core/end2end/tests/simple_cacheable_request.c b/test/core/end2end/tests/simple_cacheable_request.c
index 29ba41bd8b..2c229b08fe 100644
--- a/test/core/end2end/tests/simple_cacheable_request.c
+++ b/test/core/end2end/tests/simple_cacheable_request.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -102,8 +102,10 @@ static void test_cacheable_request_response_with_metadata_and_payload(
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
@@ -133,8 +135,10 @@ static void test_cacheable_request_response_with_metadata_and_payload(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -235,7 +239,8 @@ static void test_cacheable_request_response_with_metadata_and_payload(
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
if (config.feature_mask & FEATURE_MASK_SUPPORTS_REQUEST_PROXYING) {
// Our simple proxy does not support cacheable requests
} else {
diff --git a/test/core/end2end/tests/simple_delayed_request.c b/test/core/end2end/tests/simple_delayed_request.c
index 9d7d3a658e..414a03d98b 100644
--- a/test/core/end2end/tests/simple_delayed_request.c
+++ b/test/core/end2end/tests/simple_delayed_request.c
@@ -104,10 +104,12 @@ static void simple_delayed_request_body(grpc_end2end_test_config config,
size_t details_capacity = 0;
int was_cancelled = 2;
- config.init_client(f, client_args, NULL);
+ config.init_client(f, client_args);
- c = grpc_channel_create_call(f->client, NULL, GRPC_PROPAGATE_DEFAULTS, f->cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f->client, NULL, GRPC_PROPAGATE_DEFAULTS, f->cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -180,7 +182,8 @@ static void simple_delayed_request_body(grpc_end2end_test_config config,
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
@@ -197,21 +200,36 @@ static void simple_delayed_request_body(grpc_end2end_test_config config,
static void test_simple_delayed_request_short(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
+ grpc_channel_args client_args;
+ grpc_arg arg_array[1];
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = 1000;
+ client_args.args = arg_array;
+ client_args.num_args = 1;
gpr_log(GPR_INFO, "%s/%s", "test_simple_delayed_request_short", config.name);
f = config.create_fixture(NULL, NULL);
- simple_delayed_request_body(config, &f, NULL, NULL, 100000);
+
+ simple_delayed_request_body(config, &f, &client_args, NULL, 100000);
end_test(&f);
config.tear_down_data(&f);
}
static void test_simple_delayed_request_long(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
+ grpc_channel_args client_args;
+ grpc_arg arg_array[1];
+ arg_array[0].type = GRPC_ARG_INTEGER;
+ arg_array[0].key = "grpc.testing.fixed_reconnect_backoff_ms";
+ arg_array[0].value.integer = 1000;
+ client_args.args = arg_array;
+ client_args.num_args = 1;
gpr_log(GPR_INFO, "%s/%s", "test_simple_delayed_request_long", config.name);
f = config.create_fixture(NULL, NULL);
/* This timeout should be longer than a single retry */
- simple_delayed_request_body(config, &f, NULL, NULL, 1500000);
+ simple_delayed_request_body(config, &f, &client_args, NULL, 1500000);
end_test(&f);
config.tear_down_data(&f);
}
diff --git a/test/core/end2end/tests/simple_metadata.c b/test/core/end2end/tests/simple_metadata.c
index 304af9c3fa..5490cc2b75 100644
--- a/test/core/end2end/tests/simple_metadata.c
+++ b/test/core/end2end/tests/simple_metadata.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -100,8 +100,10 @@ static void test_request_response_with_metadata_and_payload(
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
@@ -130,8 +132,10 @@ static void test_request_response_with_metadata_and_payload(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -232,7 +236,8 @@ static void test_request_response_with_metadata_and_payload(
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 0);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
diff --git a/test/core/end2end/tests/simple_request.c b/test/core/end2end/tests/simple_request.c
index 65a3710c14..2dea5d6af2 100644
--- a/test/core/end2end/tests/simple_request.c
+++ b/test/core/end2end/tests/simple_request.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -97,7 +97,8 @@ static void end_test(grpc_end2end_test_fixture *f) {
grpc_completion_queue_destroy(f->cq);
}
-static void simple_request_body(grpc_end2end_test_fixture f) {
+static void simple_request_body(grpc_end2end_test_config config,
+ grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
gpr_timespec deadline = five_seconds_time();
@@ -115,9 +116,10 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
int was_cancelled = 2;
char *peer;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr:1234", deadline,
- NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
peer = grpc_call_get_peer(c);
@@ -202,7 +204,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr:1234"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(0 == call_details.flags);
GPR_ASSERT(was_cancelled == 1);
@@ -222,7 +225,7 @@ static void test_invoke_simple_request(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f;
f = begin_test(config, "test_invoke_simple_request", NULL, NULL);
- simple_request_body(f);
+ simple_request_body(config, f);
end_test(&f);
config.tear_down_data(&f);
}
@@ -232,7 +235,7 @@ static void test_invoke_10_simple_requests(grpc_end2end_test_config config) {
grpc_end2end_test_fixture f =
begin_test(config, "test_invoke_10_simple_requests", NULL, NULL);
for (i = 0; i < 10; i++) {
- simple_request_body(f);
+ simple_request_body(config, f);
gpr_log(GPR_INFO, "Passed simple request %d", i);
}
end_test(&f);
diff --git a/test/core/end2end/tests/streaming_error_response.c b/test/core/end2end/tests/streaming_error_response.c
index fe63c6f7bb..583bc9268f 100644
--- a/test/core/end2end/tests/streaming_error_response.c
+++ b/test/core/end2end/tests/streaming_error_response.c
@@ -55,7 +55,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
request_status_early ? "true" : "false");
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -101,10 +101,10 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void test(grpc_end2end_test_config config, bool request_status_early) {
grpc_call *c;
grpc_call *s;
- gpr_slice response_payload1_slice = gpr_slice_from_copied_string("hello");
+ grpc_slice response_payload1_slice = grpc_slice_from_copied_string("hello");
grpc_byte_buffer *response_payload1 =
grpc_raw_byte_buffer_create(&response_payload1_slice, 1);
- gpr_slice response_payload2_slice = gpr_slice_from_copied_string("world");
+ grpc_slice response_payload2_slice = grpc_slice_from_copied_string("world");
grpc_byte_buffer *response_payload2 =
grpc_raw_byte_buffer_create(&response_payload2_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -125,8 +125,10 @@ static void test(grpc_end2end_test_config config, bool request_status_early) {
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -245,7 +247,8 @@ static void test(grpc_end2end_test_config config, bool request_status_early) {
GPR_ASSERT(status == GRPC_STATUS_FAILED_PRECONDITION);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(was_cancelled == 1);
gpr_free(details);
diff --git a/test/core/end2end/tests/trailing_metadata.c b/test/core/end2end/tests/trailing_metadata.c
index e6bfc7c9f1..9fd4fbc052 100644
--- a/test/core/end2end/tests/trailing_metadata.c
+++ b/test/core/end2end/tests/trailing_metadata.c
@@ -53,7 +53,7 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
- config.init_client(&f, client_args, NULL);
+ config.init_client(&f, client_args);
return f;
}
@@ -100,8 +100,10 @@ static void test_request_response_with_metadata_and_payload(
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
- gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
+ grpc_slice response_payload_slice =
+ grpc_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_byte_buffer *response_payload =
@@ -133,8 +135,10 @@ static void test_request_response_with_metadata_and_payload(
size_t details_capacity = 0;
int was_cancelled = 2;
- c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
- "/foo", "foo.test.google.fr", deadline, NULL);
+ c = grpc_channel_create_call(
+ f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, "/foo",
+ get_host_override_string("foo.test.google.fr:1234", config), deadline,
+ NULL);
GPR_ASSERT(c);
grpc_metadata_array_init(&initial_metadata_recv);
@@ -236,7 +240,8 @@ static void test_request_response_with_metadata_and_payload(
GPR_ASSERT(status == GRPC_STATUS_OK);
GPR_ASSERT(0 == strcmp(details, "xyz"));
GPR_ASSERT(0 == strcmp(call_details.method, "/foo"));
- GPR_ASSERT(0 == strcmp(call_details.host, "foo.test.google.fr"));
+ validate_host_override_string("foo.test.google.fr:1234", call_details.host,
+ config);
GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
GPR_ASSERT(contains_metadata(&request_metadata_recv, "key1", "val1"));
diff --git a/test/core/fling/client.c b/test/core/fling/client.c
index bcc195a92f..e717b7f7fe 100644
--- a/test/core/fling/client.c
+++ b/test/core/fling/client.c
@@ -155,7 +155,7 @@ static const scenario scenarios[] = {
};
int main(int argc, char **argv) {
- gpr_slice slice = gpr_slice_from_copied_string("x");
+ grpc_slice slice = grpc_slice_from_copied_string("x");
double start, stop;
unsigned i;
@@ -241,7 +241,7 @@ int main(int argc, char **argv) {
} while (event.type != GRPC_QUEUE_SHUTDOWN);
grpc_completion_queue_destroy(cq);
grpc_byte_buffer_destroy(the_buffer);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
gpr_log(GPR_INFO, "latency (50/95/99/99.9): %f/%f/%f/%f",
gpr_histogram_percentile(histogram, 50),
diff --git a/test/core/handshake/client_ssl.c b/test/core/handshake/client_ssl.c
index ee90f0b0bc..24281e0b41 100644
--- a/test/core/handshake/client_ssl.c
+++ b/test/core/handshake/client_ssl.c
@@ -211,7 +211,7 @@ static bool client_ssl_test(char *server_alpn_preferred) {
// and port picking.
int port = -1;
int server_socket = -1;
- int socket_retries = 10;
+ int socket_retries = 30;
while (server_socket == -1 && socket_retries-- > 0) {
port = grpc_pick_unused_port_or_die();
server_socket = create_socket(port);
@@ -231,16 +231,16 @@ static bool client_ssl_test(char *server_alpn_preferred) {
// Load key pair and establish client SSL credentials.
grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
- gpr_slice ca_slice, cert_slice, key_slice;
+ grpc_slice ca_slice, cert_slice, key_slice;
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_CA_PATH, 1, &ca_slice)));
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_CERT_PATH, 1, &cert_slice)));
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_KEY_PATH, 1, &key_slice)));
- const char *ca_cert = (const char *)GPR_SLICE_START_PTR(ca_slice);
- pem_key_cert_pair.private_key = (const char *)GPR_SLICE_START_PTR(key_slice);
- pem_key_cert_pair.cert_chain = (const char *)GPR_SLICE_START_PTR(cert_slice);
+ const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
+ pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
+ pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
grpc_channel_credentials *ssl_creds =
grpc_ssl_credentials_create(ca_cert, &pem_key_cert_pair, NULL);
@@ -286,9 +286,9 @@ static bool client_ssl_test(char *server_alpn_preferred) {
grpc_channel_destroy(channel);
grpc_channel_credentials_release(ssl_creds);
- gpr_slice_unref(cert_slice);
- gpr_slice_unref(key_slice);
- gpr_slice_unref(ca_slice);
+ grpc_slice_unref(cert_slice);
+ grpc_slice_unref(key_slice);
+ grpc_slice_unref(ca_slice);
gpr_thd_join(thdid);
diff --git a/test/core/handshake/server_ssl.c b/test/core/handshake/server_ssl.c
index 3e89f8e265..f39b0040a6 100644
--- a/test/core/handshake/server_ssl.c
+++ b/test/core/handshake/server_ssl.c
@@ -84,16 +84,16 @@ static void server_thread(void *arg) {
// Load key pair and establish server SSL credentials.
grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
- gpr_slice ca_slice, cert_slice, key_slice;
+ grpc_slice ca_slice, cert_slice, key_slice;
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_CA_PATH, 1, &ca_slice)));
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_CERT_PATH, 1, &cert_slice)));
GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
grpc_load_file(SSL_KEY_PATH, 1, &key_slice)));
- const char *ca_cert = (const char *)GPR_SLICE_START_PTR(ca_slice);
- pem_key_cert_pair.private_key = (const char *)GPR_SLICE_START_PTR(key_slice);
- pem_key_cert_pair.cert_chain = (const char *)GPR_SLICE_START_PTR(cert_slice);
+ const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
+ pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
+ pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
grpc_server_credentials *ssl_creds = grpc_ssl_server_credentials_create(
ca_cert, &pem_key_cert_pair, 1, 0, NULL);
@@ -129,9 +129,9 @@ static void server_thread(void *arg) {
grpc_server_destroy(server);
grpc_completion_queue_destroy(cq);
grpc_server_credentials_release(ssl_creds);
- gpr_slice_unref(cert_slice);
- gpr_slice_unref(key_slice);
- gpr_slice_unref(ca_slice);
+ grpc_slice_unref(cert_slice);
+ grpc_slice_unref(key_slice);
+ grpc_slice_unref(ca_slice);
}
// This test launches a gRPC server on a separate thread and then establishes a
diff --git a/test/core/http/format_request_test.c b/test/core/http/format_request_test.c
index 0d21e1200b..290990c906 100644
--- a/test/core/http/format_request_test.c
+++ b/test/core/http/format_request_test.c
@@ -41,7 +41,7 @@
static void test_format_get_request(void) {
grpc_http_header hdr = {"x-yz", "abc"};
grpc_httpcli_request req;
- gpr_slice slice;
+ grpc_slice slice;
memset(&req, 0, sizeof(req));
req.host = "example.com";
@@ -51,22 +51,22 @@ static void test_format_get_request(void) {
slice = grpc_httpcli_format_get_request(&req);
- GPR_ASSERT(0 == gpr_slice_str_cmp(slice,
- "GET /index.html HTTP/1.0\r\n"
- "Host: example.com\r\n"
- "Connection: close\r\n"
- "User-Agent: " GRPC_HTTPCLI_USER_AGENT
- "\r\n"
- "x-yz: abc\r\n"
- "\r\n"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(slice,
+ "GET /index.html HTTP/1.0\r\n"
+ "Host: example.com\r\n"
+ "Connection: close\r\n"
+ "User-Agent: " GRPC_HTTPCLI_USER_AGENT
+ "\r\n"
+ "x-yz: abc\r\n"
+ "\r\n"));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
static void test_format_post_request(void) {
grpc_http_header hdr = {"x-yz", "abc"};
grpc_httpcli_request req;
- gpr_slice slice;
+ grpc_slice slice;
char body_bytes[] = "fake body";
size_t body_len = 9;
@@ -78,25 +78,25 @@ static void test_format_post_request(void) {
slice = grpc_httpcli_format_post_request(&req, body_bytes, body_len);
- GPR_ASSERT(0 == gpr_slice_str_cmp(slice,
- "POST /index.html HTTP/1.0\r\n"
- "Host: example.com\r\n"
- "Connection: close\r\n"
- "User-Agent: " GRPC_HTTPCLI_USER_AGENT
- "\r\n"
- "x-yz: abc\r\n"
- "Content-Type: text/plain\r\n"
- "Content-Length: 9\r\n"
- "\r\n"
- "fake body"));
-
- gpr_slice_unref(slice);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(slice,
+ "POST /index.html HTTP/1.0\r\n"
+ "Host: example.com\r\n"
+ "Connection: close\r\n"
+ "User-Agent: " GRPC_HTTPCLI_USER_AGENT
+ "\r\n"
+ "x-yz: abc\r\n"
+ "Content-Type: text/plain\r\n"
+ "Content-Length: 9\r\n"
+ "\r\n"
+ "fake body"));
+
+ grpc_slice_unref(slice);
}
static void test_format_post_request_no_body(void) {
grpc_http_header hdr = {"x-yz", "abc"};
grpc_httpcli_request req;
- gpr_slice slice;
+ grpc_slice slice;
memset(&req, 0, sizeof(req));
req.host = "example.com";
@@ -106,22 +106,22 @@ static void test_format_post_request_no_body(void) {
slice = grpc_httpcli_format_post_request(&req, NULL, 0);
- GPR_ASSERT(0 == gpr_slice_str_cmp(slice,
- "POST /index.html HTTP/1.0\r\n"
- "Host: example.com\r\n"
- "Connection: close\r\n"
- "User-Agent: " GRPC_HTTPCLI_USER_AGENT
- "\r\n"
- "x-yz: abc\r\n"
- "\r\n"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(slice,
+ "POST /index.html HTTP/1.0\r\n"
+ "Host: example.com\r\n"
+ "Connection: close\r\n"
+ "User-Agent: " GRPC_HTTPCLI_USER_AGENT
+ "\r\n"
+ "x-yz: abc\r\n"
+ "\r\n"));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
static void test_format_post_request_content_type_override(void) {
grpc_http_header hdrs[2];
grpc_httpcli_request req;
- gpr_slice slice;
+ grpc_slice slice;
char body_bytes[] = "fake%20body";
size_t body_len = 11;
@@ -137,7 +137,7 @@ static void test_format_post_request_content_type_override(void) {
slice = grpc_httpcli_format_post_request(&req, body_bytes, body_len);
- GPR_ASSERT(0 == gpr_slice_str_cmp(
+ GPR_ASSERT(0 == grpc_slice_str_cmp(
slice,
"POST /index.html HTTP/1.0\r\n"
"Host: example.com\r\n"
@@ -149,7 +149,7 @@ static void test_format_post_request_content_type_override(void) {
"\r\n"
"fake%20body"));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
int main(int argc, char **argv) {
diff --git a/test/core/http/httpcli_test.c b/test/core/http/httpcli_test.c
index 38b32a3867..3e312c1dde 100644
--- a/test/core/http/httpcli_test.c
+++ b/test/core/http/httpcli_test.c
@@ -89,8 +89,11 @@ static void test_get(int port) {
grpc_http_response response;
memset(&response, 0, sizeof(response));
- grpc_httpcli_get(&exec_ctx, &g_context, &g_pops, &req, n_seconds_time(15),
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_get");
+ grpc_httpcli_get(&exec_ctx, &g_context, &g_pops, resource_quota, &req,
+ n_seconds_time(15),
grpc_closure_create(on_finish, &response), &response);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
gpr_mu_lock(g_mu);
while (!g_done) {
grpc_pollset_worker *worker = NULL;
@@ -126,9 +129,11 @@ static void test_post(int port) {
grpc_http_response response;
memset(&response, 0, sizeof(response));
- grpc_httpcli_post(&exec_ctx, &g_context, &g_pops, &req, "hello", 5,
- n_seconds_time(15),
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_post");
+ grpc_httpcli_post(&exec_ctx, &g_context, &g_pops, resource_quota, &req,
+ "hello", 5, n_seconds_time(15),
grpc_closure_create(on_finish, &response), &response);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
gpr_mu_lock(g_mu);
while (!g_done) {
grpc_pollset_worker *worker = NULL;
diff --git a/test/core/http/httpscli_test.c b/test/core/http/httpscli_test.c
index 359e557689..d06035149e 100644
--- a/test/core/http/httpscli_test.c
+++ b/test/core/http/httpscli_test.c
@@ -90,8 +90,11 @@ static void test_get(int port) {
grpc_http_response response;
memset(&response, 0, sizeof(response));
- grpc_httpcli_get(&exec_ctx, &g_context, &g_pops, &req, n_seconds_time(15),
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_get");
+ grpc_httpcli_get(&exec_ctx, &g_context, &g_pops, resource_quota, &req,
+ n_seconds_time(15),
grpc_closure_create(on_finish, &response), &response);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
gpr_mu_lock(g_mu);
while (!g_done) {
grpc_pollset_worker *worker = NULL;
@@ -128,9 +131,11 @@ static void test_post(int port) {
grpc_http_response response;
memset(&response, 0, sizeof(response));
- grpc_httpcli_post(&exec_ctx, &g_context, &g_pops, &req, "hello", 5,
- n_seconds_time(15),
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_post");
+ grpc_httpcli_post(&exec_ctx, &g_context, &g_pops, resource_quota, &req,
+ "hello", 5, n_seconds_time(15),
grpc_closure_create(on_finish, &response), &response);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
gpr_mu_lock(g_mu);
while (!g_done) {
grpc_pollset_worker *worker = NULL;
diff --git a/test/core/http/parser_test.c b/test/core/http/parser_test.c
index 2fc354d9ee..4f1445d3f1 100644
--- a/test/core/http/parser_test.c
+++ b/test/core/http/parser_test.c
@@ -48,23 +48,23 @@ static void test_request_succeeds(grpc_slice_split_mode split_mode,
grpc_http_version expect_version,
char *expect_path, char *expect_body, ...) {
grpc_http_parser parser;
- gpr_slice input_slice = gpr_slice_from_copied_string(request_text);
+ grpc_slice input_slice = grpc_slice_from_copied_string(request_text);
size_t num_slices;
size_t i;
- gpr_slice *slices;
+ grpc_slice *slices;
va_list args;
grpc_http_request request;
memset(&request, 0, sizeof(request));
grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices);
- gpr_slice_unref(input_slice);
+ grpc_slice_unref(input_slice);
grpc_http_parser_init(&parser, GRPC_HTTP_REQUEST, &request);
for (i = 0; i < num_slices; i++) {
GPR_ASSERT(grpc_http_parser_parse(&parser, slices[i], NULL) ==
GRPC_ERROR_NONE);
- gpr_slice_unref(slices[i]);
+ grpc_slice_unref(slices[i]);
}
GPR_ASSERT(grpc_http_parser_eof(&parser) == GRPC_ERROR_NONE);
@@ -105,23 +105,23 @@ static void test_request_succeeds(grpc_slice_split_mode split_mode,
static void test_succeeds(grpc_slice_split_mode split_mode, char *response_text,
int expect_status, char *expect_body, ...) {
grpc_http_parser parser;
- gpr_slice input_slice = gpr_slice_from_copied_string(response_text);
+ grpc_slice input_slice = grpc_slice_from_copied_string(response_text);
size_t num_slices;
size_t i;
- gpr_slice *slices;
+ grpc_slice *slices;
va_list args;
grpc_http_response response;
memset(&response, 0, sizeof(response));
grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices);
- gpr_slice_unref(input_slice);
+ grpc_slice_unref(input_slice);
grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
for (i = 0; i < num_slices; i++) {
GPR_ASSERT(grpc_http_parser_parse(&parser, slices[i], NULL) ==
GRPC_ERROR_NONE);
- gpr_slice_unref(slices[i]);
+ grpc_slice_unref(slices[i]);
}
GPR_ASSERT(grpc_http_parser_eof(&parser) == GRPC_ERROR_NONE);
@@ -158,16 +158,16 @@ static void test_succeeds(grpc_slice_split_mode split_mode, char *response_text,
static void test_fails(grpc_slice_split_mode split_mode, char *response_text) {
grpc_http_parser parser;
- gpr_slice input_slice = gpr_slice_from_copied_string(response_text);
+ grpc_slice input_slice = grpc_slice_from_copied_string(response_text);
size_t num_slices;
size_t i;
- gpr_slice *slices;
+ grpc_slice *slices;
grpc_error *error = GRPC_ERROR_NONE;
grpc_http_response response;
memset(&response, 0, sizeof(response));
grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices);
- gpr_slice_unref(input_slice);
+ grpc_slice_unref(input_slice);
grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
@@ -175,7 +175,7 @@ static void test_fails(grpc_slice_split_mode split_mode, char *response_text) {
if (GRPC_ERROR_NONE == error) {
error = grpc_http_parser_parse(&parser, slices[i], NULL);
}
- gpr_slice_unref(slices[i]);
+ grpc_slice_unref(slices[i]);
}
if (GRPC_ERROR_NONE == error) {
error = grpc_http_parser_eof(&parser);
@@ -191,16 +191,16 @@ static void test_fails(grpc_slice_split_mode split_mode, char *response_text) {
static void test_request_fails(grpc_slice_split_mode split_mode,
char *request_text) {
grpc_http_parser parser;
- gpr_slice input_slice = gpr_slice_from_copied_string(request_text);
+ grpc_slice input_slice = grpc_slice_from_copied_string(request_text);
size_t num_slices;
size_t i;
- gpr_slice *slices;
+ grpc_slice *slices;
grpc_error *error = GRPC_ERROR_NONE;
grpc_http_request request;
memset(&request, 0, sizeof(request));
grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices);
- gpr_slice_unref(input_slice);
+ grpc_slice_unref(input_slice);
grpc_http_parser_init(&parser, GRPC_HTTP_REQUEST, &request);
@@ -208,7 +208,7 @@ static void test_request_fails(grpc_slice_split_mode split_mode,
if (error == GRPC_ERROR_NONE) {
error = grpc_http_parser_parse(&parser, slices[i], NULL);
}
- gpr_slice_unref(slices[i]);
+ grpc_slice_unref(slices[i]);
}
if (error == GRPC_ERROR_NONE) {
error = grpc_http_parser_eof(&parser);
diff --git a/test/core/http/request_fuzzer.c b/test/core/http/request_fuzzer.c
index bb6cb92c0c..98e2c9680d 100644
--- a/test/core/http/request_fuzzer.c
+++ b/test/core/http/request_fuzzer.c
@@ -47,10 +47,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_http_request request;
memset(&request, 0, sizeof(request));
grpc_http_parser_init(&parser, GRPC_HTTP_REQUEST, &request);
- gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, NULL));
GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
grpc_http_parser_destroy(&parser);
grpc_http_request_destroy(&request);
return 0;
diff --git a/test/core/http/response_fuzzer.c b/test/core/http/response_fuzzer.c
index 4393840484..fff04117b2 100644
--- a/test/core/http/response_fuzzer.c
+++ b/test/core/http/response_fuzzer.c
@@ -46,10 +46,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_http_response response;
memset(&response, 0, sizeof(response));
grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
- gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, NULL));
GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
grpc_http_parser_destroy(&parser);
grpc_http_response_destroy(&response);
return 0;
diff --git a/test/core/internal_api_canaries/iomgr.c b/test/core/internal_api_canaries/iomgr.c
index 27d630623e..de03c47c13 100644
--- a/test/core/internal_api_canaries/iomgr.c
+++ b/test/core/internal_api_canaries/iomgr.c
@@ -84,7 +84,9 @@ static void test_code(void) {
grpc_endpoint_add_to_pollset_set,
grpc_endpoint_shutdown,
grpc_endpoint_destroy,
- grpc_endpoint_get_peer};
+ grpc_endpoint_get_resource_user,
+ grpc_endpoint_get_peer,
+ grpc_endpoint_get_fd};
endpoint.vtable = &vtable;
grpc_endpoint_read(&exec_ctx, &endpoint, NULL, NULL);
diff --git a/test/core/internal_api_canaries/transport.c b/test/core/internal_api_canaries/transport.c
index 0617865412..2989f59535 100644
--- a/test/core/internal_api_canaries/transport.c
+++ b/test/core/internal_api_canaries/transport.c
@@ -69,7 +69,7 @@ static void test_code(void) {
grpc_transport_perform_op(&transport, NULL, NULL);
grpc_transport_ping(&transport, NULL);
grpc_transport_goaway(&transport, GRPC_STATUS_UNAVAILABLE,
- gpr_slice_malloc(0));
+ grpc_slice_malloc(0));
grpc_transport_close(&transport);
grpc_transport_destroy(&transport, NULL);
GPR_ASSERT("xyz" == grpc_transport_get_peer(&transport, NULL));
diff --git a/test/core/iomgr/endpoint_pair_test.c b/test/core/iomgr/endpoint_pair_test.c
index 99b86b6213..2a257a7cea 100644
--- a/test/core/iomgr/endpoint_pair_test.c
+++ b/test/core/iomgr/endpoint_pair_test.c
@@ -49,7 +49,11 @@ static grpc_endpoint_test_fixture create_fixture_endpoint_pair(
size_t slice_size) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_endpoint_test_fixture f;
- grpc_endpoint_pair p = grpc_iomgr_create_endpoint_pair("test", slice_size);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("endpoint_pair_test");
+ grpc_endpoint_pair p =
+ grpc_iomgr_create_endpoint_pair("test", resource_quota, slice_size);
+ grpc_resource_quota_unref(resource_quota);
f.client_ep = p.client;
f.server_ep = p.server;
diff --git a/test/core/iomgr/endpoint_tests.c b/test/core/iomgr/endpoint_tests.c
index b79c22e42a..8186ea7e85 100644
--- a/test/core/iomgr/endpoint_tests.c
+++ b/test/core/iomgr/endpoint_tests.c
@@ -36,9 +36,9 @@
#include <stdbool.h>
#include <sys/types.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/time.h>
#include <grpc/support/useful.h>
#include "test/core/util/test_config.h"
@@ -62,18 +62,18 @@
static gpr_mu *g_mu;
static grpc_pollset *g_pollset;
-size_t count_slices(gpr_slice *slices, size_t nslices, int *current_data) {
+size_t count_slices(grpc_slice *slices, size_t nslices, int *current_data) {
size_t num_bytes = 0;
size_t i;
size_t j;
unsigned char *buf;
for (i = 0; i < nslices; ++i) {
- buf = GPR_SLICE_START_PTR(slices[i]);
- for (j = 0; j < GPR_SLICE_LENGTH(slices[i]); ++j) {
+ buf = GRPC_SLICE_START_PTR(slices[i]);
+ for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
GPR_ASSERT(buf[j] == *current_data);
*current_data = (*current_data + 1) % 256;
}
- num_bytes += GPR_SLICE_LENGTH(slices[i]);
+ num_bytes += GRPC_SLICE_LENGTH(slices[i]);
}
return num_bytes;
}
@@ -87,10 +87,10 @@ static grpc_endpoint_test_fixture begin_test(grpc_endpoint_test_config config,
static void end_test(grpc_endpoint_test_config config) { config.clean_up(); }
-static gpr_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
- size_t *num_blocks, uint8_t *current_data) {
+static grpc_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
+ size_t *num_blocks, uint8_t *current_data) {
size_t nslices = num_bytes / slice_size + (num_bytes % slice_size ? 1 : 0);
- gpr_slice *slices = gpr_malloc(sizeof(gpr_slice) * nslices);
+ grpc_slice *slices = gpr_malloc(sizeof(grpc_slice) * nslices);
size_t num_bytes_left = num_bytes;
size_t i;
size_t j;
@@ -98,11 +98,11 @@ static gpr_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
*num_blocks = nslices;
for (i = 0; i < nslices; ++i) {
- slices[i] = gpr_slice_malloc(slice_size > num_bytes_left ? num_bytes_left
- : slice_size);
- num_bytes_left -= GPR_SLICE_LENGTH(slices[i]);
- buf = GPR_SLICE_START_PTR(slices[i]);
- for (j = 0; j < GPR_SLICE_LENGTH(slices[i]); ++j) {
+ slices[i] = grpc_slice_malloc(slice_size > num_bytes_left ? num_bytes_left
+ : slice_size);
+ num_bytes_left -= GRPC_SLICE_LENGTH(slices[i]);
+ buf = GRPC_SLICE_START_PTR(slices[i]);
+ for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
buf[j] = *current_data;
(*current_data)++;
}
@@ -122,8 +122,8 @@ struct read_and_write_test_state {
uint8_t current_write_data;
int read_done;
int write_done;
- gpr_slice_buffer incoming;
- gpr_slice_buffer outgoing;
+ grpc_slice_buffer incoming;
+ grpc_slice_buffer outgoing;
grpc_closure done_read;
grpc_closure done_write;
};
@@ -149,7 +149,7 @@ static void read_and_write_test_read_handler(grpc_exec_ctx *exec_ctx,
static void read_and_write_test_write_handler(grpc_exec_ctx *exec_ctx,
void *data, grpc_error *error) {
struct read_and_write_test_state *state = data;
- gpr_slice *slices = NULL;
+ grpc_slice *slices = NULL;
size_t nslices;
if (error == GRPC_ERROR_NONE) {
@@ -161,8 +161,8 @@ static void read_and_write_test_write_handler(grpc_exec_ctx *exec_ctx,
if (state->current_write_size != 0) {
slices = allocate_blocks(state->current_write_size, 8192, &nslices,
&state->current_write_data);
- gpr_slice_buffer_reset_and_unref(&state->outgoing);
- gpr_slice_buffer_addn(&state->outgoing, slices, nslices);
+ grpc_slice_buffer_reset_and_unref(&state->outgoing);
+ grpc_slice_buffer_addn(&state->outgoing, slices, nslices);
grpc_endpoint_write(exec_ctx, state->write_ep, &state->outgoing,
&state->done_write);
gpr_free(slices);
@@ -214,8 +214,8 @@ static void read_and_write_test(grpc_endpoint_test_config config,
grpc_closure_init(&state.done_read, read_and_write_test_read_handler, &state);
grpc_closure_init(&state.done_write, read_and_write_test_write_handler,
&state);
- gpr_slice_buffer_init(&state.outgoing);
- gpr_slice_buffer_init(&state.incoming);
+ grpc_slice_buffer_init(&state.outgoing);
+ grpc_slice_buffer_init(&state.incoming);
/* Get started by pretending an initial write completed */
/* NOTE: Sets up initial conditions so we can have the same write handler
@@ -249,8 +249,8 @@ static void read_and_write_test(grpc_endpoint_test_config config,
grpc_exec_ctx_flush(&exec_ctx);
end_test(config);
- gpr_slice_buffer_destroy(&state.outgoing);
- gpr_slice_buffer_destroy(&state.incoming);
+ grpc_slice_buffer_destroy(&state.outgoing);
+ grpc_slice_buffer_destroy(&state.incoming);
grpc_endpoint_destroy(&exec_ctx, state.read_ep);
grpc_endpoint_destroy(&exec_ctx, state.write_ep);
grpc_exec_ctx_finish(&exec_ctx);
@@ -284,8 +284,8 @@ static void multiple_shutdown_test(grpc_endpoint_test_config config) {
begin_test(config, "multiple_shutdown_test", 128);
int fail_count = 0;
- gpr_slice_buffer slice_buffer;
- gpr_slice_buffer_init(&slice_buffer);
+ grpc_slice_buffer slice_buffer;
+ grpc_slice_buffer_init(&slice_buffer);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_endpoint_add_to_pollset(&exec_ctx, f.client_ep, g_pollset);
@@ -297,14 +297,14 @@ static void multiple_shutdown_test(grpc_endpoint_test_config config) {
grpc_endpoint_read(&exec_ctx, f.client_ep, &slice_buffer,
grpc_closure_create(inc_on_failure, &fail_count));
wait_for_fail_count(&exec_ctx, &fail_count, 2);
- gpr_slice_buffer_add(&slice_buffer, gpr_slice_from_copied_string("a"));
+ grpc_slice_buffer_add(&slice_buffer, grpc_slice_from_copied_string("a"));
grpc_endpoint_write(&exec_ctx, f.client_ep, &slice_buffer,
grpc_closure_create(inc_on_failure, &fail_count));
wait_for_fail_count(&exec_ctx, &fail_count, 3);
grpc_endpoint_shutdown(&exec_ctx, f.client_ep);
wait_for_fail_count(&exec_ctx, &fail_count, 3);
- gpr_slice_buffer_destroy(&slice_buffer);
+ grpc_slice_buffer_destroy(&slice_buffer);
grpc_endpoint_destroy(&exec_ctx, f.client_ep);
grpc_endpoint_destroy(&exec_ctx, f.server_ep);
diff --git a/test/core/iomgr/fd_conservation_posix_test.c b/test/core/iomgr/fd_conservation_posix_test.c
index bbb3f46497..652b37eb6f 100644
--- a/test/core/iomgr/fd_conservation_posix_test.c
+++ b/test/core/iomgr/fd_conservation_posix_test.c
@@ -52,15 +52,19 @@ int main(int argc, char **argv) {
of descriptors */
rlim.rlim_cur = rlim.rlim_max = 10;
GPR_ASSERT(0 == setrlimit(RLIMIT_NOFILE, &rlim));
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("fd_conservation_posix_test");
for (i = 0; i < 100; i++) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- p = grpc_iomgr_create_endpoint_pair("test", 1);
+ p = grpc_iomgr_create_endpoint_pair("test", resource_quota, 1);
grpc_endpoint_destroy(&exec_ctx, p.client);
grpc_endpoint_destroy(&exec_ctx, p.server);
grpc_exec_ctx_finish(&exec_ctx);
}
+ grpc_resource_quota_unref(resource_quota);
+
grpc_iomgr_shutdown();
return 0;
}
diff --git a/test/core/iomgr/load_file_test.c b/test/core/iomgr/load_file_test.c
index f70295a81c..8714e1f368 100644
--- a/test/core/iomgr/load_file_test.c
+++ b/test/core/iomgr/load_file_test.c
@@ -34,9 +34,9 @@
#include <stdio.h>
#include <string.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include "src/core/lib/iomgr/load_file.h"
#include "src/core/lib/support/string.h"
@@ -49,8 +49,8 @@ static const char prefix[] = "file_test";
static void test_load_empty_file(void) {
FILE *tmp = NULL;
- gpr_slice slice;
- gpr_slice slice_with_null_term;
+ grpc_slice slice;
+ grpc_slice slice_with_null_term;
grpc_error *error;
char *tmp_name;
@@ -63,22 +63,22 @@ static void test_load_empty_file(void) {
error = grpc_load_file(tmp_name, 0, &slice);
GPR_ASSERT(error == GRPC_ERROR_NONE);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == 0);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == 0);
error = grpc_load_file(tmp_name, 1, &slice_with_null_term);
GPR_ASSERT(error == GRPC_ERROR_NONE);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice_with_null_term) == 1);
- GPR_ASSERT(GPR_SLICE_START_PTR(slice_with_null_term)[0] == 0);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice_with_null_term) == 1);
+ GPR_ASSERT(GRPC_SLICE_START_PTR(slice_with_null_term)[0] == 0);
remove(tmp_name);
gpr_free(tmp_name);
- gpr_slice_unref(slice);
- gpr_slice_unref(slice_with_null_term);
+ grpc_slice_unref(slice);
+ grpc_slice_unref(slice_with_null_term);
}
static void test_load_failure(void) {
FILE *tmp = NULL;
- gpr_slice slice;
+ grpc_slice slice;
grpc_error *error;
char *tmp_name;
@@ -93,15 +93,15 @@ static void test_load_failure(void) {
error = grpc_load_file(tmp_name, 0, &slice);
GPR_ASSERT(error != GRPC_ERROR_NONE);
GRPC_ERROR_UNREF(error);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == 0);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == 0);
gpr_free(tmp_name);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
static void test_load_small_file(void) {
FILE *tmp = NULL;
- gpr_slice slice;
- gpr_slice slice_with_null_term;
+ grpc_slice slice;
+ grpc_slice slice_with_null_term;
grpc_error *error;
char *tmp_name;
const char *blah = "blah";
@@ -116,24 +116,24 @@ static void test_load_small_file(void) {
error = grpc_load_file(tmp_name, 0, &slice);
GPR_ASSERT(error == GRPC_ERROR_NONE);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == strlen(blah));
- GPR_ASSERT(!memcmp(GPR_SLICE_START_PTR(slice), blah, strlen(blah)));
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == strlen(blah));
+ GPR_ASSERT(!memcmp(GRPC_SLICE_START_PTR(slice), blah, strlen(blah)));
error = grpc_load_file(tmp_name, 1, &slice_with_null_term);
GPR_ASSERT(error == GRPC_ERROR_NONE);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice_with_null_term) == (strlen(blah) + 1));
- GPR_ASSERT(strcmp((const char *)GPR_SLICE_START_PTR(slice_with_null_term),
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice_with_null_term) == (strlen(blah) + 1));
+ GPR_ASSERT(strcmp((const char *)GRPC_SLICE_START_PTR(slice_with_null_term),
blah) == 0);
remove(tmp_name);
gpr_free(tmp_name);
- gpr_slice_unref(slice);
- gpr_slice_unref(slice_with_null_term);
+ grpc_slice_unref(slice);
+ grpc_slice_unref(slice_with_null_term);
}
static void test_load_big_file(void) {
FILE *tmp = NULL;
- gpr_slice slice;
+ grpc_slice slice;
grpc_error *error;
char *tmp_name;
static const size_t buffer_size = 124631;
@@ -153,15 +153,15 @@ static void test_load_big_file(void) {
error = grpc_load_file(tmp_name, 0, &slice);
GPR_ASSERT(error == GRPC_ERROR_NONE);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == buffer_size);
- current = GPR_SLICE_START_PTR(slice);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == buffer_size);
+ current = GRPC_SLICE_START_PTR(slice);
for (i = 0; i < buffer_size; i++) {
GPR_ASSERT(current[i] == 42);
}
remove(tmp_name);
gpr_free(tmp_name);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
gpr_free(buffer);
}
diff --git a/test/core/iomgr/resolve_address_test.c b/test/core/iomgr/resolve_address_test.c
index 2dd0d88b3f..e4136a7a7a 100644
--- a/test/core/iomgr/resolve_address_test.c
+++ b/test/core/iomgr/resolve_address_test.c
@@ -32,8 +32,10 @@
*/
#include "src/core/lib/iomgr/resolve_address.h"
+#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
+#include <grpc/support/thd.h>
#include <grpc/support/time.h>
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/iomgr.h"
@@ -46,16 +48,72 @@ static gpr_timespec test_deadline(void) {
typedef struct args_struct {
gpr_event ev;
grpc_resolved_addresses *addrs;
+ gpr_atm done_atm;
+ gpr_mu *mu;
+ grpc_pollset *pollset;
+ grpc_pollset_set *pollset_set;
} args_struct;
-void args_init(args_struct *args) {
+static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
+
+void args_init(grpc_exec_ctx *exec_ctx, args_struct *args) {
gpr_event_init(&args->ev);
+ args->pollset = gpr_malloc(grpc_pollset_size());
+ grpc_pollset_init(args->pollset, &args->mu);
+ args->pollset_set = grpc_pollset_set_create();
+ grpc_pollset_set_add_pollset(exec_ctx, args->pollset_set, args->pollset);
args->addrs = NULL;
}
-void args_finish(args_struct *args) {
+void args_finish(grpc_exec_ctx *exec_ctx, args_struct *args) {
GPR_ASSERT(gpr_event_wait(&args->ev, test_deadline()));
grpc_resolved_addresses_destroy(args->addrs);
+ grpc_pollset_set_del_pollset(exec_ctx, args->pollset_set, args->pollset);
+ grpc_pollset_set_destroy(args->pollset_set);
+ grpc_closure do_nothing_cb;
+ grpc_closure_init(&do_nothing_cb, do_nothing, NULL);
+ grpc_pollset_shutdown(exec_ctx, args->pollset, &do_nothing_cb);
+ // exec_ctx needs to be flushed before calling grpc_pollset_destroy()
+ grpc_exec_ctx_flush(exec_ctx);
+ grpc_pollset_destroy(args->pollset);
+ gpr_free(args->pollset);
+}
+
+static gpr_timespec n_sec_deadline(int seconds) {
+ return gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+ gpr_time_from_seconds(seconds, GPR_TIMESPAN));
+}
+
+static void actually_poll(void *argsp) {
+ args_struct *args = argsp;
+ gpr_timespec deadline = n_sec_deadline(10);
+ while (true) {
+ bool done = gpr_atm_acq_load(&args->done_atm) != 0;
+ if (done) {
+ break;
+ }
+ gpr_timespec time_left =
+ gpr_time_sub(deadline, gpr_now(GPR_CLOCK_REALTIME));
+ gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRId64 ".%09d", done,
+ time_left.tv_sec, time_left.tv_nsec);
+ GPR_ASSERT(gpr_time_cmp(time_left, gpr_time_0(GPR_TIMESPAN)) >= 0);
+ grpc_pollset_worker *worker = NULL;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ gpr_mu_lock(args->mu);
+ GRPC_LOG_IF_ERROR(
+ "pollset_work",
+ grpc_pollset_work(&exec_ctx, args->pollset, &worker,
+ gpr_now(GPR_CLOCK_REALTIME), n_sec_deadline(1)));
+ gpr_mu_unlock(args->mu);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ gpr_event_set(&args->ev, (void *)1);
+}
+
+static void poll_pollset_until_request_done(args_struct *args) {
+ gpr_atm_rel_store(&args->done_atm, 0);
+ gpr_thd_id id;
+ gpr_thd_new(&id, actually_poll, args, NULL);
}
static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp,
@@ -64,53 +122,57 @@ static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp,
GPR_ASSERT(err == GRPC_ERROR_NONE);
GPR_ASSERT(args->addrs != NULL);
GPR_ASSERT(args->addrs->naddrs > 0);
- gpr_event_set(&args->ev, (void *)1);
+ gpr_atm_rel_store(&args->done_atm, 1);
}
static void must_fail(grpc_exec_ctx *exec_ctx, void *argsp, grpc_error *err) {
args_struct *args = argsp;
GPR_ASSERT(err != GRPC_ERROR_NONE);
- gpr_event_set(&args->ev, (void *)1);
+ gpr_atm_rel_store(&args->done_atm, 1);
}
static void test_localhost(void) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, "localhost:1", NULL,
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, "localhost:1", NULL, args.pollset_set,
grpc_closure_create(must_succeed, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
static void test_default_port(void) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, "localhost", "1",
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, "localhost", "1", args.pollset_set,
grpc_closure_create(must_succeed, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
static void test_missing_default_port(void) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, "localhost", NULL,
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, "localhost", NULL, args.pollset_set,
grpc_closure_create(must_fail, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
static void test_ipv6_with_port(void) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, "[2001:db8::1]:1", NULL,
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, "[2001:db8::1]:1", NULL, args.pollset_set,
grpc_closure_create(must_succeed, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
static void test_ipv6_without_port(void) {
@@ -119,13 +181,14 @@ static void test_ipv6_without_port(void) {
};
unsigned i;
for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, kCases[i], "80",
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, kCases[i], "80", args.pollset_set,
grpc_closure_create(must_succeed, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
}
@@ -135,13 +198,14 @@ static void test_invalid_ip_addresses(void) {
};
unsigned i;
for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, kCases[i], NULL,
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, kCases[i], NULL, args.pollset_set,
grpc_closure_create(must_fail, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
}
@@ -151,13 +215,14 @@ static void test_unparseable_hostports(void) {
};
unsigned i;
for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
- args_struct args;
- args_init(&args);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_resolve_address(&exec_ctx, kCases[i], "1",
+ args_struct args;
+ args_init(&exec_ctx, &args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(&exec_ctx, kCases[i], "1", args.pollset_set,
grpc_closure_create(must_fail, &args), &args.addrs);
+ args_finish(&exec_ctx, &args);
grpc_exec_ctx_finish(&exec_ctx);
- args_finish(&args);
}
}
diff --git a/test/core/iomgr/resource_quota_test.c b/test/core/iomgr/resource_quota_test.c
new file mode 100644
index 0000000000..a82d44f7f8
--- /dev/null
+++ b/test/core/iomgr/resource_quota_test.c
@@ -0,0 +1,698 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/lib/iomgr/resource_quota.h"
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+
+#include "test/core/util/test_config.h"
+
+static void inc_int_cb(grpc_exec_ctx *exec_ctx, void *a, grpc_error *error) {
+ ++*(int *)a;
+}
+
+static void set_bool_cb(grpc_exec_ctx *exec_ctx, void *a, grpc_error *error) {
+ *(bool *)a = true;
+}
+grpc_closure *set_bool(bool *p) { return grpc_closure_create(set_bool_cb, p); }
+
+typedef struct {
+ size_t size;
+ grpc_resource_user *resource_user;
+ grpc_closure *then;
+} reclaimer_args;
+static void reclaimer_cb(grpc_exec_ctx *exec_ctx, void *args,
+ grpc_error *error) {
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ reclaimer_args *a = args;
+ grpc_resource_user_free(exec_ctx, a->resource_user, a->size);
+ grpc_resource_user_finish_reclamation(exec_ctx, a->resource_user);
+ grpc_closure_run(exec_ctx, a->then, GRPC_ERROR_NONE);
+ gpr_free(a);
+}
+grpc_closure *make_reclaimer(grpc_resource_user *resource_user, size_t size,
+ grpc_closure *then) {
+ reclaimer_args *a = gpr_malloc(sizeof(*a));
+ a->size = size;
+ a->resource_user = resource_user;
+ a->then = then;
+ return grpc_closure_create(reclaimer_cb, a);
+}
+
+static void unused_reclaimer_cb(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ GPR_ASSERT(error == GRPC_ERROR_CANCELLED);
+ grpc_closure_run(exec_ctx, arg, GRPC_ERROR_NONE);
+}
+grpc_closure *make_unused_reclaimer(grpc_closure *then) {
+ return grpc_closure_create(unused_reclaimer_cb, then);
+}
+
+static void destroy_user(grpc_resource_user *usr) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_unref(&exec_ctx, usr);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static void test_no_op(void) {
+ gpr_log(GPR_INFO, "** test_no_op **");
+ grpc_resource_quota_unref(grpc_resource_quota_create("test_no_op"));
+}
+
+static void test_resize_then_destroy(void) {
+ gpr_log(GPR_INFO, "** test_resize_then_destroy **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_resize_then_destroy");
+ grpc_resource_quota_resize(q, 1024 * 1024);
+ grpc_resource_quota_unref(q);
+}
+
+static void test_resource_user_no_op(void) {
+ gpr_log(GPR_INFO, "** test_resource_user_no_op **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_resource_user_no_op");
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_instant_alloc_then_free(void) {
+ gpr_log(GPR_INFO, "** test_instant_alloc_then_free **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_instant_alloc_then_free");
+ grpc_resource_quota_resize(q, 1024 * 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_instant_alloc_free_pair(void) {
+ gpr_log(GPR_INFO, "** test_instant_alloc_free_pair **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_instant_alloc_free_pair");
+ grpc_resource_quota_resize(q, 1024 * 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_simple_async_alloc(void) {
+ gpr_log(GPR_INFO, "** test_simple_async_alloc **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_simple_async_alloc");
+ grpc_resource_quota_resize(q, 1024 * 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_async_alloc_blocked_by_size(void) {
+ gpr_log(GPR_INFO, "** test_async_alloc_blocked_by_size **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_async_alloc_blocked_by_size");
+ grpc_resource_quota_resize(q, 1);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ bool done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!done);
+ }
+ grpc_resource_quota_resize(q, 1024);
+ GPR_ASSERT(done);
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_scavenge(void) {
+ gpr_log(GPR_INFO, "** test_scavenge **");
+ grpc_resource_quota *q = grpc_resource_quota_create("test_scavenge");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
+ grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr1, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr1, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr2, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr2, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr1);
+ destroy_user(usr2);
+}
+
+static void test_scavenge_blocked(void) {
+ gpr_log(GPR_INFO, "** test_scavenge_blocked **");
+ grpc_resource_quota *q = grpc_resource_quota_create("test_scavenge_blocked");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
+ grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+ bool done;
+ {
+ done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr1, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr2, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr1, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr2, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr1);
+ destroy_user(usr2);
+}
+
+static void test_blocked_until_scheduled_reclaim(void) {
+ gpr_log(GPR_INFO, "** test_blocked_until_scheduled_reclaim **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_blocked_until_scheduled_reclaim");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ bool reclaim_done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false,
+ make_reclaimer(usr, 1024, set_bool(&reclaim_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(reclaim_done);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_blocked_until_scheduled_reclaim_and_scavenge(void) {
+ gpr_log(GPR_INFO, "** test_blocked_until_scheduled_reclaim_and_scavenge **");
+ grpc_resource_quota *q = grpc_resource_quota_create(
+ "test_blocked_until_scheduled_reclaim_and_scavenge");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
+ grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr1, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ bool reclaim_done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr1, false,
+ make_reclaimer(usr1, 1024, set_bool(&reclaim_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr2, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(reclaim_done);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr2, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr1);
+ destroy_user(usr2);
+}
+
+static void test_blocked_until_scheduled_destructive_reclaim(void) {
+ gpr_log(GPR_INFO, "** test_blocked_until_scheduled_destructive_reclaim **");
+ grpc_resource_quota *q = grpc_resource_quota_create(
+ "test_blocked_until_scheduled_destructive_reclaim");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ bool reclaim_done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, true,
+ make_reclaimer(usr, 1024, set_bool(&reclaim_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(reclaim_done);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+}
+
+static void test_unused_reclaim_is_cancelled(void) {
+ gpr_log(GPR_INFO, "** test_unused_reclaim_is_cancelled **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_unused_reclaim_is_cancelled");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ bool benign_done = false;
+ bool destructive_done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false, make_unused_reclaimer(set_bool(&benign_done)));
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, true,
+ make_unused_reclaimer(set_bool(&destructive_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!benign_done);
+ GPR_ASSERT(!destructive_done);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+ GPR_ASSERT(benign_done);
+ GPR_ASSERT(destructive_done);
+}
+
+static void test_benign_reclaim_is_preferred(void) {
+ gpr_log(GPR_INFO, "** test_benign_reclaim_is_preferred **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_benign_reclaim_is_preferred");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ bool benign_done = false;
+ bool destructive_done = false;
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false,
+ make_reclaimer(usr, 1024, set_bool(&benign_done)));
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, true,
+ make_unused_reclaimer(set_bool(&destructive_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!benign_done);
+ GPR_ASSERT(!destructive_done);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(benign_done);
+ GPR_ASSERT(!destructive_done);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+ GPR_ASSERT(benign_done);
+ GPR_ASSERT(destructive_done);
+}
+
+static void test_multiple_reclaims_can_be_triggered(void) {
+ gpr_log(GPR_INFO, "** test_multiple_reclaims_can_be_triggered **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_multiple_reclaims_can_be_triggered");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ bool benign_done = false;
+ bool destructive_done = false;
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false,
+ make_reclaimer(usr, 512, set_bool(&benign_done)));
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, true,
+ make_reclaimer(usr, 512, set_bool(&destructive_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!benign_done);
+ GPR_ASSERT(!destructive_done);
+ }
+ {
+ bool done = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&done));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(benign_done);
+ GPR_ASSERT(destructive_done);
+ GPR_ASSERT(done);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ grpc_resource_quota_unref(q);
+ destroy_user(usr);
+ GPR_ASSERT(benign_done);
+ GPR_ASSERT(destructive_done);
+}
+
+static void test_resource_user_stays_allocated_until_memory_released(void) {
+ gpr_log(GPR_INFO,
+ "** test_resource_user_stays_allocated_until_memory_released **");
+ grpc_resource_quota *q = grpc_resource_quota_create(
+ "test_resource_user_stays_allocated_until_memory_released");
+ grpc_resource_quota_resize(q, 1024 * 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_quota_unref(q);
+ grpc_resource_user_unref(&exec_ctx, usr);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+}
+
+static void
+test_resource_user_stays_allocated_and_reclaimers_unrun_until_memory_released(
+ void) {
+ gpr_log(GPR_INFO,
+ "** "
+ "test_resource_user_stays_allocated_and_reclaimers_unrun_until_"
+ "memory_released **");
+ grpc_resource_quota *q = grpc_resource_quota_create(
+ "test_resource_user_stays_allocated_and_reclaimers_unrun_until_memory_"
+ "released");
+ grpc_resource_quota_resize(q, 1024);
+ for (int i = 0; i < 10; i++) {
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ bool reclaimer_cancelled = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false,
+ make_unused_reclaimer(set_bool(&reclaimer_cancelled)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!reclaimer_cancelled);
+ }
+ {
+ bool allocated = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&allocated));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(allocated);
+ GPR_ASSERT(!reclaimer_cancelled);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_unref(&exec_ctx, usr);
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!reclaimer_cancelled);
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(reclaimer_cancelled);
+ }
+ }
+ grpc_resource_quota_unref(q);
+}
+
+static void test_reclaimers_can_be_posted_repeatedly(void) {
+ gpr_log(GPR_INFO, "** test_reclaimers_can_be_posted_repeatedly **");
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_reclaimers_can_be_posted_repeatedly");
+ grpc_resource_quota_resize(q, 1024);
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+ {
+ bool allocated = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&allocated));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(allocated);
+ }
+ for (int i = 0; i < 10; i++) {
+ bool reclaimer_done = false;
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_post_reclaimer(
+ &exec_ctx, usr, false,
+ make_reclaimer(usr, 1024, set_bool(&reclaimer_done)));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(!reclaimer_done);
+ }
+ {
+ bool allocated = false;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc(&exec_ctx, usr, 1024, set_bool(&allocated));
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(allocated);
+ GPR_ASSERT(reclaimer_done);
+ }
+ }
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_free(&exec_ctx, usr, 1024);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+ destroy_user(usr);
+ grpc_resource_quota_unref(q);
+}
+
+static void test_one_slice(void) {
+ gpr_log(GPR_INFO, "** test_one_slice **");
+
+ grpc_resource_quota *q = grpc_resource_quota_create("test_one_slice");
+ grpc_resource_quota_resize(q, 1024);
+
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+
+ grpc_resource_user_slice_allocator alloc;
+ int num_allocs = 0;
+ grpc_resource_user_slice_allocator_init(&alloc, usr, inc_int_cb, &num_allocs);
+
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+
+ {
+ const int start_allocs = num_allocs;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc_slices(&exec_ctx, &alloc, 1024, 1, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(num_allocs == start_allocs + 1);
+ }
+
+ grpc_slice_buffer_destroy(&buffer);
+ destroy_user(usr);
+ grpc_resource_quota_unref(q);
+}
+
+static void test_one_slice_deleted_late(void) {
+ gpr_log(GPR_INFO, "** test_one_slice_deleted_late **");
+
+ grpc_resource_quota *q =
+ grpc_resource_quota_create("test_one_slice_deleted_late");
+ grpc_resource_quota_resize(q, 1024);
+
+ grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+
+ grpc_resource_user_slice_allocator alloc;
+ int num_allocs = 0;
+ grpc_resource_user_slice_allocator_init(&alloc, usr, inc_int_cb, &num_allocs);
+
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+
+ {
+ const int start_allocs = num_allocs;
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_alloc_slices(&exec_ctx, &alloc, 1024, 1, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(num_allocs == start_allocs + 1);
+ }
+
+ {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_resource_user_unref(&exec_ctx, usr);
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+
+ grpc_resource_quota_unref(q);
+ grpc_slice_buffer_destroy(&buffer);
+}
+
+int main(int argc, char **argv) {
+ grpc_test_init(argc, argv);
+ grpc_init();
+ test_no_op();
+ test_resize_then_destroy();
+ test_resource_user_no_op();
+ test_instant_alloc_then_free();
+ test_instant_alloc_free_pair();
+ test_simple_async_alloc();
+ test_async_alloc_blocked_by_size();
+ test_scavenge();
+ test_scavenge_blocked();
+ test_blocked_until_scheduled_reclaim();
+ test_blocked_until_scheduled_reclaim_and_scavenge();
+ test_blocked_until_scheduled_destructive_reclaim();
+ test_unused_reclaim_is_cancelled();
+ test_benign_reclaim_is_preferred();
+ test_multiple_reclaims_can_be_triggered();
+ test_resource_user_stays_allocated_until_memory_released();
+ test_resource_user_stays_allocated_and_reclaimers_unrun_until_memory_released();
+ test_reclaimers_can_be_posted_repeatedly();
+ test_one_slice();
+ test_one_slice_deleted_late();
+ grpc_shutdown();
+ return 0;
+}
diff --git a/test/core/iomgr/socket_utils_test.c b/test/core/iomgr/socket_utils_test.c
index 67bc914c15..7eee2d1d10 100644
--- a/test/core/iomgr/socket_utils_test.c
+++ b/test/core/iomgr/socket_utils_test.c
@@ -39,13 +39,57 @@
#include "src/core/lib/iomgr/socket_utils_posix.h"
#include <errno.h>
+#include <netinet/ip.h>
#include <string.h>
+#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
+#include <grpc/support/sync.h>
+#include <grpc/support/useful.h>
+#include "src/core/lib/iomgr/socket_mutator.h"
#include "test/core/util/test_config.h"
+struct test_socket_mutator {
+ grpc_socket_mutator base;
+ int option_value;
+};
+
+static bool mutate_fd(int fd, grpc_socket_mutator *mutator) {
+ int newval;
+ socklen_t intlen = sizeof(newval);
+ struct test_socket_mutator *m = (struct test_socket_mutator *)mutator;
+
+ if (0 != setsockopt(fd, IPPROTO_IP, IP_TOS, &m->option_value,
+ sizeof(m->option_value))) {
+ return false;
+ }
+ if (0 != getsockopt(fd, IPPROTO_IP, IP_TOS, &newval, &intlen)) {
+ return false;
+ }
+ if (newval != m->option_value) {
+ return false;
+ }
+ return true;
+}
+
+static void destroy_test_mutator(grpc_socket_mutator *mutator) {
+ struct test_socket_mutator *m = (struct test_socket_mutator *)mutator;
+ gpr_free(m);
+}
+
+static int compare_test_mutator(grpc_socket_mutator *a,
+ grpc_socket_mutator *b) {
+ struct test_socket_mutator *ma = (struct test_socket_mutator *)a;
+ struct test_socket_mutator *mb = (struct test_socket_mutator *)b;
+ return GPR_ICMP(ma->option_value, mb->option_value);
+}
+
+static const grpc_socket_mutator_vtable mutator_vtable = {
+ mutate_fd, compare_test_mutator, destroy_test_mutator};
+
int main(int argc, char **argv) {
int sock;
+ grpc_error *err;
grpc_test_init(argc, argv);
sock = socket(PF_INET, SOCK_STREAM, 0);
@@ -68,6 +112,29 @@ int main(int argc, char **argv) {
GPR_ASSERT(GRPC_LOG_IF_ERROR("set_socket_low_latency",
grpc_set_socket_low_latency(sock, 0)));
+ struct test_socket_mutator mutator;
+ grpc_socket_mutator_init(&mutator.base, &mutator_vtable);
+
+ mutator.option_value = IPTOS_LOWDELAY;
+ GPR_ASSERT(GRPC_LOG_IF_ERROR(
+ "set_socket_with_mutator",
+ grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+
+ mutator.option_value = IPTOS_THROUGHPUT;
+ GPR_ASSERT(GRPC_LOG_IF_ERROR(
+ "set_socket_with_mutator",
+ grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+
+ mutator.option_value = IPTOS_RELIABILITY;
+ GPR_ASSERT(GRPC_LOG_IF_ERROR(
+ "set_socket_with_mutator",
+ grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+
+ mutator.option_value = -1;
+ err = grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator);
+ GPR_ASSERT(err != GRPC_ERROR_NONE);
+ GRPC_ERROR_UNREF(err);
+
close(sock);
return 0;
diff --git a/test/core/iomgr/tcp_client_posix_test.c b/test/core/iomgr/tcp_client_posix_test.c
index 6c6962ed7a..5fab826fb7 100644
--- a/test/core/iomgr/tcp_client_posix_test.c
+++ b/test/core/iomgr/tcp_client_posix_test.c
@@ -114,7 +114,7 @@ void test_succeeds(void) {
GPR_ASSERT(getsockname(svr_fd, (struct sockaddr *)addr,
(socklen_t *)&resolved_addr.len) == 0);
grpc_closure_init(&done, must_succeed, NULL);
- grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, g_pollset_set,
+ grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, g_pollset_set, NULL,
&resolved_addr, gpr_inf_future(GPR_CLOCK_REALTIME));
/* await the connection */
@@ -164,7 +164,7 @@ void test_fails(void) {
/* connect to a broken address */
grpc_closure_init(&done, must_fail, NULL);
- grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, g_pollset_set,
+ grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, g_pollset_set, NULL,
&resolved_addr, gpr_inf_future(GPR_CLOCK_REALTIME));
gpr_mu_lock(g_mu);
diff --git a/test/core/iomgr/tcp_posix_test.c b/test/core/iomgr/tcp_posix_test.c
index d998958744..5eafa570bb 100644
--- a/test/core/iomgr/tcp_posix_test.c
+++ b/test/core/iomgr/tcp_posix_test.c
@@ -124,22 +124,22 @@ struct read_socket_state {
grpc_endpoint *ep;
size_t read_bytes;
size_t target_read_bytes;
- gpr_slice_buffer incoming;
+ grpc_slice_buffer incoming;
grpc_closure read_cb;
};
-static size_t count_slices(gpr_slice *slices, size_t nslices,
+static size_t count_slices(grpc_slice *slices, size_t nslices,
int *current_data) {
size_t num_bytes = 0;
unsigned i, j;
unsigned char *buf;
for (i = 0; i < nslices; ++i) {
- buf = GPR_SLICE_START_PTR(slices[i]);
- for (j = 0; j < GPR_SLICE_LENGTH(slices[i]); ++j) {
+ buf = GRPC_SLICE_START_PTR(slices[i]);
+ for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
GPR_ASSERT(buf[j] == *current_data);
*current_data = (*current_data + 1) % 256;
}
- num_bytes += GPR_SLICE_LENGTH(slices[i]);
+ num_bytes += GRPC_SLICE_LENGTH(slices[i]);
}
return num_bytes;
}
@@ -181,7 +181,10 @@ static void read_test(size_t num_bytes, size_t slice_size) {
create_sockets(sv);
- ep = grpc_tcp_create(grpc_fd_create(sv[1], "read_test"), slice_size, "test");
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create("read_test");
+ ep = grpc_tcp_create(grpc_fd_create(sv[1], "read_test"), resource_quota,
+ slice_size, "test");
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, ep, g_pollset);
written_bytes = fill_socket_partial(sv[0], num_bytes);
@@ -190,7 +193,7 @@ static void read_test(size_t num_bytes, size_t slice_size) {
state.ep = ep;
state.read_bytes = 0;
state.target_read_bytes = written_bytes;
- gpr_slice_buffer_init(&state.incoming);
+ grpc_slice_buffer_init(&state.incoming);
grpc_closure_init(&state.read_cb, read_cb, &state);
grpc_endpoint_read(&exec_ctx, ep, &state.incoming, &state.read_cb);
@@ -209,7 +212,7 @@ static void read_test(size_t num_bytes, size_t slice_size) {
GPR_ASSERT(state.read_bytes == state.target_read_bytes);
gpr_mu_unlock(g_mu);
- gpr_slice_buffer_destroy(&state.incoming);
+ grpc_slice_buffer_destroy(&state.incoming);
grpc_endpoint_destroy(&exec_ctx, ep);
grpc_exec_ctx_finish(&exec_ctx);
}
@@ -228,8 +231,11 @@ static void large_read_test(size_t slice_size) {
create_sockets(sv);
- ep = grpc_tcp_create(grpc_fd_create(sv[1], "large_read_test"), slice_size,
- "test");
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("large_read_test");
+ ep = grpc_tcp_create(grpc_fd_create(sv[1], "large_read_test"), resource_quota,
+ slice_size, "test");
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, ep, g_pollset);
written_bytes = fill_socket(sv[0]);
@@ -238,7 +244,7 @@ static void large_read_test(size_t slice_size) {
state.ep = ep;
state.read_bytes = 0;
state.target_read_bytes = (size_t)written_bytes;
- gpr_slice_buffer_init(&state.incoming);
+ grpc_slice_buffer_init(&state.incoming);
grpc_closure_init(&state.read_cb, read_cb, &state);
grpc_endpoint_read(&exec_ctx, ep, &state.incoming, &state.read_cb);
@@ -257,7 +263,7 @@ static void large_read_test(size_t slice_size) {
GPR_ASSERT(state.read_bytes == state.target_read_bytes);
gpr_mu_unlock(g_mu);
- gpr_slice_buffer_destroy(&state.incoming);
+ grpc_slice_buffer_destroy(&state.incoming);
grpc_endpoint_destroy(&exec_ctx, ep);
grpc_exec_ctx_finish(&exec_ctx);
}
@@ -267,21 +273,21 @@ struct write_socket_state {
int write_done;
};
-static gpr_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
- size_t *num_blocks, uint8_t *current_data) {
+static grpc_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
+ size_t *num_blocks, uint8_t *current_data) {
size_t nslices = num_bytes / slice_size + (num_bytes % slice_size ? 1u : 0u);
- gpr_slice *slices = gpr_malloc(sizeof(gpr_slice) * nslices);
+ grpc_slice *slices = gpr_malloc(sizeof(grpc_slice) * nslices);
size_t num_bytes_left = num_bytes;
unsigned i, j;
unsigned char *buf;
*num_blocks = nslices;
for (i = 0; i < nslices; ++i) {
- slices[i] = gpr_slice_malloc(slice_size > num_bytes_left ? num_bytes_left
- : slice_size);
- num_bytes_left -= GPR_SLICE_LENGTH(slices[i]);
- buf = GPR_SLICE_START_PTR(slices[i]);
- for (j = 0; j < GPR_SLICE_LENGTH(slices[i]); ++j) {
+ slices[i] = grpc_slice_malloc(slice_size > num_bytes_left ? num_bytes_left
+ : slice_size);
+ num_bytes_left -= GRPC_SLICE_LENGTH(slices[i]);
+ buf = GRPC_SLICE_START_PTR(slices[i]);
+ for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
buf[j] = *current_data;
(*current_data)++;
}
@@ -351,9 +357,9 @@ static void write_test(size_t num_bytes, size_t slice_size) {
grpc_endpoint *ep;
struct write_socket_state state;
size_t num_blocks;
- gpr_slice *slices;
+ grpc_slice *slices;
uint8_t current_data = 0;
- gpr_slice_buffer outgoing;
+ grpc_slice_buffer outgoing;
grpc_closure write_done_closure;
gpr_timespec deadline = GRPC_TIMEOUT_SECONDS_TO_DEADLINE(20);
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -364,8 +370,11 @@ static void write_test(size_t num_bytes, size_t slice_size) {
create_sockets(sv);
- ep = grpc_tcp_create(grpc_fd_create(sv[1], "write_test"),
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("write_test");
+ ep = grpc_tcp_create(grpc_fd_create(sv[1], "write_test"), resource_quota,
GRPC_TCP_DEFAULT_READ_SLICE_SIZE, "test");
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, ep, g_pollset);
state.ep = ep;
@@ -373,8 +382,8 @@ static void write_test(size_t num_bytes, size_t slice_size) {
slices = allocate_blocks(num_bytes, slice_size, &num_blocks, &current_data);
- gpr_slice_buffer_init(&outgoing);
- gpr_slice_buffer_addn(&outgoing, slices, num_blocks);
+ grpc_slice_buffer_init(&outgoing);
+ grpc_slice_buffer_addn(&outgoing, slices, num_blocks);
grpc_closure_init(&write_done_closure, write_done, &state);
grpc_endpoint_write(&exec_ctx, ep, &outgoing, &write_done_closure);
@@ -395,7 +404,7 @@ static void write_test(size_t num_bytes, size_t slice_size) {
}
gpr_mu_unlock(g_mu);
- gpr_slice_buffer_destroy(&outgoing);
+ grpc_slice_buffer_destroy(&outgoing);
grpc_endpoint_destroy(&exec_ctx, ep);
gpr_free(slices);
grpc_exec_ctx_finish(&exec_ctx);
@@ -428,8 +437,12 @@ static void release_fd_test(size_t num_bytes, size_t slice_size) {
create_sockets(sv);
- ep = grpc_tcp_create(grpc_fd_create(sv[1], "read_test"), slice_size, "test");
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("release_fd_test");
+ ep = grpc_tcp_create(grpc_fd_create(sv[1], "read_test"), resource_quota,
+ slice_size, "test");
GPR_ASSERT(grpc_tcp_fd(ep) == sv[1] && sv[1] >= 0);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, ep, g_pollset);
written_bytes = fill_socket_partial(sv[0], num_bytes);
@@ -438,7 +451,7 @@ static void release_fd_test(size_t num_bytes, size_t slice_size) {
state.ep = ep;
state.read_bytes = 0;
state.target_read_bytes = written_bytes;
- gpr_slice_buffer_init(&state.incoming);
+ grpc_slice_buffer_init(&state.incoming);
grpc_closure_init(&state.read_cb, read_cb, &state);
grpc_endpoint_read(&exec_ctx, ep, &state.incoming, &state.read_cb);
@@ -450,15 +463,18 @@ static void release_fd_test(size_t num_bytes, size_t slice_size) {
"pollset_work",
grpc_pollset_work(&exec_ctx, g_pollset, &worker,
gpr_now(GPR_CLOCK_MONOTONIC), deadline)));
+ gpr_log(GPR_DEBUG, "wakeup: read=%" PRIdPTR " target=%" PRIdPTR,
+ state.read_bytes, state.target_read_bytes);
gpr_mu_unlock(g_mu);
- grpc_exec_ctx_finish(&exec_ctx);
+ grpc_exec_ctx_flush(&exec_ctx);
gpr_mu_lock(g_mu);
}
GPR_ASSERT(state.read_bytes == state.target_read_bytes);
gpr_mu_unlock(g_mu);
- gpr_slice_buffer_destroy(&state.incoming);
+ grpc_slice_buffer_destroy(&state.incoming);
grpc_tcp_destroy_and_release_fd(&exec_ctx, ep, &fd, &fd_released_cb);
+ grpc_exec_ctx_flush(&exec_ctx);
gpr_mu_lock(g_mu);
while (!fd_released_done) {
grpc_pollset_worker *worker = NULL;
@@ -466,6 +482,7 @@ static void release_fd_test(size_t num_bytes, size_t slice_size) {
"pollset_work",
grpc_pollset_work(&exec_ctx, g_pollset, &worker,
gpr_now(GPR_CLOCK_MONOTONIC), deadline)));
+ gpr_log(GPR_DEBUG, "wakeup: fd_released_done=%d", fd_released_done);
}
gpr_mu_unlock(g_mu);
GPR_ASSERT(fd_released_done == 1);
@@ -511,10 +528,13 @@ static grpc_endpoint_test_fixture create_fixture_tcp_socketpair(
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
create_sockets(sv);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("tcp_posix_test_socketpair");
f.client_ep = grpc_tcp_create(grpc_fd_create(sv[0], "fixture:client"),
- slice_size, "test");
+ resource_quota, slice_size, "test");
f.server_ep = grpc_tcp_create(grpc_fd_create(sv[1], "fixture:server"),
- slice_size, "test");
+ resource_quota, slice_size, "test");
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, f.client_ep, g_pollset);
grpc_endpoint_add_to_pollset(&exec_ctx, f.server_ep, g_pollset);
diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c
index f839911a84..9a7810e227 100644
--- a/test/core/iomgr/tcp_server_posix_test.c
+++ b/test/core/iomgr/tcp_server_posix_test.c
@@ -126,6 +126,7 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
on_connect_result temp_result;
on_connect_result_set(&temp_result, acceptor);
+ gpr_free(acceptor);
gpr_mu_lock(g_mu);
g_result = temp_result;
@@ -138,7 +139,8 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
static void test_no_op(void) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_tcp_server *s;
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_tcp_server_create(NULL, NULL, &s));
+ GPR_ASSERT(GRPC_ERROR_NONE ==
+ grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
grpc_tcp_server_unref(&exec_ctx, s);
grpc_exec_ctx_finish(&exec_ctx);
}
@@ -146,7 +148,8 @@ static void test_no_op(void) {
static void test_no_op_with_start(void) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_tcp_server *s;
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_tcp_server_create(NULL, NULL, &s));
+ GPR_ASSERT(GRPC_ERROR_NONE ==
+ grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
LOG_TEST("test_no_op_with_start");
grpc_tcp_server_start(&exec_ctx, s, NULL, 0, on_connect, NULL);
grpc_tcp_server_unref(&exec_ctx, s);
@@ -158,7 +161,8 @@ static void test_no_op_with_port(void) {
grpc_resolved_address resolved_addr;
struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
grpc_tcp_server *s;
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_tcp_server_create(NULL, NULL, &s));
+ GPR_ASSERT(GRPC_ERROR_NONE ==
+ grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
LOG_TEST("test_no_op_with_port");
memset(&resolved_addr, 0, sizeof(resolved_addr));
@@ -178,7 +182,8 @@ static void test_no_op_with_port_and_start(void) {
grpc_resolved_address resolved_addr;
struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
grpc_tcp_server *s;
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_tcp_server_create(NULL, NULL, &s));
+ GPR_ASSERT(GRPC_ERROR_NONE ==
+ grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
LOG_TEST("test_no_op_with_port_and_start");
int port;
@@ -241,7 +246,8 @@ static void test_connect(unsigned n) {
unsigned svr1_fd_count;
int svr1_port;
grpc_tcp_server *s;
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_tcp_server_create(NULL, NULL, &s));
+ GPR_ASSERT(GRPC_ERROR_NONE ==
+ grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
unsigned i;
server_weak_ref weak_ref;
server_weak_ref_init(&weak_ref);
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index d9f9cd748b..9bea229466 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -185,7 +185,7 @@ static void test_receive(int number_of_clients) {
/* Create a socket, send a packet to the UDP server. */
clifd = socket(addr->ss_family, SOCK_DGRAM, 0);
GPR_ASSERT(clifd >= 0);
- GPR_ASSERT(connect(clifd, (struct sockaddr *)&addr,
+ GPR_ASSERT(connect(clifd, (struct sockaddr *)addr,
(socklen_t)resolved_addr.len) == 0);
GPR_ASSERT(5 == write(clifd, "hello", 5));
while (g_number_of_reads == number_of_reads_before &&
diff --git a/test/core/iomgr/wakeup_fd_cv_test.c b/test/core/iomgr/wakeup_fd_cv_test.c
index 82452d2157..04ae9376dd 100644
--- a/test/core/iomgr/wakeup_fd_cv_test.c
+++ b/test/core/iomgr/wakeup_fd_cv_test.c
@@ -195,16 +195,15 @@ void test_poll_cv_trigger(void) {
GPR_ASSERT(pfds[4].revents == 0);
GPR_ASSERT(pfds[5].revents == 0);
- // Pollin on wakeup fd + socket fd
- trigger_socket_event();
+ // Pollin on wakeupfd before poll()
pargs.result = -2;
gpr_thd_new(&t_id, &background_poll, &pargs, &opt);
gpr_thd_join(t_id);
- GPR_ASSERT(pargs.result == 2);
+ GPR_ASSERT(pargs.result == 1);
GPR_ASSERT(pfds[0].revents == 0);
GPR_ASSERT(pfds[1].revents == POLLIN);
- GPR_ASSERT(pfds[2].revents == POLLIN);
+ GPR_ASSERT(pfds[2].revents == 0);
GPR_ASSERT(pfds[3].revents == 0);
GPR_ASSERT(pfds[4].revents == 0);
GPR_ASSERT(pfds[5].revents == 0);
diff --git a/test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536 b/test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536
new file mode 100644
index 0000000000..b3bfc5cf21
--- /dev/null
+++ b/test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536
Binary files differ
diff --git a/test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19 b/test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19
new file mode 100644
index 0000000000..4efad06ca2
--- /dev/null
+++ b/test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19
Binary files differ
diff --git a/test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80 b/test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80
new file mode 100644
index 0000000000..e61ffbce2e
--- /dev/null
+++ b/test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80
Binary files differ
diff --git a/test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34 b/test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34
new file mode 100644
index 0000000000..f75fef1797
--- /dev/null
+++ b/test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34
Binary files differ
diff --git a/test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471 b/test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471
new file mode 100644
index 0000000000..b00a1d09b9
--- /dev/null
+++ b/test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471
Binary files differ
diff --git a/test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5 b/test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5
new file mode 100644
index 0000000000..1ea3c318f0
--- /dev/null
+++ b/test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5
Binary files differ
diff --git a/test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2 b/test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2
new file mode 100644
index 0000000000..1c534a9fd2
--- /dev/null
+++ b/test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2
Binary files differ
diff --git a/test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28 b/test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28
new file mode 100644
index 0000000000..eeeb13c139
--- /dev/null
+++ b/test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28
Binary files differ
diff --git a/test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64 b/test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64
new file mode 100644
index 0000000000..0e2faa74f5
--- /dev/null
+++ b/test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64
Binary files differ
diff --git a/test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0 b/test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0
new file mode 100644
index 0000000000..ca3395d508
--- /dev/null
+++ b/test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0
Binary files differ
diff --git a/test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88 b/test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88
new file mode 100644
index 0000000000..0f8a33a217
--- /dev/null
+++ b/test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88
Binary files differ
diff --git a/test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da732 b/test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da732
new file mode 100644
index 0000000000..813b47ed0c
--- /dev/null
+++ b/test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da732
@@ -0,0 +1 @@
+¼™'Ì)%±ƒ™Þ “)½½“2ƒ;ÎÃ;Î)±%Ì):) \ No newline at end of file
diff --git a/test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3 b/test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3
new file mode 100644
index 0000000000..39e01da119
--- /dev/null
+++ b/test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3
Binary files differ
diff --git a/test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1 b/test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1
new file mode 100644
index 0000000000..905d3ed87c
--- /dev/null
+++ b/test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1
Binary files differ
diff --git a/test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24a b/test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24a
new file mode 100644
index 0000000000..622e1f56ac
--- /dev/null
+++ b/test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24a
Binary files differ
diff --git a/test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422 b/test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422
new file mode 100644
index 0000000000..39063097b5
--- /dev/null
+++ b/test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422
Binary files differ
diff --git a/test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193 b/test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193
new file mode 100644
index 0000000000..79690ed993
--- /dev/null
+++ b/test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193
Binary files differ
diff --git a/test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0c b/test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0c
new file mode 100644
index 0000000000..c7d81507b2
--- /dev/null
+++ b/test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0c
Binary files differ
diff --git a/test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e378900 b/test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e378900
new file mode 100644
index 0000000000..1ef7bff54e
--- /dev/null
+++ b/test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e378900
@@ -0,0 +1 @@
+  :)½: \ No newline at end of file
diff --git a/test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb b/test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb
new file mode 100644
index 0000000000..a139906dbc
--- /dev/null
+++ b/test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb
Binary files differ
diff --git a/test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3 b/test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3
new file mode 100644
index 0000000000..a9ae5ff3e9
--- /dev/null
+++ b/test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3
Binary files differ
diff --git a/test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028c b/test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028c
new file mode 100644
index 0000000000..7593c0407f
--- /dev/null
+++ b/test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028c
Binary files differ
diff --git a/test/core/nanopb/fuzzer_response.c b/test/core/nanopb/fuzzer_response.c
index a82f20df83..202c120c67 100644
--- a/test/core/nanopb/fuzzer_response.c
+++ b/test/core/nanopb/fuzzer_response.c
@@ -45,11 +45,11 @@ static void dont_log(gpr_log_func_args *args) {}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (squelch) gpr_set_log_function(dont_log);
- gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
grpc_grpclb_initial_response *response;
if ((response = grpc_grpclb_initial_response_parse(slice))) {
grpc_grpclb_initial_response_destroy(response);
}
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
return 0;
}
diff --git a/test/core/nanopb/fuzzer_serverlist.c b/test/core/nanopb/fuzzer_serverlist.c
index 9700bf1cda..b225ae0d51 100644
--- a/test/core/nanopb/fuzzer_serverlist.c
+++ b/test/core/nanopb/fuzzer_serverlist.c
@@ -45,11 +45,11 @@ static void dont_log(gpr_log_func_args *args) {}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (squelch) gpr_set_log_function(dont_log);
- gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
grpc_grpclb_serverlist *serverlist;
if ((serverlist = grpc_grpclb_response_parse_serverlist(slice))) {
grpc_grpclb_destroy_serverlist(serverlist);
}
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
return 0;
}
diff --git a/test/core/network_benchmarks/low_level_ping_pong.c b/test/core/network_benchmarks/low_level_ping_pong.c
index 9038d07675..0b2a920873 100644
--- a/test/core/network_benchmarks/low_level_ping_pong.c
+++ b/test/core/network_benchmarks/low_level_ping_pong.c
@@ -56,6 +56,7 @@
#include <grpc/support/thd.h>
#include <grpc/support/time.h>
#include <grpc/support/useful.h>
+#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/socket_utils_posix.h"
typedef struct fd_pair {
@@ -229,12 +230,12 @@ static int blocking_write_bytes(struct thread_args *args, char *buf) {
on the scenario we're using.
*/
static int set_socket_nonblocking(thread_args *args) {
- if (!grpc_set_socket_nonblocking(args->fds.read_fd, 1)) {
- gpr_log(GPR_ERROR, "Unable to set socket nonblocking: %s", strerror(errno));
+ if (!GRPC_LOG_IF_ERROR("Unable to set read socket nonblocking",
+ grpc_set_socket_nonblocking(args->fds.read_fd, 1))) {
return -1;
}
- if (!grpc_set_socket_nonblocking(args->fds.write_fd, 1)) {
- gpr_log(GPR_ERROR, "Unable to set socket nonblocking: %s", strerror(errno));
+ if (!GRPC_LOG_IF_ERROR("Unable to set write socket nonblocking",
+ grpc_set_socket_nonblocking(args->fds.write_fd, 1))) {
return -1;
}
return 0;
@@ -347,10 +348,16 @@ static int create_listening_socket(struct sockaddr *port, socklen_t len) {
goto error;
}
- if (!grpc_set_socket_cloexec(fd, 1) || !grpc_set_socket_low_latency(fd, 1) ||
- !grpc_set_socket_reuse_addr(fd, 1)) {
- gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd,
- strerror(errno));
+ if (!GRPC_LOG_IF_ERROR("Failed to set listening socket cloexec",
+ grpc_set_socket_cloexec(fd, 1))) {
+ goto error;
+ }
+ if (!GRPC_LOG_IF_ERROR("Failed to set listening socket low latency",
+ grpc_set_socket_low_latency(fd, 1))) {
+ goto error;
+ }
+ if (!GRPC_LOG_IF_ERROR("Failed to set listening socket reuse addr",
+ grpc_set_socket_reuse_addr(fd, 1))) {
goto error;
}
@@ -386,8 +393,12 @@ static int connect_client(struct sockaddr *addr, socklen_t len) {
goto error;
}
- if (!grpc_set_socket_cloexec(fd, 1) || !grpc_set_socket_low_latency(fd, 1)) {
- gpr_log(GPR_ERROR, "Failed to configure socket");
+ if (!GRPC_LOG_IF_ERROR("Failed to set connecting socket cloexec",
+ grpc_set_socket_cloexec(fd, 1))) {
+ goto error;
+ }
+ if (!GRPC_LOG_IF_ERROR("Failed to set connecting socket low latency",
+ grpc_set_socket_low_latency(fd, 1))) {
goto error;
}
diff --git a/test/core/profiling/mark_timings.stp b/test/core/profiling/mark_timings.stp
index 0c0a417faf..e96edbc149 100644
--- a/test/core/profiling/mark_timings.stp
+++ b/test/core/profiling/mark_timings.stp
@@ -2,7 +2,7 @@
* probe definition.
*
* For a statically build binary, that'd be the name of the binary itself.
- * For dinamically built ones, point to the location of the libgprc.so being
+ * For dynamically built ones, point to the location of the libgrpc.so being
* used. */
global starts, times, times_per_tag
diff --git a/test/core/security/b64_test.c b/test/core/security/b64_test.c
index b26bd026fd..af883f51e9 100644
--- a/test/core/security/b64_test.c
+++ b/test/core/security/b64_test.c
@@ -35,9 +35,9 @@
#include <string.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include "test/core/util/test_config.h"
static int buffers_are_equal(const unsigned char *buf1,
@@ -57,12 +57,12 @@ static void test_simple_encode_decode_b64(int url_safe, int multiline) {
const char *hello = "hello";
char *hello_b64 =
grpc_base64_encode(hello, strlen(hello), url_safe, multiline);
- gpr_slice hello_slice = grpc_base64_decode(hello_b64, url_safe);
- GPR_ASSERT(GPR_SLICE_LENGTH(hello_slice) == strlen(hello));
- GPR_ASSERT(strncmp((const char *)GPR_SLICE_START_PTR(hello_slice), hello,
- GPR_SLICE_LENGTH(hello_slice)) == 0);
+ grpc_slice hello_slice = grpc_base64_decode(hello_b64, url_safe);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(hello_slice) == strlen(hello));
+ GPR_ASSERT(strncmp((const char *)GRPC_SLICE_START_PTR(hello_slice), hello,
+ GRPC_SLICE_LENGTH(hello_slice)) == 0);
- gpr_slice_unref(hello_slice);
+ grpc_slice_unref(hello_slice);
gpr_free(hello_b64);
}
@@ -70,17 +70,17 @@ static void test_full_range_encode_decode_b64(int url_safe, int multiline) {
unsigned char orig[256];
size_t i;
char *b64;
- gpr_slice orig_decoded;
+ grpc_slice orig_decoded;
for (i = 0; i < sizeof(orig); i++) orig[i] = (uint8_t)i;
/* Try all the different paddings. */
for (i = 0; i < 3; i++) {
b64 = grpc_base64_encode(orig, sizeof(orig) - i, url_safe, multiline);
orig_decoded = grpc_base64_decode(b64, url_safe);
- GPR_ASSERT(GPR_SLICE_LENGTH(orig_decoded) == (sizeof(orig) - i));
- GPR_ASSERT(buffers_are_equal(orig, GPR_SLICE_START_PTR(orig_decoded),
+ GPR_ASSERT(GRPC_SLICE_LENGTH(orig_decoded) == (sizeof(orig) - i));
+ GPR_ASSERT(buffers_are_equal(orig, GRPC_SLICE_START_PTR(orig_decoded),
sizeof(orig) - i));
- gpr_slice_unref(orig_decoded);
+ grpc_slice_unref(orig_decoded);
gpr_free(b64);
}
}
@@ -121,21 +121,21 @@ static void test_url_safe_unsafe_mismtach_failure(void) {
unsigned char orig[256];
size_t i;
char *b64;
- gpr_slice orig_decoded;
+ grpc_slice orig_decoded;
int url_safe = 1;
for (i = 0; i < sizeof(orig); i++) orig[i] = (uint8_t)i;
b64 = grpc_base64_encode(orig, sizeof(orig), url_safe, 0);
orig_decoded = grpc_base64_decode(b64, !url_safe);
- GPR_ASSERT(GPR_SLICE_IS_EMPTY(orig_decoded));
+ GPR_ASSERT(GRPC_SLICE_IS_EMPTY(orig_decoded));
gpr_free(b64);
- gpr_slice_unref(orig_decoded);
+ grpc_slice_unref(orig_decoded);
b64 = grpc_base64_encode(orig, sizeof(orig), !url_safe, 0);
orig_decoded = grpc_base64_decode(b64, url_safe);
- GPR_ASSERT(GPR_SLICE_IS_EMPTY(orig_decoded));
+ GPR_ASSERT(GRPC_SLICE_IS_EMPTY(orig_decoded));
gpr_free(b64);
- gpr_slice_unref(orig_decoded);
+ grpc_slice_unref(orig_decoded);
}
static void test_rfc4648_test_vectors(void) {
@@ -171,40 +171,40 @@ static void test_rfc4648_test_vectors(void) {
}
static void test_unpadded_decode(void) {
- gpr_slice decoded;
+ grpc_slice decoded;
decoded = grpc_base64_decode("Zm9vYmFy", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "foobar") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "foobar") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("Zm9vYmE", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "fooba") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "fooba") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("Zm9vYg", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "foob") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "foob") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("Zm9v", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "foo") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "foo") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("Zm8", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "fo") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "fo") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("Zg", 0);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(decoded));
- GPR_ASSERT(gpr_slice_str_cmp(decoded, "f") == 0);
- gpr_slice_unref(decoded);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(grpc_slice_str_cmp(decoded, "f") == 0);
+ grpc_slice_unref(decoded);
decoded = grpc_base64_decode("", 0);
- GPR_ASSERT(GPR_SLICE_IS_EMPTY(decoded));
+ GPR_ASSERT(GRPC_SLICE_IS_EMPTY(decoded));
}
int main(int argc, char **argv) {
diff --git a/test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690b b/test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690b
new file mode 100644
index 0000000000..272c22d321
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690b
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950a b/test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950a
new file mode 100644
index 0000000000..eeba79a9f2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950a
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656 b/test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656
new file mode 100644
index 0000000000..e699abcea0
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15 b/test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15
new file mode 100644
index 0000000000..13c6a93dcf
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103d b/test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103d
new file mode 100644
index 0000000000..505cfa73fc
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103d
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13c b/test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13c
new file mode 100644
index 0000000000..06020e8895
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13c
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cf b/test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cf
new file mode 100644
index 0000000000..7e77bb6371
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cf
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200 b/test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200
new file mode 100644
index 0000000000..f3b9d87bdf
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01 b/test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01
new file mode 100644
index 0000000000..e300b25dd6
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595e b/test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595e
new file mode 100644
index 0000000000..de233b4df7
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436 b/test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436
new file mode 100644
index 0000000000..c52dac2160
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4 b/test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4
new file mode 100644
index 0000000000..99bde1b486
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0a b/test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0a
new file mode 100644
index 0000000000..e36dac871a
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0a
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f b/test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f
new file mode 100644
index 0000000000..eca71b4ca6
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fd b/test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fd
new file mode 100644
index 0000000000..6a2035fe37
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fd
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655 b/test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655
new file mode 100644
index 0000000000..0d1c163bb2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219 b/test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219
new file mode 100644
index 0000000000..297c1ce649
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84a b/test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84a
new file mode 100644
index 0000000000..9c209ebb50
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84a
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883 b/test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883
new file mode 100644
index 0000000000..e8574594af
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47b b/test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47b
new file mode 100644
index 0000000000..11f9b74e3f
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47b
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4 b/test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4
new file mode 100644
index 0000000000..197cc02ebc
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1 b/test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1
new file mode 100644
index 0000000000..baff50d61d
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36 b/test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36
new file mode 100644
index 0000000000..4fb36b65bb
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253 b/test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253
new file mode 100644
index 0000000000..0bc4da2caa
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7 b/test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7
new file mode 100644
index 0000000000..9e4b559e97
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83 b/test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83
new file mode 100644
index 0000000000..52168fa700
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68e b/test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68e
new file mode 100644
index 0000000000..e35f17d7e4
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17 b/test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17
new file mode 100644
index 0000000000..5692502a64
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609 b/test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609
new file mode 100644
index 0000000000..2de4f1f2bf
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89e b/test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89e
new file mode 100644
index 0000000000..91fd77f9e3
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0 b/test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0
new file mode 100644
index 0000000000..0e8bf5b9dd
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0 b/test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0
new file mode 100644
index 0000000000..0b8827c39b
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527e b/test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527e
new file mode 100644
index 0000000000..9ab3862c7d
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c b/test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c
new file mode 100644
index 0000000000..93d651b9a2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c
@@ -0,0 +1 @@
+ GEF \ No newline at end of file
diff --git a/test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3d b/test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3d
new file mode 100644
index 0000000000..f8a9920fa8
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3d
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802d b/test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802d
new file mode 100644
index 0000000000..25ce7c1041
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802d
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972 b/test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972
new file mode 100644
index 0000000000..db4c693368
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60 b/test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60
new file mode 100644
index 0000000000..74960bda47
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60
@@ -0,0 +1,2 @@
+POST þTF
+û \ No newline at end of file
diff --git a/test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038e b/test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038e
new file mode 100644
index 0000000000..74b7f9c4b2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0 b/test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0
new file mode 100644
index 0000000000..c28d5e39e5
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5 b/test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5
new file mode 100644
index 0000000000..9bfed86391
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682 b/test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682
new file mode 100644
index 0000000000..96343edcfd
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bb b/test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bb
new file mode 100644
index 0000000000..a53b956562
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bb
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49 b/test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49
new file mode 100644
index 0000000000..b6607caf0b
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8de b/test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8de
new file mode 100644
index 0000000000..1a6a772917
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8de
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa104 b/test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa104
new file mode 100644
index 0000000000..11ab460090
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa104
@@ -0,0 +1,2 @@
+CONNEþTF
+û \ No newline at end of file
diff --git a/test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329b b/test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329b
new file mode 100644
index 0000000000..6eddfc2c2a
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329b
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750e b/test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750e
new file mode 100644
index 0000000000..f7cd40b1d0
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750e
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407 b/test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407
new file mode 100644
index 0000000000..cc0b544aba
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c b/test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c
new file mode 100644
index 0000000000..36bf08db66
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c
@@ -0,0 +1 @@
+HTT
diff --git a/test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ec b/test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ec
new file mode 100644
index 0000000000..0a1b6bee6c
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ec
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2 b/test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2
new file mode 100644
index 0000000000..2e3c2c83e3
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1 b/test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1
new file mode 100644
index 0000000000..8f9893f46e
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac b/test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac
new file mode 100644
index 0000000000..4b77d18fef
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41 b/test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41
new file mode 100644
index 0000000000..548f26968d
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52 b/test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52
new file mode 100644
index 0000000000..c0dbbdfc8e
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575 b/test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575
new file mode 100644
index 0000000000..86c59f30eb
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8f b/test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8f
new file mode 100644
index 0000000000..3bb43d133f
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8f
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6 b/test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6
new file mode 100644
index 0000000000..5a1b23f80c
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806 b/test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806
new file mode 100644
index 0000000000..66648167e5
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377ac b/test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377ac
new file mode 100644
index 0000000000..30d80d86c9
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377ac
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcda b/test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcda
new file mode 100644
index 0000000000..0552176dcb
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcda
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4 b/test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4
new file mode 100644
index 0000000000..2c82ef585a
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05 b/test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05
new file mode 100644
index 0000000000..9040ab0a63
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696 b/test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696
new file mode 100644
index 0000000000..473e77e048
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05 b/test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05
new file mode 100644
index 0000000000..09018f3092
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae b/test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae
new file mode 100644
index 0000000000..d0f3d4d116
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae
@@ -0,0 +1 @@
+ÿFT
diff --git a/test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9f b/test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9f
new file mode 100644
index 0000000000..fdb6e038e2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9f
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428 b/test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428
new file mode 100644
index 0000000000..bd6b0d89c1
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207 b/test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207
new file mode 100644
index 0000000000..29873bae09
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2 b/test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2
new file mode 100644
index 0000000000..150b87d741
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870d b/test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870d
new file mode 100644
index 0000000000..32ef98cdb6
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870d
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8 b/test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8
new file mode 100644
index 0000000000..ed09bd0f4a
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7dd b/test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7dd
new file mode 100644
index 0000000000..6aa6cd853f
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7dd
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a4 b/test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a4
new file mode 100644
index 0000000000..05a2a33184
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a4
@@ -0,0 +1 @@
+œHTTP
diff --git a/test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474 b/test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474
new file mode 100644
index 0000000000..09f8c4ef69
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7 b/test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7
new file mode 100644
index 0000000000..b1eceeaa0b
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98 b/test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98
new file mode 100644
index 0000000000..03710842a2
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cf b/test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cf
new file mode 100644
index 0000000000..3086e8e133
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cf
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57 b/test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57
new file mode 100644
index 0000000000..9e88e9e405
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3 b/test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3
new file mode 100644
index 0000000000..8bd63513c9
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8 b/test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8
new file mode 100644
index 0000000000..87dcaf1fc3
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537 b/test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537
new file mode 100644
index 0000000000..463accbde7
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f919 b/test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f919
new file mode 100644
index 0000000000..809604e344
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f919
@@ -0,0 +1 @@
+GET F \ No newline at end of file
diff --git a/test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82d b/test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82d
new file mode 100644
index 0000000000..6f09bd8856
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82d
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39df b/test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39df
new file mode 100644
index 0000000000..e3bf947570
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39df
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1 b/test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1
new file mode 100644
index 0000000000..a2a28cd60b
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9ae b/test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9ae
new file mode 100644
index 0000000000..92a0113f43
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9ae
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8 b/test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8
new file mode 100644
index 0000000000..55f63dcec9
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1da b/test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1da
new file mode 100644
index 0000000000..6363a5796c
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1da
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6 b/test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6
new file mode 100644
index 0000000000..cc292176e8
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040 b/test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040
new file mode 100644
index 0000000000..8379f01823
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5 b/test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5
new file mode 100644
index 0000000000..0a3b794dbf
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251c b/test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251c
new file mode 100644
index 0000000000..146d7f9924
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251c
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6 b/test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6
new file mode 100644
index 0000000000..fa54b7b7b6
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838 b/test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838
new file mode 100644
index 0000000000..02a90fb3a4
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672 b/test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672
new file mode 100644
index 0000000000..c21b9b830e
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16 b/test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16
new file mode 100644
index 0000000000..1159a7772b
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16
Binary files differ
diff --git a/test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1a b/test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1a
new file mode 100644
index 0000000000..85adeac4bb
--- /dev/null
+++ b/test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1a
Binary files differ
diff --git a/test/core/security/create_jwt.c b/test/core/security/create_jwt.c
index 1bd135f175..ac795f29d2 100644
--- a/test/core/security/create_jwt.c
+++ b/test/core/security/create_jwt.c
@@ -37,21 +37,21 @@
#include "src/core/lib/iomgr/load_file.h"
#include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/cmdline.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
void create_jwt(const char *json_key_file_path, const char *service_url,
const char *scope) {
grpc_auth_json_key key;
char *jwt;
- gpr_slice json_key_data;
+ grpc_slice json_key_data;
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"load_file", grpc_load_file(json_key_file_path, 1, &json_key_data)));
key = grpc_auth_json_key_create_from_string(
- (const char *)GPR_SLICE_START_PTR(json_key_data));
- gpr_slice_unref(json_key_data);
+ (const char *)GRPC_SLICE_START_PTR(json_key_data));
+ grpc_slice_unref(json_key_data);
if (!grpc_auth_json_key_is_valid(&key)) {
fprintf(stderr, "Could not parse json key.\n");
exit(1);
@@ -72,6 +72,7 @@ int main(int argc, char **argv) {
char *scope = NULL;
char *json_key_file_path = NULL;
char *service_url = NULL;
+ grpc_init();
gpr_cmdline *cl = gpr_cmdline_create("create_jwt");
gpr_cmdline_add_string(cl, "json_key", "File path of the json key.",
&json_key_file_path);
@@ -102,5 +103,6 @@ int main(int argc, char **argv) {
create_jwt(json_key_file_path, service_url, scope);
gpr_cmdline_destroy(cl);
+ grpc_shutdown();
return 0;
}
diff --git a/test/core/security/credentials_test.c b/test/core/security/credentials_test.c
index b74baa33f1..d4c755088d 100644
--- a/test/core/security/credentials_test.c
+++ b/test/core/security/credentials_test.c
@@ -187,14 +187,14 @@ static void test_add_to_empty_md_store(void) {
grpc_credentials_md_store *store = grpc_credentials_md_store_create(0);
const char *key_str = "hello";
const char *value_str = "there blah blah blah blah blah blah blah";
- gpr_slice key = gpr_slice_from_copied_string(key_str);
- gpr_slice value = gpr_slice_from_copied_string(value_str);
+ grpc_slice key = grpc_slice_from_copied_string(key_str);
+ grpc_slice value = grpc_slice_from_copied_string(value_str);
grpc_credentials_md_store_add(store, key, value);
GPR_ASSERT(store->num_entries == 1);
- GPR_ASSERT(gpr_slice_cmp(key, store->entries[0].key) == 0);
- GPR_ASSERT(gpr_slice_cmp(value, store->entries[0].value) == 0);
- gpr_slice_unref(key);
- gpr_slice_unref(value);
+ GPR_ASSERT(grpc_slice_cmp(key, store->entries[0].key) == 0);
+ GPR_ASSERT(grpc_slice_cmp(value, store->entries[0].value) == 0);
+ grpc_slice_unref(key);
+ grpc_slice_unref(value);
grpc_credentials_md_store_unref(store);
}
@@ -204,8 +204,8 @@ static void test_add_cstrings_to_empty_md_store(void) {
const char *value_str = "there blah blah blah blah blah blah blah";
grpc_credentials_md_store_add_cstrings(store, key_str, value_str);
GPR_ASSERT(store->num_entries == 1);
- GPR_ASSERT(gpr_slice_str_cmp(store->entries[0].key, key_str) == 0);
- GPR_ASSERT(gpr_slice_str_cmp(store->entries[0].value, value_str) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(store->entries[0].key, key_str) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(store->entries[0].value, value_str) == 0);
grpc_credentials_md_store_unref(store);
}
@@ -227,8 +227,8 @@ static void test_add_abunch_to_md_store(void) {
grpc_credentials_md_store_add_cstrings(store, key_str, value_str);
}
for (i = 0; i < num_entries; i++) {
- GPR_ASSERT(gpr_slice_str_cmp(store->entries[i].key, key_str) == 0);
- GPR_ASSERT(gpr_slice_str_cmp(store->entries[i].value, value_str) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(store->entries[i].key, key_str) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(store->entries[i].value, value_str) == 0);
}
grpc_credentials_md_store_unref(store);
}
@@ -243,9 +243,10 @@ static void test_oauth2_token_fetcher_creds_parsing_ok(void) {
GPR_ASSERT(token_lifetime.tv_sec == 3599);
GPR_ASSERT(token_lifetime.tv_nsec == 0);
GPR_ASSERT(token_md->num_entries == 1);
- GPR_ASSERT(gpr_slice_str_cmp(token_md->entries[0].key, "authorization") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(token_md->entries[0].value,
- "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_") ==
+ GPR_ASSERT(grpc_slice_str_cmp(token_md->entries[0].key, "authorization") ==
+ 0);
+ GPR_ASSERT(grpc_slice_str_cmp(token_md->entries[0].value,
+ "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_") ==
0);
grpc_credentials_md_store_unref(token_md);
grpc_http_response_destroy(&response);
@@ -333,8 +334,8 @@ static void check_metadata(expected_md *expected, grpc_credentials_md *md_elems,
for (i = 0; i < num_md; i++) {
size_t j;
for (j = 0; j < num_md; j++) {
- if (0 == gpr_slice_str_cmp(md_elems[j].key, expected[i].key)) {
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[j].value, expected[i].value) ==
+ if (0 == grpc_slice_str_cmp(md_elems[j].key, expected[i].key)) {
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[j].value, expected[i].value) ==
0);
break;
}
@@ -528,9 +529,9 @@ static void on_oauth2_creds_get_metadata_success(
GPR_ASSERT(status == GRPC_CREDENTIALS_OK);
GPR_ASSERT(error_details == NULL);
GPR_ASSERT(num_md == 1);
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[0].key, "authorization") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[0].value,
- "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_") ==
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[0].key, "authorization") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[0].value,
+ "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_") ==
0);
GPR_ASSERT(user_data != NULL);
GPR_ASSERT(strcmp((const char *)user_data, test_user_data) == 0);
@@ -781,8 +782,8 @@ static void on_jwt_creds_get_metadata_success(
GPR_ASSERT(status == GRPC_CREDENTIALS_OK);
GPR_ASSERT(error_details == NULL);
GPR_ASSERT(num_md == 1);
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[0].key, "authorization") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[0].value, expected_md_value) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[0].key, "authorization") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[0].value, expected_md_value) == 0);
GPR_ASSERT(user_data != NULL);
GPR_ASSERT(strcmp((const char *)user_data, test_user_data) == 0);
gpr_free(expected_md_value);
@@ -1057,8 +1058,8 @@ static void on_plugin_metadata_received_success(
GPR_ASSERT(md_elems != NULL);
GPR_ASSERT(num_md == GPR_ARRAY_SIZE(plugin_md));
for (i = 0; i < num_md; i++) {
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[i].key, plugin_md[i].key) == 0);
- GPR_ASSERT(gpr_slice_str_cmp(md_elems[i].value, plugin_md[i].value) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[i].key, plugin_md[i].key) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md_elems[i].value, plugin_md[i].value) == 0);
}
}
diff --git a/test/core/security/fetch_oauth2.c b/test/core/security/fetch_oauth2.c
index 292f59a7c1..e9e211206c 100644
--- a/test/core/security/fetch_oauth2.c
+++ b/test/core/security/fetch_oauth2.c
@@ -36,10 +36,10 @@
#include <grpc/grpc.h>
#include <grpc/grpc_security.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/cmdline.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/sync.h>
#include "src/core/lib/iomgr/load_file.h"
@@ -48,12 +48,12 @@
static grpc_call_credentials *create_refresh_token_creds(
const char *json_refresh_token_file_path) {
- gpr_slice refresh_token;
+ grpc_slice refresh_token;
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"load_file",
grpc_load_file(json_refresh_token_file_path, 1, &refresh_token)));
return grpc_google_refresh_token_credentials_create(
- (const char *)GPR_SLICE_START_PTR(refresh_token), NULL);
+ (const char *)GRPC_SLICE_START_PTR(refresh_token), NULL);
}
int main(int argc, char **argv) {
diff --git a/test/core/security/json_token_test.c b/test/core/security/json_token_test.c
index 405fe56c46..201655881f 100644
--- a/test/core/security/json_token_test.c
+++ b/test/core/security/json_token_test.c
@@ -37,9 +37,9 @@
#include <string.h>
#include <grpc/grpc_security.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include "src/core/lib/json/json.h"
#include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h"
@@ -223,20 +223,20 @@ static grpc_json *parse_json_part_from_jwt(const char *str, size_t len,
char *b64;
char *decoded;
grpc_json *json;
- gpr_slice slice;
+ grpc_slice slice;
b64 = gpr_malloc(len + 1);
strncpy(b64, str, len);
b64[len] = '\0';
slice = grpc_base64_decode(b64, 1);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(slice));
- decoded = gpr_malloc(GPR_SLICE_LENGTH(slice) + 1);
- strncpy(decoded, (const char *)GPR_SLICE_START_PTR(slice),
- GPR_SLICE_LENGTH(slice));
- decoded[GPR_SLICE_LENGTH(slice)] = '\0';
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(slice));
+ decoded = gpr_malloc(GRPC_SLICE_LENGTH(slice) + 1);
+ strncpy(decoded, (const char *)GRPC_SLICE_START_PTR(slice),
+ GRPC_SLICE_LENGTH(slice));
+ decoded[GRPC_SLICE_LENGTH(slice)] = '\0';
json = grpc_json_parse_string(decoded);
gpr_free(b64);
*scratchpad = decoded;
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
return json;
}
@@ -341,9 +341,9 @@ static void check_jwt_signature(const char *b64_signature, RSA *rsa_key,
EVP_MD_CTX *md_ctx = EVP_MD_CTX_create();
EVP_PKEY *key = EVP_PKEY_new();
- gpr_slice sig = grpc_base64_decode(b64_signature, 1);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(sig));
- GPR_ASSERT(GPR_SLICE_LENGTH(sig) == 128);
+ grpc_slice sig = grpc_base64_decode(b64_signature, 1);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(sig));
+ GPR_ASSERT(GRPC_SLICE_LENGTH(sig) == 128);
GPR_ASSERT(md_ctx != NULL);
GPR_ASSERT(key != NULL);
@@ -352,10 +352,10 @@ static void check_jwt_signature(const char *b64_signature, RSA *rsa_key,
GPR_ASSERT(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, key) == 1);
GPR_ASSERT(EVP_DigestVerifyUpdate(md_ctx, signed_data, signed_data_size) ==
1);
- GPR_ASSERT(EVP_DigestVerifyFinal(md_ctx, GPR_SLICE_START_PTR(sig),
- GPR_SLICE_LENGTH(sig)) == 1);
+ GPR_ASSERT(EVP_DigestVerifyFinal(md_ctx, GRPC_SLICE_START_PTR(sig),
+ GRPC_SLICE_LENGTH(sig)) == 1);
- gpr_slice_unref(sig);
+ grpc_slice_unref(sig);
if (key != NULL) EVP_PKEY_free(key);
if (md_ctx != NULL) EVP_MD_CTX_destroy(md_ctx);
}
diff --git a/test/core/security/jwt_verifier_test.c b/test/core/security/jwt_verifier_test.c
index 36b331a777..9a21814adc 100644
--- a/test/core/security/jwt_verifier_test.c
+++ b/test/core/security/jwt_verifier_test.c
@@ -37,9 +37,9 @@
#include <grpc/grpc.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/string_util.h>
#include "src/core/lib/http/httpcli.h"
@@ -166,6 +166,13 @@ static const char claims_without_time_constraint[] =
" \"jti\": \"jwtuniqueid\","
" \"foo\": \"bar\"}";
+static const char claims_with_bad_subject[] =
+ "{ \"aud\": \"https://foo.com\","
+ " \"iss\": \"evil@blah.foo.com\","
+ " \"sub\": \"juju@blah.foo.com\","
+ " \"jti\": \"jwtuniqueid\","
+ " \"foo\": \"bar\"}";
+
static const char invalid_claims[] =
"{ \"aud\": \"https://foo.com\","
" \"iss\": 46," /* Issuer cannot be a number. */
@@ -179,11 +186,43 @@ typedef struct {
const char *expected_subject;
} verifier_test_config;
+static void test_jwt_issuer_email_domain(void) {
+ const char *d = grpc_jwt_issuer_email_domain("https://foo.com");
+ GPR_ASSERT(d == NULL);
+ d = grpc_jwt_issuer_email_domain("foo.com");
+ GPR_ASSERT(d == NULL);
+ d = grpc_jwt_issuer_email_domain("");
+ GPR_ASSERT(d == NULL);
+ d = grpc_jwt_issuer_email_domain("@");
+ GPR_ASSERT(d == NULL);
+ d = grpc_jwt_issuer_email_domain("bar@foo");
+ GPR_ASSERT(strcmp(d, "foo") == 0);
+ d = grpc_jwt_issuer_email_domain("bar@foo.com");
+ GPR_ASSERT(strcmp(d, "foo.com") == 0);
+ d = grpc_jwt_issuer_email_domain("bar@blah.foo.com");
+ GPR_ASSERT(strcmp(d, "foo.com") == 0);
+ d = grpc_jwt_issuer_email_domain("bar.blah@blah.foo.com");
+ GPR_ASSERT(strcmp(d, "foo.com") == 0);
+ d = grpc_jwt_issuer_email_domain("bar.blah@baz.blah.foo.com");
+ GPR_ASSERT(strcmp(d, "foo.com") == 0);
+
+ /* This is not a very good parser but make sure we do not crash on these weird
+ inputs. */
+ d = grpc_jwt_issuer_email_domain("@foo");
+ GPR_ASSERT(strcmp(d, "foo") == 0);
+ d = grpc_jwt_issuer_email_domain("bar@.");
+ GPR_ASSERT(d != NULL);
+ d = grpc_jwt_issuer_email_domain("bar@..");
+ GPR_ASSERT(d != NULL);
+ d = grpc_jwt_issuer_email_domain("bar@...");
+ GPR_ASSERT(d != NULL);
+}
+
static void test_claims_success(void) {
grpc_jwt_claims *claims;
- gpr_slice s = gpr_slice_from_copied_string(claims_without_time_constraint);
+ grpc_slice s = grpc_slice_from_copied_string(claims_without_time_constraint);
grpc_json *json = grpc_json_parse_string_with_len(
- (char *)GPR_SLICE_START_PTR(s), GPR_SLICE_LENGTH(s));
+ (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
GPR_ASSERT(json != NULL);
claims = grpc_jwt_claims_from_json(json, s);
GPR_ASSERT(claims != NULL);
@@ -199,9 +238,9 @@ static void test_claims_success(void) {
static void test_expired_claims_failure(void) {
grpc_jwt_claims *claims;
- gpr_slice s = gpr_slice_from_copied_string(expired_claims);
+ grpc_slice s = grpc_slice_from_copied_string(expired_claims);
grpc_json *json = grpc_json_parse_string_with_len(
- (char *)GPR_SLICE_START_PTR(s), GPR_SLICE_LENGTH(s));
+ (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
gpr_timespec exp_iat = {100, 0, GPR_CLOCK_REALTIME};
gpr_timespec exp_exp = {120, 0, GPR_CLOCK_REALTIME};
gpr_timespec exp_nbf = {60, 0, GPR_CLOCK_REALTIME};
@@ -223,17 +262,17 @@ static void test_expired_claims_failure(void) {
}
static void test_invalid_claims_failure(void) {
- gpr_slice s = gpr_slice_from_copied_string(invalid_claims);
+ grpc_slice s = grpc_slice_from_copied_string(invalid_claims);
grpc_json *json = grpc_json_parse_string_with_len(
- (char *)GPR_SLICE_START_PTR(s), GPR_SLICE_LENGTH(s));
+ (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
GPR_ASSERT(grpc_jwt_claims_from_json(json, s) == NULL);
}
static void test_bad_audience_claims_failure(void) {
grpc_jwt_claims *claims;
- gpr_slice s = gpr_slice_from_copied_string(claims_without_time_constraint);
+ grpc_slice s = grpc_slice_from_copied_string(claims_without_time_constraint);
grpc_json *json = grpc_json_parse_string_with_len(
- (char *)GPR_SLICE_START_PTR(s), GPR_SLICE_LENGTH(s));
+ (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
GPR_ASSERT(json != NULL);
claims = grpc_jwt_claims_from_json(json, s);
GPR_ASSERT(claims != NULL);
@@ -242,6 +281,19 @@ static void test_bad_audience_claims_failure(void) {
grpc_jwt_claims_destroy(claims);
}
+static void test_bad_subject_claims_failure(void) {
+ grpc_jwt_claims *claims;
+ grpc_slice s = grpc_slice_from_copied_string(claims_with_bad_subject);
+ grpc_json *json = grpc_json_parse_string_with_len(
+ (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+ GPR_ASSERT(json != NULL);
+ claims = grpc_jwt_claims_from_json(json, s);
+ GPR_ASSERT(claims != NULL);
+ GPR_ASSERT(grpc_jwt_claims_check(claims, "https://foo.com") ==
+ GRPC_JWT_VERIFIER_BAD_SUBJECT);
+ grpc_jwt_claims_destroy(claims);
+}
+
static char *json_key_str(const char *last_part) {
size_t result_len = strlen(json_key_str_part1) + strlen(json_key_str_part2) +
strlen(last_part);
@@ -478,20 +530,20 @@ static void test_jwt_verifier_bad_json_key(void) {
}
static void corrupt_jwt_sig(char *jwt) {
- gpr_slice sig;
+ grpc_slice sig;
char *bad_b64_sig;
uint8_t *sig_bytes;
char *last_dot = strrchr(jwt, '.');
GPR_ASSERT(last_dot != NULL);
sig = grpc_base64_decode(last_dot + 1, 1);
- GPR_ASSERT(!GPR_SLICE_IS_EMPTY(sig));
- sig_bytes = GPR_SLICE_START_PTR(sig);
+ GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(sig));
+ sig_bytes = GRPC_SLICE_START_PTR(sig);
(*sig_bytes)++; /* Corrupt first byte. */
- bad_b64_sig =
- grpc_base64_encode(GPR_SLICE_START_PTR(sig), GPR_SLICE_LENGTH(sig), 1, 0);
+ bad_b64_sig = grpc_base64_encode(GRPC_SLICE_START_PTR(sig),
+ GRPC_SLICE_LENGTH(sig), 1, 0);
memcpy(last_dot + 1, bad_b64_sig, strlen(bad_b64_sig));
gpr_free(bad_b64_sig);
- gpr_slice_unref(sig);
+ grpc_slice_unref(sig);
}
static void on_verification_bad_signature(void *user_data,
@@ -563,10 +615,12 @@ static void test_jwt_verifier_bad_format(void) {
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
grpc_init();
+ test_jwt_issuer_email_domain();
test_claims_success();
test_expired_claims_failure();
test_invalid_claims_failure();
test_bad_audience_claims_failure();
+ test_bad_subject_claims_failure();
test_jwt_verifier_google_email_issuer_success();
test_jwt_verifier_custom_email_issuer_success();
test_jwt_verifier_url_issuer_success();
diff --git a/test/core/security/oauth2_utils.c b/test/core/security/oauth2_utils.c
index 9b97c38fcb..44a209258d 100644
--- a/test/core/security/oauth2_utils.c
+++ b/test/core/security/oauth2_utils.c
@@ -37,9 +37,9 @@
#include <grpc/grpc.h>
#include <grpc/grpc_security.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/sync.h>
#include "src/core/lib/security/credentials/credentials.h"
@@ -57,16 +57,16 @@ static void on_oauth2_response(grpc_exec_ctx *exec_ctx, void *user_data,
const char *error_details) {
oauth2_request *request = user_data;
char *token = NULL;
- gpr_slice token_slice;
+ grpc_slice token_slice;
if (status == GRPC_CREDENTIALS_ERROR) {
gpr_log(GPR_ERROR, "Fetching token failed.");
} else {
GPR_ASSERT(num_md == 1);
token_slice = md_elems[0].value;
- token = gpr_malloc(GPR_SLICE_LENGTH(token_slice) + 1);
- memcpy(token, GPR_SLICE_START_PTR(token_slice),
- GPR_SLICE_LENGTH(token_slice));
- token[GPR_SLICE_LENGTH(token_slice)] = '\0';
+ token = gpr_malloc(GRPC_SLICE_LENGTH(token_slice) + 1);
+ memcpy(token, GRPC_SLICE_START_PTR(token_slice),
+ GRPC_SLICE_LENGTH(token_slice));
+ token[GRPC_SLICE_LENGTH(token_slice)] = '\0';
}
gpr_mu_lock(request->mu);
request->is_done = 1;
diff --git a/test/core/security/print_google_default_creds_token.c b/test/core/security/print_google_default_creds_token.c
index a391c0876b..2b74690bc3 100644
--- a/test/core/security/print_google_default_creds_token.c
+++ b/test/core/security/print_google_default_creds_token.c
@@ -36,14 +36,15 @@
#include <grpc/grpc.h>
#include <grpc/grpc_security.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/cmdline.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/sync.h>
#include "src/core/lib/security/credentials/composite/composite_credentials.h"
#include "src/core/lib/security/credentials/credentials.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
typedef struct {
@@ -62,7 +63,7 @@ static void on_metadata_response(grpc_exec_ctx *exec_ctx, void *user_data,
} else {
char *token;
GPR_ASSERT(num_md == 1);
- token = gpr_dump_slice(md_elems[0].value, GPR_DUMP_ASCII);
+ token = grpc_dump_slice(md_elems[0].value, GPR_DUMP_ASCII);
printf("\nGot token: %s\n\n", token);
gpr_free(token);
}
diff --git a/test/core/security/secure_endpoint_test.c b/test/core/security/secure_endpoint_test.c
index 1d2bf73bb1..b5d95004fe 100644
--- a/test/core/security/secure_endpoint_test.c
+++ b/test/core/security/secure_endpoint_test.c
@@ -49,14 +49,17 @@ static gpr_mu *g_mu;
static grpc_pollset *g_pollset;
static grpc_endpoint_test_fixture secure_endpoint_create_fixture_tcp_socketpair(
- size_t slice_size, gpr_slice *leftover_slices, size_t leftover_nslices) {
+ size_t slice_size, grpc_slice *leftover_slices, size_t leftover_nslices) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
tsi_frame_protector *fake_read_protector = tsi_create_fake_protector(NULL);
tsi_frame_protector *fake_write_protector = tsi_create_fake_protector(NULL);
grpc_endpoint_test_fixture f;
grpc_endpoint_pair tcp;
- tcp = grpc_iomgr_create_endpoint_pair("fixture", slice_size);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("secure_endpoint_test");
+ tcp = grpc_iomgr_create_endpoint_pair("fixture", resource_quota, slice_size);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_endpoint_add_to_pollset(&exec_ctx, tcp.client, g_pollset);
grpc_endpoint_add_to_pollset(&exec_ctx, tcp.server, g_pollset);
@@ -71,11 +74,11 @@ static grpc_endpoint_test_fixture secure_endpoint_create_fixture_tcp_socketpair(
size_t buffer_size = total_buffer_size;
uint8_t *encrypted_buffer = gpr_malloc(buffer_size);
uint8_t *cur = encrypted_buffer;
- gpr_slice encrypted_leftover;
+ grpc_slice encrypted_leftover;
for (i = 0; i < leftover_nslices; i++) {
- gpr_slice plain = leftover_slices[i];
- uint8_t *message_bytes = GPR_SLICE_START_PTR(plain);
- size_t message_size = GPR_SLICE_LENGTH(plain);
+ grpc_slice plain = leftover_slices[i];
+ uint8_t *message_bytes = GRPC_SLICE_START_PTR(plain);
+ size_t message_size = GRPC_SLICE_LENGTH(plain);
while (message_size > 0) {
size_t protected_buffer_size_to_send = buffer_size;
size_t processed_message_size = message_size;
@@ -89,7 +92,7 @@ static grpc_endpoint_test_fixture secure_endpoint_create_fixture_tcp_socketpair(
GPR_ASSERT(buffer_size >= protected_buffer_size_to_send);
buffer_size -= protected_buffer_size_to_send;
}
- gpr_slice_unref(plain);
+ grpc_slice_unref(plain);
}
do {
size_t protected_buffer_size_to_send = buffer_size;
@@ -101,11 +104,11 @@ static grpc_endpoint_test_fixture secure_endpoint_create_fixture_tcp_socketpair(
GPR_ASSERT(buffer_size >= protected_buffer_size_to_send);
buffer_size -= protected_buffer_size_to_send;
} while (still_pending_size > 0);
- encrypted_leftover = gpr_slice_from_copied_buffer(
+ encrypted_leftover = grpc_slice_from_copied_buffer(
(const char *)encrypted_buffer, total_buffer_size - buffer_size);
f.client_ep = grpc_secure_endpoint_create(fake_read_protector, tcp.client,
&encrypted_leftover, 1);
- gpr_slice_unref(encrypted_leftover);
+ grpc_slice_unref(encrypted_leftover);
gpr_free(encrypted_buffer);
}
@@ -122,8 +125,8 @@ secure_endpoint_create_fixture_tcp_socketpair_noleftover(size_t slice_size) {
static grpc_endpoint_test_fixture
secure_endpoint_create_fixture_tcp_socketpair_leftover(size_t slice_size) {
- gpr_slice s =
- gpr_slice_from_copied_string("hello world 12345678900987654321");
+ grpc_slice s =
+ grpc_slice_from_copied_string("hello world 12345678900987654321");
grpc_endpoint_test_fixture f;
f = secure_endpoint_create_fixture_tcp_socketpair(slice_size, &s, 1);
@@ -146,29 +149,29 @@ static void inc_call_ctr(grpc_exec_ctx *exec_ctx, void *arg,
static void test_leftover(grpc_endpoint_test_config config, size_t slice_size) {
grpc_endpoint_test_fixture f = config.create_fixture(slice_size);
- gpr_slice_buffer incoming;
- gpr_slice s =
- gpr_slice_from_copied_string("hello world 12345678900987654321");
+ grpc_slice_buffer incoming;
+ grpc_slice s =
+ grpc_slice_from_copied_string("hello world 12345678900987654321");
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
int n = 0;
grpc_closure done_closure;
gpr_log(GPR_INFO, "Start test left over");
- gpr_slice_buffer_init(&incoming);
+ grpc_slice_buffer_init(&incoming);
grpc_closure_init(&done_closure, inc_call_ctr, &n);
grpc_endpoint_read(&exec_ctx, f.client_ep, &incoming, &done_closure);
grpc_exec_ctx_finish(&exec_ctx);
GPR_ASSERT(n == 1);
GPR_ASSERT(incoming.count == 1);
- GPR_ASSERT(0 == gpr_slice_cmp(s, incoming.slices[0]));
+ GPR_ASSERT(0 == grpc_slice_cmp(s, incoming.slices[0]));
grpc_endpoint_shutdown(&exec_ctx, f.client_ep);
grpc_endpoint_shutdown(&exec_ctx, f.server_ep);
grpc_endpoint_destroy(&exec_ctx, f.client_ep);
grpc_endpoint_destroy(&exec_ctx, f.server_ep);
grpc_exec_ctx_finish(&exec_ctx);
- gpr_slice_unref(s);
- gpr_slice_buffer_destroy(&incoming);
+ grpc_slice_unref(s);
+ grpc_slice_buffer_destroy(&incoming);
clean_up();
}
diff --git a/test/core/security/security_connector_test.c b/test/core/security/security_connector_test.c
index 6106bec9d3..8872cbe278 100644
--- a/test/core/security/security_connector_test.c
+++ b/test/core/security/security_connector_test.c
@@ -42,6 +42,7 @@
#include "src/core/lib/security/context/security_context.h"
#include "src/core/lib/security/transport/security_connector.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/env.h"
#include "src/core/lib/support/string.h"
#include "src/core/lib/support/tmpfile.h"
@@ -368,9 +369,9 @@ static void test_default_ssl_roots(void) {
value. */
gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, "");
grpc_set_ssl_roots_override_callback(override_roots_success);
- gpr_slice roots = grpc_get_default_ssl_roots_for_testing();
- char *roots_contents = gpr_dump_slice(roots, GPR_DUMP_ASCII);
- gpr_slice_unref(roots);
+ grpc_slice roots = grpc_get_default_ssl_roots_for_testing();
+ char *roots_contents = grpc_dump_slice(roots, GPR_DUMP_ASCII);
+ grpc_slice_unref(roots);
GPR_ASSERT(strcmp(roots_contents, roots_for_override_api) == 0);
gpr_free(roots_contents);
@@ -378,8 +379,8 @@ static void test_default_ssl_roots(void) {
instead. */
gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, roots_env_var_file_path);
roots = grpc_get_default_ssl_roots_for_testing();
- roots_contents = gpr_dump_slice(roots, GPR_DUMP_ASCII);
- gpr_slice_unref(roots);
+ roots_contents = grpc_dump_slice(roots, GPR_DUMP_ASCII);
+ grpc_slice_unref(roots);
GPR_ASSERT(strcmp(roots_contents, roots_for_env_var) == 0);
gpr_free(roots_contents);
@@ -387,8 +388,8 @@ static void test_default_ssl_roots(void) {
the api. */
gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, "");
roots = grpc_get_default_ssl_roots_for_testing();
- roots_contents = gpr_dump_slice(roots, GPR_DUMP_ASCII);
- gpr_slice_unref(roots);
+ roots_contents = grpc_dump_slice(roots, GPR_DUMP_ASCII);
+ grpc_slice_unref(roots);
GPR_ASSERT(strcmp(roots_contents, roots_for_override_api) == 0);
gpr_free(roots_contents);
@@ -396,7 +397,7 @@ static void test_default_ssl_roots(void) {
an empty slice. */
grpc_set_ssl_roots_override_callback(override_roots_permanent_failure);
roots = grpc_get_default_ssl_roots_for_testing();
- GPR_ASSERT(GPR_SLICE_IS_EMPTY(roots));
+ GPR_ASSERT(GRPC_SLICE_IS_EMPTY(roots));
/* Cleanup. */
remove(roots_env_var_file_path);
diff --git a/test/core/security/ssl_server_fuzzer.c b/test/core/security/ssl_server_fuzzer.c
new file mode 100644
index 0000000000..8673225fef
--- /dev/null
+++ b/test/core/security/ssl_server_fuzzer.c
@@ -0,0 +1,145 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc/grpc.h>
+#include <grpc/grpc_security.h>
+#include <grpc/support/log.h>
+
+#include "src/core/lib/iomgr/load_file.h"
+#include "src/core/lib/security/credentials/credentials.h"
+#include "src/core/lib/security/transport/security_connector.h"
+#include "test/core/util/memory_counters.h"
+#include "test/core/util/mock_endpoint.h"
+
+bool squelch = true;
+// ssl has an array of global gpr_mu's that are never released.
+// Turning this on will fail the leak check.
+bool leak_check = false;
+
+#define SSL_CERT_PATH "src/core/lib/tsi/test_creds/server1.pem"
+#define SSL_KEY_PATH "src/core/lib/tsi/test_creds/server1.key"
+#define SSL_CA_PATH "src/core/lib/tsi/test_creds/ca.pem"
+
+static void discard_write(grpc_slice slice) {}
+
+static void dont_log(gpr_log_func_args *args) {}
+
+struct handshake_state {
+ bool done_callback_called;
+};
+
+static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ grpc_handshaker_args *args = arg;
+ struct handshake_state *state = args->user_data;
+ GPR_ASSERT(state->done_callback_called == false);
+ state->done_callback_called = true;
+ // The fuzzer should not pass the handshake.
+ GPR_ASSERT(error != GRPC_ERROR_NONE);
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ struct grpc_memory_counters counters;
+ if (squelch) gpr_set_log_function(dont_log);
+ if (leak_check) grpc_memory_counters_init();
+ grpc_init();
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("ssl_server_fuzzer");
+ grpc_endpoint *mock_endpoint =
+ grpc_mock_endpoint_create(discard_write, resource_quota);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
+
+ grpc_mock_endpoint_put_read(
+ &exec_ctx, mock_endpoint,
+ grpc_slice_from_copied_buffer((const char *)data, size));
+
+ // Load key pair and establish server SSL credentials.
+ grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
+ grpc_slice ca_slice, cert_slice, key_slice;
+ GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+ grpc_load_file(SSL_CA_PATH, 1, &ca_slice)));
+ GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+ grpc_load_file(SSL_CERT_PATH, 1, &cert_slice)));
+ GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
+ grpc_load_file(SSL_KEY_PATH, 1, &key_slice)));
+ const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
+ pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
+ pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
+ grpc_server_credentials *creds = grpc_ssl_server_credentials_create(
+ ca_cert, &pem_key_cert_pair, 1, 0, NULL);
+
+ // Create security connector
+ grpc_server_security_connector *sc = NULL;
+ grpc_security_status status =
+ grpc_server_credentials_create_security_connector(creds, &sc);
+ GPR_ASSERT(status == GRPC_SECURITY_OK);
+ gpr_timespec deadline = gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
+ gpr_time_from_seconds(1, GPR_TIMESPAN));
+
+ struct handshake_state state;
+ state.done_callback_called = false;
+ grpc_handshake_manager *handshake_mgr = grpc_handshake_manager_create();
+ grpc_server_security_connector_add_handshakers(&exec_ctx, sc, handshake_mgr);
+ grpc_handshake_manager_do_handshake(
+ &exec_ctx, handshake_mgr, mock_endpoint, NULL /* channel_args */,
+ deadline, NULL /* acceptor */, on_handshake_done, &state);
+ grpc_exec_ctx_flush(&exec_ctx);
+
+ // If the given string happens to be part of the correct client hello, the
+ // server will wait for more data. Explicitly fail the server by shutting down
+ // the endpoint.
+ if (!state.done_callback_called) {
+ grpc_endpoint_shutdown(&exec_ctx, mock_endpoint);
+ grpc_exec_ctx_flush(&exec_ctx);
+ }
+
+ GPR_ASSERT(state.done_callback_called);
+
+ grpc_handshake_manager_destroy(&exec_ctx, handshake_mgr);
+ GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "test");
+ grpc_server_credentials_release(creds);
+ grpc_slice_unref(cert_slice);
+ grpc_slice_unref(key_slice);
+ grpc_slice_unref(ca_slice);
+ grpc_exec_ctx_flush(&exec_ctx);
+
+ grpc_shutdown();
+ if (leak_check) {
+ counters = grpc_memory_counters_snapshot();
+ grpc_memory_counters_destroy();
+ GPR_ASSERT(counters.total_size_relative == 0);
+ }
+ return 0;
+}
diff --git a/test/core/security/verify_jwt.c b/test/core/security/verify_jwt.c
index 728d2d637a..ccc85c9f32 100644
--- a/test/core/security/verify_jwt.c
+++ b/test/core/security/verify_jwt.c
@@ -36,10 +36,10 @@
#include <grpc/grpc.h>
#include <grpc/grpc_security.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/cmdline.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include <grpc/support/sync.h>
#include "src/core/lib/security/credentials/jwt/jwt_verifier.h"
@@ -93,6 +93,7 @@ int main(int argc, char **argv) {
char *aud = NULL;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_init();
cl = gpr_cmdline_create("JWT verifier tool");
gpr_cmdline_add_string(cl, "jwt", "JSON web token to verify", &jwt);
gpr_cmdline_add_string(cl, "aud", "Audience for the JWT", &aud);
@@ -131,5 +132,6 @@ int main(int argc, char **argv) {
grpc_jwt_verifier_destroy(verifier);
gpr_cmdline_destroy(cl);
+ grpc_shutdown();
return !sync.success;
}
diff --git a/test/core/support/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6 b/test/core/slice/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6
index a0c7605580..a0c7605580 100644
--- a/test/core/support/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6
+++ b/test/core/slice/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6
diff --git a/test/core/support/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537 b/test/core/slice/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537
index 8b36124b3f..8b36124b3f 100644
--- a/test/core/support/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537
+++ b/test/core/slice/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537
diff --git a/test/core/support/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3 b/test/core/slice/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3
index ea02afac49..ea02afac49 100644
--- a/test/core/support/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3
+++ b/test/core/slice/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3
diff --git a/test/core/support/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695 b/test/core/slice/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695
index 9e9b466b2f..9e9b466b2f 100644
--- a/test/core/support/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695
+++ b/test/core/slice/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695
diff --git a/test/core/support/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb b/test/core/slice/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb
index 88c739ecaa..88c739ecaa 100644
--- a/test/core/support/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb
+++ b/test/core/slice/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb
diff --git a/test/core/support/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9 b/test/core/slice/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9
index 5e6f546ff5..5e6f546ff5 100644
--- a/test/core/support/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9
+++ b/test/core/slice/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9
diff --git a/test/core/support/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a b/test/core/slice/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a
index 71d688b694..71d688b694 100644
--- a/test/core/support/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a
+++ b/test/core/slice/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a
diff --git a/test/core/support/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248 b/test/core/slice/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248
index 5a89a07ba7..5a89a07ba7 100644
--- a/test/core/support/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248
+++ b/test/core/slice/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248
diff --git a/test/core/support/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5 b/test/core/slice/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5
index cfa2be994f..cfa2be994f 100644
--- a/test/core/support/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5
+++ b/test/core/slice/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5
diff --git a/test/core/support/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688 b/test/core/slice/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688
index c1ddf65acd..c1ddf65acd 100644
--- a/test/core/support/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688
+++ b/test/core/slice/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688
diff --git a/test/core/support/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9 b/test/core/slice/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9
index dc427d1e12..dc427d1e12 100644
--- a/test/core/support/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9
+++ b/test/core/slice/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9
diff --git a/test/core/support/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d b/test/core/slice/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d
index 154449d0ef..154449d0ef 100644
--- a/test/core/support/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d
+++ b/test/core/slice/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d
diff --git a/test/core/support/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759 b/test/core/slice/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759
index 841ced83c3..841ced83c3 100644
--- a/test/core/support/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759
+++ b/test/core/slice/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759
diff --git a/test/core/support/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f b/test/core/slice/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f
index 6790bc2798..6790bc2798 100644
--- a/test/core/support/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f
+++ b/test/core/slice/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f
diff --git a/test/core/support/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1 b/test/core/slice/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1
index 1625d0a1ae..1625d0a1ae 100644
--- a/test/core/support/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1
+++ b/test/core/slice/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1
diff --git a/test/core/support/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4 b/test/core/slice/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4
index 125c330b3e..125c330b3e 100644
--- a/test/core/support/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4
+++ b/test/core/slice/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4
diff --git a/test/core/support/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63 b/test/core/slice/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63
index 6e6f08cb07..6e6f08cb07 100644
--- a/test/core/support/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63
+++ b/test/core/slice/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63
diff --git a/test/core/support/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223 b/test/core/slice/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223
index ab4a1c7657..ab4a1c7657 100644
--- a/test/core/support/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223
+++ b/test/core/slice/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223
diff --git a/test/core/support/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae b/test/core/slice/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae
index 4ac1945a84..4ac1945a84 100644
--- a/test/core/support/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae
+++ b/test/core/slice/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae
diff --git a/test/core/support/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681 b/test/core/slice/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681
index 5c673ae28a..5c673ae28a 100644
--- a/test/core/support/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681
+++ b/test/core/slice/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681
diff --git a/test/core/support/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b b/test/core/slice/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b
index e478275ed4..e478275ed4 100644
--- a/test/core/support/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b
+++ b/test/core/slice/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b
diff --git a/test/core/support/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758 b/test/core/slice/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758
index c73cbfe8af..c73cbfe8af 100644
--- a/test/core/support/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758
+++ b/test/core/slice/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758
diff --git a/test/core/support/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113 b/test/core/slice/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113
index f9f7246e9c..f9f7246e9c 100644
--- a/test/core/support/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113
+++ b/test/core/slice/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113
diff --git a/test/core/support/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a b/test/core/slice/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a
index 83ac46d833..83ac46d833 100644
--- a/test/core/support/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a
+++ b/test/core/slice/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a
diff --git a/test/core/support/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a b/test/core/slice/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a
index e8a0f87653..e8a0f87653 100644
--- a/test/core/support/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a
+++ b/test/core/slice/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a
diff --git a/test/core/support/percent_decode_corpus/xyz b/test/core/slice/percent_decode_corpus/xyz
index cd470e6190..cd470e6190 100644
--- a/test/core/support/percent_decode_corpus/xyz
+++ b/test/core/slice/percent_decode_corpus/xyz
diff --git a/test/core/support/percent_decode_fuzzer.c b/test/core/slice/percent_decode_fuzzer.c
index 3e02980e05..5e90446f30 100644
--- a/test/core/support/percent_decode_fuzzer.c
+++ b/test/core/slice/percent_decode_fuzzer.c
@@ -38,7 +38,7 @@
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include "src/core/lib/support/percent_encoding.h"
+#include "src/core/lib/slice/percent_encoding.h"
#include "test/core/util/memory_counters.h"
bool squelch = true;
@@ -47,18 +47,18 @@ bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
struct grpc_memory_counters counters;
grpc_memory_counters_init();
- gpr_slice input = gpr_slice_from_copied_buffer((const char *)data, size);
- gpr_slice output;
- if (gpr_strict_percent_decode_slice(
- input, gpr_url_percent_encoding_unreserved_bytes, &output)) {
- gpr_slice_unref(output);
+ grpc_slice input = grpc_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice output;
+ if (grpc_strict_percent_decode_slice(
+ input, grpc_url_percent_encoding_unreserved_bytes, &output)) {
+ grpc_slice_unref(output);
}
- if (gpr_strict_percent_decode_slice(
- input, gpr_compatible_percent_encoding_unreserved_bytes, &output)) {
- gpr_slice_unref(output);
+ if (grpc_strict_percent_decode_slice(
+ input, grpc_compatible_percent_encoding_unreserved_bytes, &output)) {
+ grpc_slice_unref(output);
}
- gpr_slice_unref(gpr_permissive_percent_decode_slice(input));
- gpr_slice_unref(input);
+ grpc_slice_unref(grpc_permissive_percent_decode_slice(input));
+ grpc_slice_unref(input);
counters = grpc_memory_counters_snapshot();
grpc_memory_counters_destroy();
GPR_ASSERT(counters.total_size_relative == 0);
diff --git a/test/core/support/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f b/test/core/slice/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f
index d09c4a039c..d09c4a039c 100644
--- a/test/core/support/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f
+++ b/test/core/slice/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f
diff --git a/test/core/support/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226 b/test/core/slice/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226
index 4d0c38d0e2..4d0c38d0e2 100644
--- a/test/core/support/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226
+++ b/test/core/slice/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226
diff --git a/test/core/support/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf b/test/core/slice/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf
index fc6e93342a..fc6e93342a 100644
--- a/test/core/support/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf
+++ b/test/core/slice/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf
diff --git a/test/core/support/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93 b/test/core/slice/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93
index 6823c73f76..6823c73f76 100644
--- a/test/core/support/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93
+++ b/test/core/slice/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93
diff --git a/test/core/support/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7 b/test/core/slice/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7
index a65cbb4d5b..a65cbb4d5b 100644
--- a/test/core/support/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7
+++ b/test/core/slice/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7
diff --git a/test/core/support/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a b/test/core/slice/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a
index 8d031d7e2d..8d031d7e2d 100644
--- a/test/core/support/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a
+++ b/test/core/slice/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a
diff --git a/test/core/support/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e b/test/core/slice/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e
index 4d82ca3953..4d82ca3953 100644
--- a/test/core/support/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e
+++ b/test/core/slice/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e
diff --git a/test/core/support/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969 b/test/core/slice/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969
index bb7f4ae07e..bb7f4ae07e 100644
--- a/test/core/support/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969
+++ b/test/core/slice/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969
diff --git a/test/core/support/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06 b/test/core/slice/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06
index 50879d0f37..50879d0f37 100644
--- a/test/core/support/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06
+++ b/test/core/slice/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06
diff --git a/test/core/support/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b b/test/core/slice/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b
index dc1ab9bfc2..dc1ab9bfc2 100644
--- a/test/core/support/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b
+++ b/test/core/slice/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b
diff --git a/test/core/support/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45 b/test/core/slice/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45
index 3476e0b70b..3476e0b70b 100644
--- a/test/core/support/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45
+++ b/test/core/slice/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45
diff --git a/test/core/support/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3 b/test/core/slice/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3
index 822d50abf8..822d50abf8 100644
--- a/test/core/support/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3
+++ b/test/core/slice/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3
diff --git a/test/core/support/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4 b/test/core/slice/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4
index 101639c93d..101639c93d 100644
--- a/test/core/support/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4
+++ b/test/core/slice/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4
diff --git a/test/core/support/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21 b/test/core/slice/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21
index 6e07ab342f..6e07ab342f 100644
--- a/test/core/support/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21
+++ b/test/core/slice/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21
diff --git a/test/core/support/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54 b/test/core/slice/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54
index 13d7fab596..13d7fab596 100644
--- a/test/core/support/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54
+++ b/test/core/slice/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54
diff --git a/test/core/support/percent_encode_corpus/xyz b/test/core/slice/percent_encode_corpus/xyz
index cd470e6190..cd470e6190 100644
--- a/test/core/support/percent_encode_corpus/xyz
+++ b/test/core/slice/percent_encode_corpus/xyz
diff --git a/test/core/support/percent_encode_fuzzer.c b/test/core/slice/percent_encode_fuzzer.c
index c9548232b5..9698e796b4 100644
--- a/test/core/support/percent_encode_fuzzer.c
+++ b/test/core/slice/percent_encode_fuzzer.c
@@ -38,7 +38,7 @@
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include "src/core/lib/support/percent_encoding.h"
+#include "src/core/lib/slice/percent_encoding.h"
#include "test/core/util/memory_counters.h"
bool squelch = true;
@@ -47,27 +47,27 @@ bool leak_check = true;
static void test(const uint8_t *data, size_t size, const uint8_t *dict) {
struct grpc_memory_counters counters;
grpc_memory_counters_init();
- gpr_slice input = gpr_slice_from_copied_buffer((const char *)data, size);
- gpr_slice output = gpr_percent_encode_slice(input, dict);
- gpr_slice decoded_output;
+ grpc_slice input = grpc_slice_from_copied_buffer((const char *)data, size);
+ grpc_slice output = grpc_percent_encode_slice(input, dict);
+ grpc_slice decoded_output;
// encoder must always produce decodable output
- GPR_ASSERT(gpr_strict_percent_decode_slice(output, dict, &decoded_output));
- gpr_slice permissive_decoded_output =
- gpr_permissive_percent_decode_slice(output);
+ GPR_ASSERT(grpc_strict_percent_decode_slice(output, dict, &decoded_output));
+ grpc_slice permissive_decoded_output =
+ grpc_permissive_percent_decode_slice(output);
// and decoded output must always match the input
- GPR_ASSERT(gpr_slice_cmp(input, decoded_output) == 0);
- GPR_ASSERT(gpr_slice_cmp(input, permissive_decoded_output) == 0);
- gpr_slice_unref(input);
- gpr_slice_unref(output);
- gpr_slice_unref(decoded_output);
- gpr_slice_unref(permissive_decoded_output);
+ GPR_ASSERT(grpc_slice_cmp(input, decoded_output) == 0);
+ GPR_ASSERT(grpc_slice_cmp(input, permissive_decoded_output) == 0);
+ grpc_slice_unref(input);
+ grpc_slice_unref(output);
+ grpc_slice_unref(decoded_output);
+ grpc_slice_unref(permissive_decoded_output);
counters = grpc_memory_counters_snapshot();
grpc_memory_counters_destroy();
GPR_ASSERT(counters.total_size_relative == 0);
}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
- test(data, size, gpr_url_percent_encoding_unreserved_bytes);
- test(data, size, gpr_compatible_percent_encoding_unreserved_bytes);
+ test(data, size, grpc_url_percent_encoding_unreserved_bytes);
+ test(data, size, grpc_compatible_percent_encoding_unreserved_bytes);
return 0;
}
diff --git a/test/core/support/percent_encoding_test.c b/test/core/slice/percent_encoding_test.c
index ab5f3f2d14..d71c99f54c 100644
--- a/test/core/support/percent_encoding_test.c
+++ b/test/core/slice/percent_encoding_test.c
@@ -31,11 +31,12 @@
*
*/
-#include "src/core/lib/support/percent_encoding.h"
+#include "src/core/lib/slice/percent_encoding.h"
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
#include "test/core/util/test_config.h"
@@ -56,21 +57,21 @@ static void test_vector(const char *raw, size_t raw_length, const char *encoded,
gpr_free(raw_msg);
gpr_free(encoded_msg);
- gpr_slice raw_slice = gpr_slice_from_copied_buffer(raw, raw_length);
- gpr_slice encoded_slice =
- gpr_slice_from_copied_buffer(encoded, encoded_length);
- gpr_slice raw2encoded_slice = gpr_percent_encode_slice(raw_slice, dict);
- gpr_slice encoded2raw_slice;
- GPR_ASSERT(
- gpr_strict_percent_decode_slice(encoded_slice, dict, &encoded2raw_slice));
- gpr_slice encoded2raw_permissive_slice =
- gpr_permissive_percent_decode_slice(encoded_slice);
+ grpc_slice raw_slice = grpc_slice_from_copied_buffer(raw, raw_length);
+ grpc_slice encoded_slice =
+ grpc_slice_from_copied_buffer(encoded, encoded_length);
+ grpc_slice raw2encoded_slice = grpc_percent_encode_slice(raw_slice, dict);
+ grpc_slice encoded2raw_slice;
+ GPR_ASSERT(grpc_strict_percent_decode_slice(encoded_slice, dict,
+ &encoded2raw_slice));
+ grpc_slice encoded2raw_permissive_slice =
+ grpc_permissive_percent_decode_slice(encoded_slice);
char *raw2encoded_msg =
- gpr_dump_slice(raw2encoded_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ grpc_dump_slice(raw2encoded_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
char *encoded2raw_msg =
- gpr_dump_slice(encoded2raw_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *encoded2raw_permissive_msg = gpr_dump_slice(
+ grpc_dump_slice(encoded2raw_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *encoded2raw_permissive_msg = grpc_dump_slice(
encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_DEBUG,
"Result:\nraw2encoded = %s\nencoded2raw = %s\nencoded2raw_permissive "
@@ -80,15 +81,15 @@ static void test_vector(const char *raw, size_t raw_length, const char *encoded,
gpr_free(encoded2raw_msg);
gpr_free(encoded2raw_permissive_msg);
- GPR_ASSERT(0 == gpr_slice_cmp(raw_slice, encoded2raw_slice));
- GPR_ASSERT(0 == gpr_slice_cmp(raw_slice, encoded2raw_permissive_slice));
- GPR_ASSERT(0 == gpr_slice_cmp(encoded_slice, raw2encoded_slice));
+ GPR_ASSERT(0 == grpc_slice_cmp(raw_slice, encoded2raw_slice));
+ GPR_ASSERT(0 == grpc_slice_cmp(raw_slice, encoded2raw_permissive_slice));
+ GPR_ASSERT(0 == grpc_slice_cmp(encoded_slice, raw2encoded_slice));
- gpr_slice_unref(encoded2raw_slice);
- gpr_slice_unref(encoded2raw_permissive_slice);
- gpr_slice_unref(raw2encoded_slice);
- gpr_slice_unref(raw_slice);
- gpr_slice_unref(encoded_slice);
+ grpc_slice_unref(encoded2raw_slice);
+ grpc_slice_unref(encoded2raw_permissive_slice);
+ grpc_slice_unref(raw2encoded_slice);
+ grpc_slice_unref(raw_slice);
+ grpc_slice_unref(encoded_slice);
}
static void test_nonconformant_vector(const char *encoded,
@@ -106,28 +107,28 @@ static void test_nonconformant_vector(const char *encoded,
gpr_free(permissive_unencoded_msg);
gpr_free(encoded_msg);
- gpr_slice permissive_unencoded_slice = gpr_slice_from_copied_buffer(
+ grpc_slice permissive_unencoded_slice = grpc_slice_from_copied_buffer(
permissive_unencoded, permissive_unencoded_length);
- gpr_slice encoded_slice =
- gpr_slice_from_copied_buffer(encoded, encoded_length);
- gpr_slice encoded2raw_slice;
- GPR_ASSERT(!gpr_strict_percent_decode_slice(encoded_slice, dict,
- &encoded2raw_slice));
- gpr_slice encoded2raw_permissive_slice =
- gpr_permissive_percent_decode_slice(encoded_slice);
-
- char *encoded2raw_permissive_msg = gpr_dump_slice(
+ grpc_slice encoded_slice =
+ grpc_slice_from_copied_buffer(encoded, encoded_length);
+ grpc_slice encoded2raw_slice;
+ GPR_ASSERT(!grpc_strict_percent_decode_slice(encoded_slice, dict,
+ &encoded2raw_slice));
+ grpc_slice encoded2raw_permissive_slice =
+ grpc_permissive_percent_decode_slice(encoded_slice);
+
+ char *encoded2raw_permissive_msg = grpc_dump_slice(
encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_DEBUG, "Result:\nencoded2raw_permissive = %s",
encoded2raw_permissive_msg);
gpr_free(encoded2raw_permissive_msg);
- GPR_ASSERT(0 == gpr_slice_cmp(permissive_unencoded_slice,
- encoded2raw_permissive_slice));
+ GPR_ASSERT(0 == grpc_slice_cmp(permissive_unencoded_slice,
+ encoded2raw_permissive_slice));
- gpr_slice_unref(permissive_unencoded_slice);
- gpr_slice_unref(encoded2raw_permissive_slice);
- gpr_slice_unref(encoded_slice);
+ grpc_slice_unref(permissive_unencoded_slice);
+ grpc_slice_unref(encoded2raw_permissive_slice);
+ grpc_slice_unref(encoded_slice);
}
int main(int argc, char **argv) {
@@ -135,23 +136,23 @@ int main(int argc, char **argv) {
TEST_VECTOR(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~",
- gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("\x00", "%00", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("\x01", "%01", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("a b", "a%20b", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR(" b", "%20b", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("a b", "a b", gpr_compatible_percent_encoding_unreserved_bytes);
- TEST_VECTOR(" b", " b", gpr_compatible_percent_encoding_unreserved_bytes);
- TEST_VECTOR("\x0f", "%0F", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("\xff", "%FF", gpr_url_percent_encoding_unreserved_bytes);
- TEST_VECTOR("\xee", "%EE", gpr_url_percent_encoding_unreserved_bytes);
+ grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("\x00", "%00", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("\x01", "%01", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("a b", "a%20b", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR(" b", "%20b", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("a b", "a b", grpc_compatible_percent_encoding_unreserved_bytes);
+ TEST_VECTOR(" b", " b", grpc_compatible_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("\x0f", "%0F", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("\xff", "%FF", grpc_url_percent_encoding_unreserved_bytes);
+ TEST_VECTOR("\xee", "%EE", grpc_url_percent_encoding_unreserved_bytes);
TEST_NONCONFORMANT_VECTOR("%", "%",
- gpr_url_percent_encoding_unreserved_bytes);
+ grpc_url_percent_encoding_unreserved_bytes);
TEST_NONCONFORMANT_VECTOR("%A", "%A",
- gpr_url_percent_encoding_unreserved_bytes);
+ grpc_url_percent_encoding_unreserved_bytes);
TEST_NONCONFORMANT_VECTOR("%AG", "%AG",
- gpr_url_percent_encoding_unreserved_bytes);
+ grpc_url_percent_encoding_unreserved_bytes);
TEST_NONCONFORMANT_VECTOR("\0", "\0",
- gpr_url_percent_encoding_unreserved_bytes);
+ grpc_url_percent_encoding_unreserved_bytes);
return 0;
}
diff --git a/test/core/support/slice_buffer_test.c b/test/core/slice/slice_buffer_test.c
index cf2da84c2b..bf9ae197d2 100644
--- a/test/core/support/slice_buffer_test.c
+++ b/test/core/slice/slice_buffer_test.c
@@ -31,72 +31,72 @@
*
*/
+#include <grpc/slice_buffer.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice_buffer.h>
#include "test/core/util/test_config.h"
void test_slice_buffer_add() {
- gpr_slice_buffer buf;
- gpr_slice aaa = gpr_slice_from_copied_string("aaa");
- gpr_slice bb = gpr_slice_from_copied_string("bb");
+ grpc_slice_buffer buf;
+ grpc_slice aaa = grpc_slice_from_copied_string("aaa");
+ grpc_slice bb = grpc_slice_from_copied_string("bb");
size_t i;
- gpr_slice_buffer_init(&buf);
+ grpc_slice_buffer_init(&buf);
for (i = 0; i < 10; i++) {
- gpr_slice_ref(aaa);
- gpr_slice_ref(bb);
- gpr_slice_buffer_add(&buf, aaa);
- gpr_slice_buffer_add(&buf, bb);
+ grpc_slice_ref(aaa);
+ grpc_slice_ref(bb);
+ grpc_slice_buffer_add(&buf, aaa);
+ grpc_slice_buffer_add(&buf, bb);
}
GPR_ASSERT(buf.count > 0);
GPR_ASSERT(buf.length == 50);
- gpr_slice_buffer_reset_and_unref(&buf);
+ grpc_slice_buffer_reset_and_unref(&buf);
GPR_ASSERT(buf.count == 0);
GPR_ASSERT(buf.length == 0);
for (i = 0; i < 10; i++) {
- gpr_slice_ref(aaa);
- gpr_slice_ref(bb);
- gpr_slice_buffer_add(&buf, aaa);
- gpr_slice_buffer_add(&buf, bb);
+ grpc_slice_ref(aaa);
+ grpc_slice_ref(bb);
+ grpc_slice_buffer_add(&buf, aaa);
+ grpc_slice_buffer_add(&buf, bb);
}
GPR_ASSERT(buf.count > 0);
GPR_ASSERT(buf.length == 50);
for (i = 0; i < 10; i++) {
- gpr_slice_buffer_pop(&buf);
- gpr_slice_unref(aaa);
- gpr_slice_unref(bb);
+ grpc_slice_buffer_pop(&buf);
+ grpc_slice_unref(aaa);
+ grpc_slice_unref(bb);
}
GPR_ASSERT(buf.count == 0);
GPR_ASSERT(buf.length == 0);
- gpr_slice_buffer_destroy(&buf);
+ grpc_slice_buffer_destroy(&buf);
}
void test_slice_buffer_move_first() {
- gpr_slice slices[3];
- gpr_slice_buffer src;
- gpr_slice_buffer dst;
+ grpc_slice slices[3];
+ grpc_slice_buffer src;
+ grpc_slice_buffer dst;
int idx = 0;
size_t src_len = 0;
size_t dst_len = 0;
- slices[0] = gpr_slice_from_copied_string("aaa");
- slices[1] = gpr_slice_from_copied_string("bbbb");
- slices[2] = gpr_slice_from_copied_string("ccc");
+ slices[0] = grpc_slice_from_copied_string("aaa");
+ slices[1] = grpc_slice_from_copied_string("bbbb");
+ slices[2] = grpc_slice_from_copied_string("ccc");
- gpr_slice_buffer_init(&src);
- gpr_slice_buffer_init(&dst);
+ grpc_slice_buffer_init(&src);
+ grpc_slice_buffer_init(&dst);
for (idx = 0; idx < 3; idx++) {
- gpr_slice_ref(slices[idx]);
+ grpc_slice_ref(slices[idx]);
/* For this test, it is important that we add each slice at a new
slice index */
- gpr_slice_buffer_add_indexed(&src, slices[idx]);
- gpr_slice_buffer_add_indexed(&dst, slices[idx]);
+ grpc_slice_buffer_add_indexed(&src, slices[idx]);
+ grpc_slice_buffer_add_indexed(&dst, slices[idx]);
}
/* Case 1: Move more than the first slice's length from src to dst */
src_len = src.length;
dst_len = dst.length;
- gpr_slice_buffer_move_first(&src, 4, &dst);
+ grpc_slice_buffer_move_first(&src, 4, &dst);
src_len -= 4;
dst_len += 4;
GPR_ASSERT(src.length == src_len);
@@ -104,7 +104,7 @@ void test_slice_buffer_move_first() {
/* src now has two slices ["bbb"] and ["ccc"] */
/* Case 2: Move the first slice from src to dst */
- gpr_slice_buffer_move_first(&src, 3, &dst);
+ grpc_slice_buffer_move_first(&src, 3, &dst);
src_len -= 3;
dst_len += 3;
GPR_ASSERT(src.length == src_len);
@@ -112,7 +112,7 @@ void test_slice_buffer_move_first() {
/* src now has one slice ["ccc"] */
/* Case 3: Move less than the first slice's length from src to dst*/
- gpr_slice_buffer_move_first(&src, 2, &dst);
+ grpc_slice_buffer_move_first(&src, 2, &dst);
src_len -= 2;
dst_len += 2;
GPR_ASSERT(src.length == src.length);
diff --git a/test/core/slice/slice_string_helpers_test.c b/test/core/slice/slice_string_helpers_test.c
new file mode 100644
index 0000000000..6d6b55ab45
--- /dev/null
+++ b/test/core/slice/slice_string_helpers_test.c
@@ -0,0 +1,150 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/lib/slice/slice_string_helpers.h"
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/useful.h>
+
+#include "src/core/lib/support/string.h"
+#include "test/core/util/test_config.h"
+
+#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x)
+
+static void expect_slice_dump(grpc_slice slice, uint32_t flags,
+ const char *result) {
+ char *got = grpc_dump_slice(slice, flags);
+ GPR_ASSERT(0 == strcmp(got, result));
+ gpr_free(got);
+ grpc_slice_unref(slice);
+}
+
+static void test_dump_slice(void) {
+ static const char *text = "HELLO WORLD!";
+ static const char *long_text =
+ "It was a bright cold day in April, and the clocks were striking "
+ "thirteen. Winston Smith, his chin nuzzled into his breast in an effort "
+ "to escape the vile wind, slipped quickly through the glass doors of "
+ "Victory Mansions, though not quickly enough to prevent a swirl of "
+ "gritty dust from entering along with him.";
+
+ LOG_TEST_NAME("test_dump_slice");
+
+ expect_slice_dump(grpc_slice_from_copied_string(text), GPR_DUMP_ASCII, text);
+ expect_slice_dump(grpc_slice_from_copied_string(long_text), GPR_DUMP_ASCII,
+ long_text);
+ expect_slice_dump(grpc_slice_from_copied_buffer("\x01", 1), GPR_DUMP_HEX,
+ "01");
+ expect_slice_dump(grpc_slice_from_copied_buffer("\x01", 1),
+ GPR_DUMP_HEX | GPR_DUMP_ASCII, "01 '.'");
+}
+
+static void test_strsplit(void) {
+ grpc_slice_buffer *parts;
+ grpc_slice str;
+
+ LOG_TEST_NAME("test_strsplit");
+
+ parts = gpr_malloc(sizeof(grpc_slice_buffer));
+ grpc_slice_buffer_init(parts);
+
+ str = grpc_slice_from_copied_string("one, two, three, four");
+ grpc_slice_split(str, ", ", parts);
+ GPR_ASSERT(4 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], "one"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[1], "two"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[2], "three"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[3], "four"));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ /* separator not present in string */
+ str = grpc_slice_from_copied_string("one two three four");
+ grpc_slice_split(str, ", ", parts);
+ GPR_ASSERT(1 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], "one two three four"));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ /* separator at the end */
+ str = grpc_slice_from_copied_string("foo,");
+ grpc_slice_split(str, ",", parts);
+ GPR_ASSERT(2 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], "foo"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[1], ""));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ /* separator at the beginning */
+ str = grpc_slice_from_copied_string(",foo");
+ grpc_slice_split(str, ",", parts);
+ GPR_ASSERT(2 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], ""));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[1], "foo"));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ /* standalone separator */
+ str = grpc_slice_from_copied_string(",");
+ grpc_slice_split(str, ",", parts);
+ GPR_ASSERT(2 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], ""));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[1], ""));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ /* empty input */
+ str = grpc_slice_from_copied_string("");
+ grpc_slice_split(str, ", ", parts);
+ GPR_ASSERT(1 == parts->count);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(parts->slices[0], ""));
+ grpc_slice_buffer_reset_and_unref(parts);
+ grpc_slice_unref(str);
+
+ grpc_slice_buffer_destroy(parts);
+ gpr_free(parts);
+}
+
+int main(int argc, char **argv) {
+ grpc_test_init(argc, argv);
+ test_dump_slice();
+ test_strsplit();
+ return 0;
+}
diff --git a/test/core/support/slice_test.c b/test/core/slice/slice_test.c
index 06c364b368..ca44becfd0 100644
--- a/test/core/support/slice_test.c
+++ b/test/core/slice/slice_test.c
@@ -31,7 +31,7 @@
*
*/
-#include <grpc/support/slice.h>
+#include <grpc/slice.h>
#include <string.h>
@@ -42,23 +42,23 @@
#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x);
static void test_slice_malloc_returns_something_sensible(void) {
- /* Calls gpr_slice_create for various lengths and verifies the internals for
+ /* Calls grpc_slice_create for various lengths and verifies the internals for
consistency. */
size_t length;
size_t i;
- gpr_slice slice;
+ grpc_slice slice;
LOG_TEST_NAME("test_slice_malloc_returns_something_sensible");
for (length = 0; length <= 1024; length++) {
- slice = gpr_slice_malloc(length);
+ slice = grpc_slice_malloc(length);
/* If there is a length, slice.data must be non-NULL. If length is zero
we don't care. */
if (length) {
- GPR_ASSERT(GPR_SLICE_START_PTR(slice));
+ GPR_ASSERT(GRPC_SLICE_START_PTR(slice));
}
/* Returned slice length must be what was requested. */
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == length);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == length);
/* If the slice has a refcount, it must be destroyable. */
if (slice.refcount) {
GPR_ASSERT(slice.refcount->ref != NULL);
@@ -66,10 +66,10 @@ static void test_slice_malloc_returns_something_sensible(void) {
}
/* We must be able to write to every byte of the data */
for (i = 0; i < length; i++) {
- GPR_SLICE_START_PTR(slice)[i] = (uint8_t)i;
+ GRPC_SLICE_START_PTR(slice)[i] = (uint8_t)i;
}
/* And finally we must succeed in destroying the slice */
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
}
@@ -78,11 +78,11 @@ static void do_nothing(void *ignored) {}
static void test_slice_new_returns_something_sensible(void) {
uint8_t x;
- gpr_slice slice = gpr_slice_new(&x, 1, do_nothing);
+ grpc_slice slice = grpc_slice_new(&x, 1, do_nothing);
GPR_ASSERT(slice.refcount);
GPR_ASSERT(slice.data.refcounted.bytes == &x);
GPR_ASSERT(slice.data.refcounted.length == 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
/* destroy function that sets a mark to indicate it was called. */
@@ -91,18 +91,18 @@ static void set_mark(void *p) { *((int *)p) = 1; }
static void test_slice_new_with_user_data(void) {
int marker = 0;
uint8_t buf[2];
- gpr_slice slice;
+ grpc_slice slice;
buf[0] = 0;
buf[1] = 1;
- slice = gpr_slice_new_with_user_data(buf, 2, set_mark, &marker);
+ slice = grpc_slice_new_with_user_data(buf, 2, set_mark, &marker);
GPR_ASSERT(marker == 0);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) == 2);
- GPR_ASSERT(GPR_SLICE_START_PTR(slice)[0] == 0);
- GPR_ASSERT(GPR_SLICE_START_PTR(slice)[1] == 1);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == 2);
+ GPR_ASSERT(GRPC_SLICE_START_PTR(slice)[0] == 0);
+ GPR_ASSERT(GRPC_SLICE_START_PTR(slice)[1] == 1);
/* unref should cause destroy function to run. */
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(marker == 1);
}
@@ -118,7 +118,7 @@ static void test_slice_new_with_len_returns_something_sensible(void) {
int num_refs = 5; /* To test adding/removing an arbitrary number of refs */
int i;
- gpr_slice slice = gpr_slice_new_with_len(&x, 1, do_nothing_with_len_1);
+ grpc_slice slice = grpc_slice_new_with_len(&x, 1, do_nothing_with_len_1);
GPR_ASSERT(slice.refcount); /* ref count is initialized to 1 at this point */
GPR_ASSERT(slice.data.refcounted.bytes == &x);
GPR_ASSERT(slice.data.refcounted.length == 1);
@@ -128,21 +128,21 @@ static void test_slice_new_with_len_returns_something_sensible(void) {
make sure that that the destroy callback (i.e do_nothing_with_len_1()) is
not called until the last unref operation */
for (i = 0; i < num_refs; i++) {
- gpr_slice_ref(slice);
+ grpc_slice_ref(slice);
}
for (i = 0; i < num_refs; i++) {
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
GPR_ASSERT(do_nothing_with_len_1_calls == 0); /* Shouldn't be called yet */
/* last unref */
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(do_nothing_with_len_1_calls == 1);
}
static void test_slice_sub_works(unsigned length) {
- gpr_slice slice;
- gpr_slice sub;
+ grpc_slice slice;
+ grpc_slice sub;
unsigned i, j, k;
LOG_TEST_NAME("test_slice_sub_works");
@@ -150,38 +150,39 @@ static void test_slice_sub_works(unsigned length) {
/* Create a slice in which each byte is equal to the distance from it to the
beginning of the slice. */
- slice = gpr_slice_malloc(length);
+ slice = grpc_slice_malloc(length);
for (i = 0; i < length; i++) {
- GPR_SLICE_START_PTR(slice)[i] = (uint8_t)i;
+ GRPC_SLICE_START_PTR(slice)[i] = (uint8_t)i;
}
/* Ensure that for all subsets length is correct and that we start on the
correct byte. Additionally check that no copies were made. */
for (i = 0; i < length; i++) {
for (j = i; j < length; j++) {
- sub = gpr_slice_sub(slice, i, j);
- GPR_ASSERT(GPR_SLICE_LENGTH(sub) == j - i);
+ sub = grpc_slice_sub(slice, i, j);
+ GPR_ASSERT(GRPC_SLICE_LENGTH(sub) == j - i);
for (k = 0; k < j - i; k++) {
- GPR_ASSERT(GPR_SLICE_START_PTR(sub)[k] == (uint8_t)(i + k));
+ GPR_ASSERT(GRPC_SLICE_START_PTR(sub)[k] == (uint8_t)(i + k));
}
- gpr_slice_unref(sub);
+ grpc_slice_unref(sub);
}
}
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
-static void check_head_tail(gpr_slice slice, gpr_slice head, gpr_slice tail) {
- GPR_ASSERT(GPR_SLICE_LENGTH(slice) ==
- GPR_SLICE_LENGTH(head) + GPR_SLICE_LENGTH(tail));
- GPR_ASSERT(0 == memcmp(GPR_SLICE_START_PTR(slice), GPR_SLICE_START_PTR(head),
- GPR_SLICE_LENGTH(head)));
- GPR_ASSERT(0 == memcmp(GPR_SLICE_START_PTR(slice) + GPR_SLICE_LENGTH(head),
- GPR_SLICE_START_PTR(tail), GPR_SLICE_LENGTH(tail)));
+static void check_head_tail(grpc_slice slice, grpc_slice head,
+ grpc_slice tail) {
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice) ==
+ GRPC_SLICE_LENGTH(head) + GRPC_SLICE_LENGTH(tail));
+ GPR_ASSERT(0 == memcmp(GRPC_SLICE_START_PTR(slice),
+ GRPC_SLICE_START_PTR(head), GRPC_SLICE_LENGTH(head)));
+ GPR_ASSERT(0 == memcmp(GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(head),
+ GRPC_SLICE_START_PTR(tail), GRPC_SLICE_LENGTH(tail)));
}
static void test_slice_split_head_works(size_t length) {
- gpr_slice slice;
- gpr_slice head, tail;
+ grpc_slice slice;
+ grpc_slice head, tail;
size_t i;
LOG_TEST_NAME("test_slice_split_head_works");
@@ -189,27 +190,27 @@ static void test_slice_split_head_works(size_t length) {
/* Create a slice in which each byte is equal to the distance from it to the
beginning of the slice. */
- slice = gpr_slice_malloc(length);
+ slice = grpc_slice_malloc(length);
for (i = 0; i < length; i++) {
- GPR_SLICE_START_PTR(slice)[i] = (uint8_t)i;
+ GRPC_SLICE_START_PTR(slice)[i] = (uint8_t)i;
}
/* Ensure that for all subsets length is correct and that we start on the
correct byte. Additionally check that no copies were made. */
for (i = 0; i < length; i++) {
- tail = gpr_slice_ref(slice);
- head = gpr_slice_split_head(&tail, i);
+ tail = grpc_slice_ref(slice);
+ head = grpc_slice_split_head(&tail, i);
check_head_tail(slice, head, tail);
- gpr_slice_unref(tail);
- gpr_slice_unref(head);
+ grpc_slice_unref(tail);
+ grpc_slice_unref(head);
}
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
static void test_slice_split_tail_works(size_t length) {
- gpr_slice slice;
- gpr_slice head, tail;
+ grpc_slice slice;
+ grpc_slice head, tail;
size_t i;
LOG_TEST_NAME("test_slice_split_tail_works");
@@ -217,35 +218,35 @@ static void test_slice_split_tail_works(size_t length) {
/* Create a slice in which each byte is equal to the distance from it to the
beginning of the slice. */
- slice = gpr_slice_malloc(length);
+ slice = grpc_slice_malloc(length);
for (i = 0; i < length; i++) {
- GPR_SLICE_START_PTR(slice)[i] = (uint8_t)i;
+ GRPC_SLICE_START_PTR(slice)[i] = (uint8_t)i;
}
/* Ensure that for all subsets length is correct and that we start on the
correct byte. Additionally check that no copies were made. */
for (i = 0; i < length; i++) {
- head = gpr_slice_ref(slice);
- tail = gpr_slice_split_tail(&head, i);
+ head = grpc_slice_ref(slice);
+ tail = grpc_slice_split_tail(&head, i);
check_head_tail(slice, head, tail);
- gpr_slice_unref(tail);
- gpr_slice_unref(head);
+ grpc_slice_unref(tail);
+ grpc_slice_unref(head);
}
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
}
static void test_slice_from_copied_string_works(void) {
static const char *text = "HELLO WORLD!";
- gpr_slice slice;
+ grpc_slice slice;
LOG_TEST_NAME("test_slice_from_copied_string_works");
- slice = gpr_slice_from_copied_string(text);
- GPR_ASSERT(strlen(text) == GPR_SLICE_LENGTH(slice));
- GPR_ASSERT(0 ==
- memcmp(text, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice)));
- gpr_slice_unref(slice);
+ slice = grpc_slice_from_copied_string(text);
+ GPR_ASSERT(strlen(text) == GRPC_SLICE_LENGTH(slice));
+ GPR_ASSERT(
+ 0 == memcmp(text, GRPC_SLICE_START_PTR(slice), GRPC_SLICE_LENGTH(slice)));
+ grpc_slice_unref(slice);
}
int main(int argc, char **argv) {
diff --git a/test/core/support/BUILD b/test/core/support/BUILD
index ac33176f00..77f0a9a048 100644
--- a/test/core/support/BUILD
+++ b/test/core/support/BUILD
@@ -107,27 +107,6 @@ cc_test(
)
cc_test(
- name = "percent_encoding_test",
- srcs = ["percent_encoding_test.c"],
- deps = ["//:gpr", "//test/core/util:gpr_test_util"],
- copts = ['-std=c99']
-)
-
-cc_test(
- name = "slice_buffer_test",
- srcs = ["slice_buffer_test.c"],
- deps = ["//:gpr", "//test/core/util:gpr_test_util"],
- copts = ['-std=c99']
-)
-
-cc_test(
- name = "slice_test",
- srcs = ["slice_test.c"],
- deps = ["//:gpr", "//test/core/util:gpr_test_util"],
- copts = ['-std=c99']
-)
-
-cc_test(
name = "stack_lockfree_test",
srcs = ["stack_lockfree_test.c"],
deps = ["//:gpr", "//test/core/util:gpr_test_util"],
@@ -175,19 +154,3 @@ cc_test(
deps = ["//:gpr", "//test/core/util:gpr_test_util"],
copts = ['-std=c99']
)
-
-grpc_fuzzer(
- name = "percent_encode_fuzzer",
- srcs = ["percent_encode_fuzzer.c"],
- deps = ["//:gpr"],
- corpus = "percent_encode_corpus"
-)
-
-
-grpc_fuzzer(
- name = "percent_decode_fuzzer",
- srcs = ["percent_decode_fuzzer.c"],
- deps = ["//:gpr"],
- corpus = "percent_decode_corpus"
-)
-
diff --git a/test/core/support/backoff_test.c b/test/core/support/backoff_test.c
index 13cba7d750..ad6e5a98f2 100644
--- a/test/core/support/backoff_test.c
+++ b/test/core/support/backoff_test.c
@@ -39,61 +39,110 @@
static void test_constant_backoff(void) {
gpr_backoff backoff;
- gpr_backoff_init(&backoff, 1.0, 0.0, 1000, 1000);
+ gpr_backoff_init(&backoff, 200 /* initial timeout */, 1.0 /* multiplier */,
+ 0.0 /* jitter */, 100 /* min timeout */,
+ 1000 /* max timeout */);
gpr_timespec now = gpr_time_0(GPR_TIMESPAN);
gpr_timespec next = gpr_backoff_begin(&backoff, now);
- GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 1000);
+ GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 200);
for (int i = 0; i < 10000; i++) {
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 1000);
+ GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 200);
now = next;
}
}
-static void test_no_jitter_backoff(void) {
+static void test_min_connect(void) {
gpr_backoff backoff;
- gpr_backoff_init(&backoff, 2.0, 0.0, 1, 513);
+ gpr_backoff_init(&backoff, 100 /* initial timeout */, 1.0 /* multiplier */,
+ 0.0 /* jitter */, 200 /* min timeout */,
+ 1000 /* max timeout */);
gpr_timespec now = gpr_time_0(GPR_TIMESPAN);
gpr_timespec next = gpr_backoff_begin(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(1, GPR_TIMESPAN), next) == 0);
- now = next;
- next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(3, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 200);
+}
+
+static void test_no_jitter_backoff(void) {
+ gpr_backoff backoff;
+ gpr_backoff_init(&backoff, 2 /* initial timeout */, 2.0 /* multiplier */,
+ 0.0 /* jitter */, 1 /* min timeout */,
+ 513 /* max timeout */);
+ // x_1 = 2
+ // x_n = 2**i + x_{i-1} ( = 2**(n+1) - 2 )
+ gpr_timespec now = gpr_time_0(GPR_TIMESPAN);
+ gpr_timespec next = gpr_backoff_begin(&backoff, now);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(2, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(7, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(6, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(15, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(14, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(31, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(30, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(63, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(62, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(127, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(126, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(255, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(254, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(511, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(510, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(1023, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(1022, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(1536, GPR_TIMESPAN), next) == 0);
+ // Hit the maximum timeout. From this point onwards, retries will increase
+ // only by max timeout.
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(1535, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(2049, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(2048, GPR_TIMESPAN), next) == 0);
now = next;
next = gpr_backoff_step(&backoff, now);
- GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(2562, GPR_TIMESPAN), next) == 0);
+ GPR_ASSERT(gpr_time_cmp(gpr_time_from_millis(2561, GPR_TIMESPAN), next) == 0);
+}
+
+static void test_jitter_backoff(void) {
+ const int64_t initial_timeout = 500;
+ const double jitter = 0.1;
+ gpr_backoff backoff;
+ gpr_backoff_init(&backoff, initial_timeout, 1.0 /* multiplier */, jitter,
+ 100 /* min timeout */, 1000 /* max timeout */);
+
+ backoff.rng_state = 0; // force consistent PRNG
+
+ gpr_timespec now = gpr_time_0(GPR_TIMESPAN);
+ gpr_timespec next = gpr_backoff_begin(&backoff, now);
+ GPR_ASSERT(gpr_time_to_millis(gpr_time_sub(next, now)) == 500);
+
+ int64_t expected_next_lower_bound =
+ (int64_t)((double)initial_timeout * (1 - jitter));
+ int64_t expected_next_upper_bound =
+ (int64_t)((double)initial_timeout * (1 + jitter));
+
+ for (int i = 0; i < 10000; i++) {
+ next = gpr_backoff_step(&backoff, now);
+
+ // next-now must be within (jitter*100)% of the previous timeout.
+ const int64_t timeout_millis = gpr_time_to_millis(gpr_time_sub(next, now));
+ GPR_ASSERT(timeout_millis >= expected_next_lower_bound);
+ GPR_ASSERT(timeout_millis <= expected_next_upper_bound);
+
+ expected_next_lower_bound =
+ (int64_t)((double)timeout_millis * (1 - jitter));
+ expected_next_upper_bound =
+ (int64_t)((double)timeout_millis * (1 + jitter));
+ now = next;
+ }
}
int main(int argc, char **argv) {
@@ -101,7 +150,9 @@ int main(int argc, char **argv) {
gpr_time_init();
test_constant_backoff();
+ test_min_connect();
test_no_jitter_backoff();
+ test_jitter_backoff();
return 0;
}
diff --git a/test/core/support/string_test.c b/test/core/support/string_test.c
index 378e45a942..af232db350 100644
--- a/test/core/support/string_test.c
+++ b/test/core/support/string_test.c
@@ -76,34 +76,6 @@ static void test_dump(void) {
expect_dump("ab", 2, GPR_DUMP_HEX | GPR_DUMP_ASCII, "61 62 'ab'");
}
-static void expect_slice_dump(gpr_slice slice, uint32_t flags,
- const char *result) {
- char *got = gpr_dump_slice(slice, flags);
- GPR_ASSERT(0 == strcmp(got, result));
- gpr_free(got);
- gpr_slice_unref(slice);
-}
-
-static void test_dump_slice(void) {
- static const char *text = "HELLO WORLD!";
- static const char *long_text =
- "It was a bright cold day in April, and the clocks were striking "
- "thirteen. Winston Smith, his chin nuzzled into his breast in an effort "
- "to escape the vile wind, slipped quickly through the glass doors of "
- "Victory Mansions, though not quickly enough to prevent a swirl of "
- "gritty dust from entering along with him.";
-
- LOG_TEST_NAME("test_dump_slice");
-
- expect_slice_dump(gpr_slice_from_copied_string(text), GPR_DUMP_ASCII, text);
- expect_slice_dump(gpr_slice_from_copied_string(long_text), GPR_DUMP_ASCII,
- long_text);
- expect_slice_dump(gpr_slice_from_copied_buffer("\x01", 1), GPR_DUMP_HEX,
- "01");
- expect_slice_dump(gpr_slice_from_copied_buffer("\x01", 1),
- GPR_DUMP_HEX | GPR_DUMP_ASCII, "01 '.'");
-}
-
static void test_pu32_fail(const char *s) {
uint32_t out;
GPR_ASSERT(!gpr_parse_bytes_to_uint32(s, strlen(s), &out));
@@ -221,72 +193,6 @@ static void test_strjoin_sep(void) {
gpr_free(joined);
}
-static void test_strsplit(void) {
- gpr_slice_buffer *parts;
- gpr_slice str;
-
- LOG_TEST_NAME("test_strsplit");
-
- parts = gpr_malloc(sizeof(gpr_slice_buffer));
- gpr_slice_buffer_init(parts);
-
- str = gpr_slice_from_copied_string("one, two, three, four");
- gpr_slice_split(str, ", ", parts);
- GPR_ASSERT(4 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], "one"));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[1], "two"));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[2], "three"));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[3], "four"));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- /* separator not present in string */
- str = gpr_slice_from_copied_string("one two three four");
- gpr_slice_split(str, ", ", parts);
- GPR_ASSERT(1 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], "one two three four"));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- /* separator at the end */
- str = gpr_slice_from_copied_string("foo,");
- gpr_slice_split(str, ",", parts);
- GPR_ASSERT(2 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], "foo"));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[1], ""));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- /* separator at the beginning */
- str = gpr_slice_from_copied_string(",foo");
- gpr_slice_split(str, ",", parts);
- GPR_ASSERT(2 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], ""));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[1], "foo"));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- /* standalone separator */
- str = gpr_slice_from_copied_string(",");
- gpr_slice_split(str, ",", parts);
- GPR_ASSERT(2 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], ""));
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[1], ""));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- /* empty input */
- str = gpr_slice_from_copied_string("");
- gpr_slice_split(str, ", ", parts);
- GPR_ASSERT(1 == parts->count);
- GPR_ASSERT(0 == gpr_slice_str_cmp(parts->slices[0], ""));
- gpr_slice_buffer_reset_and_unref(parts);
- gpr_slice_unref(str);
-
- gpr_slice_buffer_destroy(parts);
- gpr_free(parts);
-}
-
static void test_ltoa() {
char *str;
char buf[GPR_LTOA_MIN_BUFSIZE];
@@ -337,6 +243,8 @@ static void test_int64toa() {
static void test_leftpad() {
char *padded;
+ LOG_TEST_NAME("test_leftpad");
+
padded = gpr_leftpad("foo", ' ', 5);
GPR_ASSERT(0 == strcmp(" foo", padded));
gpr_free(padded);
@@ -367,25 +275,37 @@ static void test_leftpad() {
}
static void test_stricmp(void) {
+ LOG_TEST_NAME("test_stricmp");
+
GPR_ASSERT(0 == gpr_stricmp("hello", "hello"));
GPR_ASSERT(0 == gpr_stricmp("HELLO", "hello"));
GPR_ASSERT(gpr_stricmp("a", "b") < 0);
GPR_ASSERT(gpr_stricmp("b", "a") > 0);
}
+static void test_memrchr(void) {
+ LOG_TEST_NAME("test_memrchr");
+
+ GPR_ASSERT(NULL == gpr_memrchr(NULL, 'a', 0));
+ GPR_ASSERT(NULL == gpr_memrchr("", 'a', 0));
+ GPR_ASSERT(NULL == gpr_memrchr("hello", 'b', 5));
+ GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'h', 5), "hello"));
+ GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'o', 5), "o"));
+ GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'l', 5), "lo"));
+}
+
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
test_strdup();
test_dump();
- test_dump_slice();
test_parse_uint32();
test_asprintf();
test_strjoin();
test_strjoin_sep();
- test_strsplit();
test_ltoa();
test_int64toa();
test_leftpad();
test_stricmp();
+ test_memrchr();
return 0;
}
diff --git a/test/core/surface/byte_buffer_reader_test.c b/test/core/surface/byte_buffer_reader_test.c
index 1ab1a06211..d8d7a52d15 100644
--- a/test/core/surface/byte_buffer_reader_test.c
+++ b/test/core/surface/byte_buffer_reader_test.c
@@ -34,7 +34,7 @@
#include <grpc/byte_buffer.h>
#include <grpc/byte_buffer_reader.h>
#include <grpc/grpc.h>
-#include <grpc/support/slice.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
@@ -49,102 +49,102 @@
#define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
static void test_read_one_slice(void) {
- gpr_slice slice;
+ grpc_slice slice;
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
- gpr_slice first_slice, second_slice;
+ grpc_slice first_slice, second_slice;
int first_code, second_code;
LOG_TEST("test_read_one_slice");
- slice = gpr_slice_from_copied_string("test");
+ slice = grpc_slice_from_copied_string("test");
buffer = grpc_raw_byte_buffer_create(&slice, 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
GPR_ASSERT(first_code != 0);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(first_slice), "test", 4) == 0);
- gpr_slice_unref(first_slice);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
+ grpc_slice_unref(first_slice);
second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
GPR_ASSERT(second_code == 0);
grpc_byte_buffer_destroy(buffer);
}
static void test_read_one_slice_malloc(void) {
- gpr_slice slice;
+ grpc_slice slice;
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
- gpr_slice first_slice, second_slice;
+ grpc_slice first_slice, second_slice;
int first_code, second_code;
LOG_TEST("test_read_one_slice_malloc");
- slice = gpr_slice_malloc(4);
- memcpy(GPR_SLICE_START_PTR(slice), "test", 4);
+ slice = grpc_slice_malloc(4);
+ memcpy(GRPC_SLICE_START_PTR(slice), "test", 4);
buffer = grpc_raw_byte_buffer_create(&slice, 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
GPR_ASSERT(first_code != 0);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(first_slice), "test", 4) == 0);
- gpr_slice_unref(first_slice);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
+ grpc_slice_unref(first_slice);
second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
GPR_ASSERT(second_code == 0);
grpc_byte_buffer_destroy(buffer);
}
static void test_read_none_compressed_slice(void) {
- gpr_slice slice;
+ grpc_slice slice;
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
- gpr_slice first_slice, second_slice;
+ grpc_slice first_slice, second_slice;
int first_code, second_code;
LOG_TEST("test_read_none_compressed_slice");
- slice = gpr_slice_from_copied_string("test");
+ slice = grpc_slice_from_copied_string("test");
buffer = grpc_raw_byte_buffer_create(&slice, 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
GPR_ASSERT(first_code != 0);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(first_slice), "test", 4) == 0);
- gpr_slice_unref(first_slice);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
+ grpc_slice_unref(first_slice);
second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
GPR_ASSERT(second_code == 0);
grpc_byte_buffer_destroy(buffer);
}
static void test_read_corrupted_slice(void) {
- gpr_slice slice;
+ grpc_slice slice;
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
LOG_TEST("test_read_corrupted_slice");
- slice = gpr_slice_from_copied_string("test");
+ slice = grpc_slice_from_copied_string("test");
buffer = grpc_raw_byte_buffer_create(&slice, 1);
buffer->data.raw.compression = GRPC_COMPRESS_GZIP; /* lies! */
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(!grpc_byte_buffer_reader_init(&reader, buffer));
grpc_byte_buffer_destroy(buffer);
}
static void read_compressed_slice(grpc_compression_algorithm algorithm,
size_t input_size) {
- gpr_slice input_slice;
- gpr_slice_buffer sliceb_in;
- gpr_slice_buffer sliceb_out;
+ grpc_slice input_slice;
+ grpc_slice_buffer sliceb_in;
+ grpc_slice_buffer sliceb_out;
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
- gpr_slice read_slice;
+ grpc_slice read_slice;
size_t read_count = 0;
- gpr_slice_buffer_init(&sliceb_in);
- gpr_slice_buffer_init(&sliceb_out);
+ grpc_slice_buffer_init(&sliceb_in);
+ grpc_slice_buffer_init(&sliceb_out);
- input_slice = gpr_slice_malloc(input_size);
- memset(GPR_SLICE_START_PTR(input_slice), 'a', input_size);
- gpr_slice_buffer_add(&sliceb_in, input_slice); /* takes ownership */
+ input_slice = grpc_slice_malloc(input_size);
+ memset(GRPC_SLICE_START_PTR(input_slice), 'a', input_size);
+ grpc_slice_buffer_add(&sliceb_in, input_slice); /* takes ownership */
GPR_ASSERT(grpc_msg_compress(algorithm, &sliceb_in, &sliceb_out));
buffer = grpc_raw_compressed_byte_buffer_create(sliceb_out.slices,
@@ -153,17 +153,17 @@ static void read_compressed_slice(grpc_compression_algorithm algorithm,
"Couldn't init byte buffer reader");
while (grpc_byte_buffer_reader_next(&reader, &read_slice)) {
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(read_slice),
- GPR_SLICE_START_PTR(input_slice) + read_count,
- GPR_SLICE_LENGTH(read_slice)) == 0);
- read_count += GPR_SLICE_LENGTH(read_slice);
- gpr_slice_unref(read_slice);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(read_slice),
+ GRPC_SLICE_START_PTR(input_slice) + read_count,
+ GRPC_SLICE_LENGTH(read_slice)) == 0);
+ read_count += GRPC_SLICE_LENGTH(read_slice);
+ grpc_slice_unref(read_slice);
}
GPR_ASSERT(read_count == input_size);
grpc_byte_buffer_reader_destroy(&reader);
grpc_byte_buffer_destroy(buffer);
- gpr_slice_buffer_destroy(&sliceb_out);
- gpr_slice_buffer_destroy(&sliceb_in);
+ grpc_slice_buffer_destroy(&sliceb_out);
+ grpc_slice_buffer_destroy(&sliceb_in);
}
static void test_read_gzip_compressed_slice(void) {
@@ -179,15 +179,15 @@ static void test_read_deflate_compressed_slice(void) {
}
static void test_byte_buffer_from_reader(void) {
- gpr_slice slice;
+ grpc_slice slice;
grpc_byte_buffer *buffer, *buffer_from_reader;
grpc_byte_buffer_reader reader;
LOG_TEST("test_byte_buffer_from_reader");
- slice = gpr_slice_malloc(4);
- memcpy(GPR_SLICE_START_PTR(slice), "test", 4);
+ slice = grpc_slice_malloc(4);
+ memcpy(GRPC_SLICE_START_PTR(slice), "test", 4);
buffer = grpc_raw_byte_buffer_create(&slice, 1);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
@@ -195,7 +195,7 @@ static void test_byte_buffer_from_reader(void) {
GPR_ASSERT(buffer->type == buffer_from_reader->type);
GPR_ASSERT(buffer_from_reader->data.raw.compression == GRPC_COMPRESS_NONE);
GPR_ASSERT(buffer_from_reader->data.raw.slice_buffer.count == 1);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(
buffer_from_reader->data.raw.slice_buffer.slices[0]),
"test", 4) == 0);
@@ -206,70 +206,70 @@ static void test_byte_buffer_from_reader(void) {
static void test_readall(void) {
char *lotsa_as[512];
char *lotsa_bs[1024];
- gpr_slice slices[2];
+ grpc_slice slices[2];
grpc_byte_buffer *buffer;
grpc_byte_buffer_reader reader;
- gpr_slice slice_out;
+ grpc_slice slice_out;
LOG_TEST("test_readall");
memset(lotsa_as, 'a', 512);
memset(lotsa_bs, 'b', 1024);
/* use slices large enough to overflow inlining */
- slices[0] = gpr_slice_malloc(512);
- memcpy(GPR_SLICE_START_PTR(slices[0]), lotsa_as, 512);
- slices[1] = gpr_slice_malloc(1024);
- memcpy(GPR_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
+ slices[0] = grpc_slice_malloc(512);
+ memcpy(GRPC_SLICE_START_PTR(slices[0]), lotsa_as, 512);
+ slices[1] = grpc_slice_malloc(1024);
+ memcpy(GRPC_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
buffer = grpc_raw_byte_buffer_create(slices, 2);
- gpr_slice_unref(slices[0]);
- gpr_slice_unref(slices[1]);
+ grpc_slice_unref(slices[0]);
+ grpc_slice_unref(slices[1]);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
slice_out = grpc_byte_buffer_reader_readall(&reader);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice_out) == 512 + 1024);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
- GPR_ASSERT(memcmp(&(GPR_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice_out) == 512 + 1024);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
+ GPR_ASSERT(memcmp(&(GRPC_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
0);
- gpr_slice_unref(slice_out);
+ grpc_slice_unref(slice_out);
grpc_byte_buffer_destroy(buffer);
}
static void test_byte_buffer_copy(void) {
char *lotsa_as[512];
char *lotsa_bs[1024];
- gpr_slice slices[2];
+ grpc_slice slices[2];
grpc_byte_buffer *buffer;
grpc_byte_buffer *copied_buffer;
grpc_byte_buffer_reader reader;
- gpr_slice slice_out;
+ grpc_slice slice_out;
LOG_TEST("test_byte_buffer_copy");
memset(lotsa_as, 'a', 512);
memset(lotsa_bs, 'b', 1024);
/* use slices large enough to overflow inlining */
- slices[0] = gpr_slice_malloc(512);
- memcpy(GPR_SLICE_START_PTR(slices[0]), lotsa_as, 512);
- slices[1] = gpr_slice_malloc(1024);
- memcpy(GPR_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
+ slices[0] = grpc_slice_malloc(512);
+ memcpy(GRPC_SLICE_START_PTR(slices[0]), lotsa_as, 512);
+ slices[1] = grpc_slice_malloc(1024);
+ memcpy(GRPC_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
buffer = grpc_raw_byte_buffer_create(slices, 2);
- gpr_slice_unref(slices[0]);
- gpr_slice_unref(slices[1]);
+ grpc_slice_unref(slices[0]);
+ grpc_slice_unref(slices[1]);
copied_buffer = grpc_byte_buffer_copy(buffer);
GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
"Couldn't init byte buffer reader");
slice_out = grpc_byte_buffer_reader_readall(&reader);
- GPR_ASSERT(GPR_SLICE_LENGTH(slice_out) == 512 + 1024);
- GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
- GPR_ASSERT(memcmp(&(GPR_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
+ GPR_ASSERT(GRPC_SLICE_LENGTH(slice_out) == 512 + 1024);
+ GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
+ GPR_ASSERT(memcmp(&(GRPC_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
0);
- gpr_slice_unref(slice_out);
+ grpc_slice_unref(slice_out);
grpc_byte_buffer_destroy(buffer);
grpc_byte_buffer_destroy(copied_buffer);
}
diff --git a/test/core/surface/channel_create_test.c b/test/core/surface/channel_create_test.c
index ad7970aab9..654e5324d9 100644
--- a/test/core/surface/channel_create_test.c
+++ b/test/core/surface/channel_create_test.c
@@ -31,9 +31,14 @@
*
*/
+#include <string.h>
+
#include <grpc/grpc.h>
#include <grpc/support/log.h>
+
#include "src/core/ext/client_channel/resolver_registry.h"
+#include "src/core/lib/channel/channel_stack.h"
+#include "src/core/lib/surface/channel.h"
#include "test/core/util/test_config.h"
void test_unknown_scheme_target(void) {
@@ -44,6 +49,13 @@ void test_unknown_scheme_target(void) {
chan = grpc_insecure_channel_create("blah://blah", NULL, NULL);
GPR_ASSERT(chan != NULL);
+
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_channel_element *elem =
+ grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
+ GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
+ grpc_exec_ctx_finish(&exec_ctx);
+
grpc_channel_destroy(chan);
}
diff --git a/test/core/surface/concurrent_connectivity_test.c b/test/core/surface/concurrent_connectivity_test.c
index f9f723baaa..93a4794222 100644
--- a/test/core/surface/concurrent_connectivity_test.c
+++ b/test/core/surface/concurrent_connectivity_test.c
@@ -105,8 +105,8 @@ void server_thread(void *vargs) {
static void on_connect(grpc_exec_ctx *exec_ctx, void *vargs, grpc_endpoint *tcp,
grpc_pollset *accepting_pollset,
grpc_tcp_server_acceptor *acceptor) {
+ gpr_free(acceptor);
struct server_thread_args *args = (struct server_thread_args *)vargs;
- (void)acceptor;
grpc_endpoint_shutdown(exec_ctx, tcp);
grpc_endpoint_destroy(exec_ctx, tcp);
GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(args->pollset, NULL));
@@ -120,7 +120,7 @@ void bad_server_thread(void *vargs) {
struct sockaddr_storage *addr = (struct sockaddr_storage *)resolved_addr.addr;
int port;
grpc_tcp_server *s;
- grpc_error *error = grpc_tcp_server_create(NULL, NULL, &s);
+ grpc_error *error = grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s);
GPR_ASSERT(error == GRPC_ERROR_NONE);
memset(&resolved_addr, 0, sizeof(resolved_addr));
addr->ss_family = AF_INET;
diff --git a/test/core/surface/public_headers_must_be_c89.c b/test/core/surface/public_headers_must_be_c89.c
index 53bdf612fc..d4cfa25d44 100644
--- a/test/core/surface/public_headers_must_be_c89.c
+++ b/test/core/surface/public_headers_must_be_c89.c
@@ -50,6 +50,8 @@
#include <grpc/impl/codegen/status.h>
#include <grpc/impl/codegen/sync.h>
#include <grpc/impl/codegen/sync_generic.h>
+#include <grpc/slice.h>
+#include <grpc/slice_buffer.h>
#include <grpc/status.h>
#include <grpc/support/alloc.h>
#include <grpc/support/atm.h>
@@ -60,8 +62,6 @@
#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
#include <grpc/support/port_platform.h>
-#include <grpc/support/slice.h>
-#include <grpc/support/slice_buffer.h>
#include <grpc/support/string_util.h>
#include <grpc/support/subprocess.h>
#include <grpc/support/sync.h>
diff --git a/test/core/surface/server_chttp2_test.c b/test/core/surface/server_chttp2_test.c
index 6310b6f00b..6c178abdad 100644
--- a/test/core/surface/server_chttp2_test.c
+++ b/test/core/surface/server_chttp2_test.c
@@ -44,8 +44,11 @@
#include "test/core/util/test_config.h"
void test_unparsable_target(void) {
- int port = grpc_server_add_insecure_http2_port(NULL, "[");
+ grpc_channel_args args = {0, NULL};
+ grpc_server *server = grpc_server_create(&args, NULL);
+ int port = grpc_server_add_insecure_http2_port(server, "[");
GPR_ASSERT(port == 0);
+ grpc_server_destroy(server);
}
void test_add_same_port_twice() {
diff --git a/test/core/transport/chttp2/bin_decoder_test.c b/test/core/transport/chttp2/bin_decoder_test.c
index c4e6cd332f..7ddc30291a 100644
--- a/test/core/transport/chttp2/bin_decoder_test.c
+++ b/test/core/transport/chttp2/bin_decoder_test.c
@@ -38,50 +38,51 @@
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
static int all_ok = 1;
-static void expect_slice_eq(gpr_slice expected, gpr_slice slice, char *debug,
+static void expect_slice_eq(grpc_slice expected, grpc_slice slice, char *debug,
int line) {
- if (0 != gpr_slice_cmp(slice, expected)) {
- char *hs = gpr_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *he = gpr_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ if (0 != grpc_slice_cmp(slice, expected)) {
+ char *hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_ERROR, "FAILED:%d: %s\ngot: %s\nwant: %s", line, debug, hs,
he);
gpr_free(hs);
gpr_free(he);
all_ok = 0;
}
- gpr_slice_unref(expected);
- gpr_slice_unref(slice);
+ grpc_slice_unref(expected);
+ grpc_slice_unref(slice);
}
-static gpr_slice base64_encode(const char *s) {
- gpr_slice ss = gpr_slice_from_copied_string(s);
- gpr_slice out = grpc_chttp2_base64_encode(ss);
- gpr_slice_unref(ss);
+static grpc_slice base64_encode(const char *s) {
+ grpc_slice ss = grpc_slice_from_copied_string(s);
+ grpc_slice out = grpc_chttp2_base64_encode(ss);
+ grpc_slice_unref(ss);
return out;
}
-static gpr_slice base64_decode(const char *s) {
- gpr_slice ss = gpr_slice_from_copied_string(s);
- gpr_slice out = grpc_chttp2_base64_decode(ss);
- gpr_slice_unref(ss);
+static grpc_slice base64_decode(const char *s) {
+ grpc_slice ss = grpc_slice_from_copied_string(s);
+ grpc_slice out = grpc_chttp2_base64_decode(ss);
+ grpc_slice_unref(ss);
return out;
}
-static gpr_slice base64_decode_with_length(const char *s,
- size_t output_length) {
- gpr_slice ss = gpr_slice_from_copied_string(s);
- gpr_slice out = grpc_chttp2_base64_decode_with_length(ss, output_length);
- gpr_slice_unref(ss);
+static grpc_slice base64_decode_with_length(const char *s,
+ size_t output_length) {
+ grpc_slice ss = grpc_slice_from_copied_string(s);
+ grpc_slice out = grpc_chttp2_base64_decode_with_length(ss, output_length);
+ grpc_slice_unref(ss);
return out;
}
-#define EXPECT_SLICE_EQ(expected, slice) \
- expect_slice_eq( \
- gpr_slice_from_copied_buffer(expected, sizeof(expected) - 1), slice, \
+#define EXPECT_SLICE_EQ(expected, slice) \
+ expect_slice_eq( \
+ grpc_slice_from_copied_buffer(expected, sizeof(expected) - 1), slice, \
#slice, __LINE__);
#define ENCODE_AND_DECODE(s) \
diff --git a/test/core/transport/chttp2/bin_encoder_test.c b/test/core/transport/chttp2/bin_encoder_test.c
index 08d10735a5..53b55a301e 100644
--- a/test/core/transport/chttp2/bin_encoder_test.c
+++ b/test/core/transport/chttp2/bin_encoder_test.c
@@ -41,53 +41,54 @@
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
static int all_ok = 1;
-static void expect_slice_eq(gpr_slice expected, gpr_slice slice, char *debug,
+static void expect_slice_eq(grpc_slice expected, grpc_slice slice, char *debug,
int line) {
- if (0 != gpr_slice_cmp(slice, expected)) {
- char *hs = gpr_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *he = gpr_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ if (0 != grpc_slice_cmp(slice, expected)) {
+ char *hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_ERROR, "FAILED:%d: %s\ngot: %s\nwant: %s", line, debug, hs,
he);
gpr_free(hs);
gpr_free(he);
all_ok = 0;
}
- gpr_slice_unref(expected);
- gpr_slice_unref(slice);
+ grpc_slice_unref(expected);
+ grpc_slice_unref(slice);
}
-static gpr_slice B64(const char *s) {
- gpr_slice ss = gpr_slice_from_copied_string(s);
- gpr_slice out = grpc_chttp2_base64_encode(ss);
- gpr_slice_unref(ss);
+static grpc_slice B64(const char *s) {
+ grpc_slice ss = grpc_slice_from_copied_string(s);
+ grpc_slice out = grpc_chttp2_base64_encode(ss);
+ grpc_slice_unref(ss);
return out;
}
-static gpr_slice HUFF(const char *s) {
- gpr_slice ss = gpr_slice_from_copied_string(s);
- gpr_slice out = grpc_chttp2_huffman_compress(ss);
- gpr_slice_unref(ss);
+static grpc_slice HUFF(const char *s) {
+ grpc_slice ss = grpc_slice_from_copied_string(s);
+ grpc_slice out = grpc_chttp2_huffman_compress(ss);
+ grpc_slice_unref(ss);
return out;
}
-#define EXPECT_SLICE_EQ(expected, slice) \
- expect_slice_eq( \
- gpr_slice_from_copied_buffer(expected, sizeof(expected) - 1), slice, \
+#define EXPECT_SLICE_EQ(expected, slice) \
+ expect_slice_eq( \
+ grpc_slice_from_copied_buffer(expected, sizeof(expected) - 1), slice, \
#slice, __LINE__);
static void expect_combined_equiv(const char *s, size_t len, int line) {
- gpr_slice input = gpr_slice_from_copied_buffer(s, len);
- gpr_slice base64 = grpc_chttp2_base64_encode(input);
- gpr_slice expect = grpc_chttp2_huffman_compress(base64);
- gpr_slice got = grpc_chttp2_base64_encode_and_huffman_compress_impl(input);
- if (0 != gpr_slice_cmp(expect, got)) {
- char *t = gpr_dump_slice(input, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *e = gpr_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *g = gpr_dump_slice(got, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ grpc_slice input = grpc_slice_from_copied_buffer(s, len);
+ grpc_slice base64 = grpc_chttp2_base64_encode(input);
+ grpc_slice expect = grpc_chttp2_huffman_compress(base64);
+ grpc_slice got = grpc_chttp2_base64_encode_and_huffman_compress_impl(input);
+ if (0 != grpc_slice_cmp(expect, got)) {
+ char *t = grpc_dump_slice(input, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *e = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *g = grpc_dump_slice(got, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_ERROR, "FAILED:%d:\ntest: %s\ngot: %s\nwant: %s", line, t, g,
e);
gpr_free(t);
@@ -95,10 +96,10 @@ static void expect_combined_equiv(const char *s, size_t len, int line) {
gpr_free(g);
all_ok = 0;
}
- gpr_slice_unref(input);
- gpr_slice_unref(base64);
- gpr_slice_unref(expect);
- gpr_slice_unref(got);
+ grpc_slice_unref(input);
+ grpc_slice_unref(base64);
+ grpc_slice_unref(expect);
+ grpc_slice_unref(got);
}
#define EXPECT_COMBINED_EQUIV(x) \
diff --git a/test/core/transport/chttp2/hpack_encoder_test.c b/test/core/transport/chttp2/hpack_encoder_test.c
index 1c1c74879b..91421e18f4 100644
--- a/test/core/transport/chttp2/hpack_encoder_test.c
+++ b/test/core/transport/chttp2/hpack_encoder_test.c
@@ -41,6 +41,7 @@
#include <grpc/support/string_util.h>
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
+#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h"
#include "src/core/lib/transport/metadata.h"
#include "test/core/util/parse_hexstring.h"
@@ -60,9 +61,9 @@ size_t cap_to_delete = 0;
hexstring passed in */
static void verify(size_t window_available, int eof, size_t expect_window_used,
const char *expected, size_t nheaders, ...) {
- gpr_slice_buffer output;
- gpr_slice merged;
- gpr_slice expect = parse_hexstring(expected);
+ grpc_slice_buffer output;
+ grpc_slice merged;
+ grpc_slice expect = parse_hexstring(expected);
size_t i;
va_list l;
grpc_linked_mdelem *e = gpr_malloc(sizeof(*e) * nheaders);
@@ -93,19 +94,19 @@ static void verify(size_t window_available, int eof, size_t expect_window_used,
}
to_delete[num_to_delete++] = e;
- gpr_slice_buffer_init(&output);
+ grpc_slice_buffer_init(&output);
grpc_transport_one_way_stats stats;
memset(&stats, 0, sizeof(stats));
grpc_chttp2_encode_header(&g_compressor, 0xdeadbeef, &b, eof, 16384, &stats,
&output);
merged = grpc_slice_merge(output.slices, output.count);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&output);
grpc_metadata_batch_destroy(&b);
- if (0 != gpr_slice_cmp(merged, expect)) {
- char *expect_str = gpr_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
- char *got_str = gpr_dump_slice(merged, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ if (0 != grpc_slice_cmp(merged, expect)) {
+ char *expect_str = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+ char *got_str = grpc_dump_slice(merged, GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_ERROR, "mismatched output for %s", expected);
gpr_log(GPR_ERROR, "EXPECT: %s", expect_str);
gpr_log(GPR_ERROR, "GOT: %s", got_str);
@@ -114,8 +115,8 @@ static void verify(size_t window_available, int eof, size_t expect_window_used,
g_failure = 1;
}
- gpr_slice_unref(merged);
- gpr_slice_unref(expect);
+ grpc_slice_unref(merged);
+ grpc_slice_unref(expect);
}
static void test_basic_headers(void) {
@@ -186,7 +187,7 @@ static void test_decode_table_overflow(void) {
static void verify_table_size_change_match_elem_size(const char *key,
const char *value) {
- gpr_slice_buffer output;
+ grpc_slice_buffer output;
grpc_mdelem *elem = grpc_mdelem_from_strings(key, value);
size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem);
size_t initial_table_size = g_compressor.table_size;
@@ -198,13 +199,13 @@ static void verify_table_size_change_match_elem_size(const char *key,
e[0].next = NULL;
b.list.head = &e[0];
b.list.tail = &e[0];
- gpr_slice_buffer_init(&output);
+ grpc_slice_buffer_init(&output);
grpc_transport_one_way_stats stats;
memset(&stats, 0, sizeof(stats));
grpc_chttp2_encode_header(&g_compressor, 0xdeadbeef, &b, 0, 16384, &stats,
&output);
- gpr_slice_buffer_destroy(&output);
+ grpc_slice_buffer_destroy(&output);
grpc_metadata_batch_destroy(&b);
GPR_ASSERT(g_compressor.table_size == elem_size + initial_table_size);
diff --git a/test/core/transport/chttp2/hpack_parser_test.c b/test/core/transport/chttp2/hpack_parser_test.c
index 55b64f5d99..e2813df70c 100644
--- a/test/core/transport/chttp2/hpack_parser_test.c
+++ b/test/core/transport/chttp2/hpack_parser_test.c
@@ -36,9 +36,9 @@
#include <stdarg.h>
#include <grpc/grpc.h>
+#include <grpc/slice.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include "test/core/util/parse_hexstring.h"
#include "test/core/util/slice_splitter.h"
#include "test/core/util/test_config.h"
@@ -52,16 +52,16 @@ static void onhdr(grpc_exec_ctx *exec_ctx, void *ud, grpc_mdelem *md) {
GPR_ASSERT(ekey);
evalue = va_arg(chk->args, char *);
GPR_ASSERT(evalue);
- GPR_ASSERT(gpr_slice_str_cmp(md->key->slice, ekey) == 0);
- GPR_ASSERT(gpr_slice_str_cmp(md->value->slice, evalue) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md->key->slice, ekey) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(md->value->slice, evalue) == 0);
GRPC_MDELEM_UNREF(md);
}
static void test_vector(grpc_chttp2_hpack_parser *parser,
grpc_slice_split_mode mode, const char *hexstring,
... /* char *key, char *value */) {
- gpr_slice input = parse_hexstring(hexstring);
- gpr_slice *slices;
+ grpc_slice input = parse_hexstring(hexstring);
+ grpc_slice *slices;
size_t nslices;
size_t i;
test_checker chk;
@@ -72,18 +72,18 @@ static void test_vector(grpc_chttp2_hpack_parser *parser,
parser->on_header_user_data = &chk;
grpc_split_slices(mode, &input, 1, &slices, &nslices);
- gpr_slice_unref(input);
+ grpc_slice_unref(input);
for (i = 0; i < nslices; i++) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
GPR_ASSERT(grpc_chttp2_hpack_parser_parse(
- &exec_ctx, parser, GPR_SLICE_START_PTR(slices[i]),
- GPR_SLICE_END_PTR(slices[i])) == GRPC_ERROR_NONE);
+ &exec_ctx, parser, GRPC_SLICE_START_PTR(slices[i]),
+ GRPC_SLICE_END_PTR(slices[i])) == GRPC_ERROR_NONE);
grpc_exec_ctx_finish(&exec_ctx);
}
for (i = 0; i < nslices; i++) {
- gpr_slice_unref(slices[i]);
+ grpc_slice_unref(slices[i]);
}
gpr_free(slices);
diff --git a/test/core/transport/chttp2/hpack_table_test.c b/test/core/transport/chttp2/hpack_table_test.c
index 75b0ef4629..1a7e2442ca 100644
--- a/test/core/transport/chttp2/hpack_table_test.c
+++ b/test/core/transport/chttp2/hpack_table_test.c
@@ -48,7 +48,7 @@
static void assert_str(const grpc_chttp2_hptbl *tbl, grpc_mdstr *mdstr,
const char *str) {
- GPR_ASSERT(gpr_slice_str_cmp(mdstr->slice, str) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(mdstr->slice, str) == 0);
}
static void assert_index(const grpc_chttp2_hptbl *tbl, uint32_t idx,
diff --git a/test/core/transport/chttp2/varint_test.c b/test/core/transport/chttp2/varint_test.c
index 3552bf0c59..e29be4b056 100644
--- a/test/core/transport/chttp2/varint_test.c
+++ b/test/core/transport/chttp2/varint_test.c
@@ -33,24 +33,25 @@
#include "src/core/ext/transport/chttp2/transport/varint.h"
+#include <grpc/slice.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
#include "test/core/util/test_config.h"
static void test_varint(uint32_t value, uint32_t prefix_bits, uint8_t prefix_or,
const char *expect_bytes, size_t expect_length) {
uint32_t nbytes = GRPC_CHTTP2_VARINT_LENGTH(value, prefix_bits);
- gpr_slice expect = gpr_slice_from_copied_buffer(expect_bytes, expect_length);
- gpr_slice slice;
+ grpc_slice expect =
+ grpc_slice_from_copied_buffer(expect_bytes, expect_length);
+ grpc_slice slice;
gpr_log(GPR_DEBUG, "Test: 0x%08x", value);
GPR_ASSERT(nbytes == expect_length);
- slice = gpr_slice_malloc(nbytes);
+ slice = grpc_slice_malloc(nbytes);
GRPC_CHTTP2_WRITE_VARINT(value, prefix_bits, prefix_or,
- GPR_SLICE_START_PTR(slice), nbytes);
- GPR_ASSERT(gpr_slice_cmp(expect, slice) == 0);
- gpr_slice_unref(expect);
- gpr_slice_unref(slice);
+ GRPC_SLICE_START_PTR(slice), nbytes);
+ GPR_ASSERT(grpc_slice_cmp(expect, slice) == 0);
+ grpc_slice_unref(expect);
+ grpc_slice_unref(slice);
}
#define TEST_VARINT(value, prefix_bits, prefix_or, expect) \
diff --git a/test/core/transport/metadata_test.c b/test/core/transport/metadata_test.c
index 007892930c..5c89d8530a 100644
--- a/test/core/transport/metadata_test.c
+++ b/test/core/transport/metadata_test.c
@@ -68,8 +68,8 @@ static void test_create_string(void) {
s3 = grpc_mdstr_from_string("very much not hello");
GPR_ASSERT(s1 == s2);
GPR_ASSERT(s3 != s1);
- GPR_ASSERT(gpr_slice_str_cmp(s1->slice, "hello") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(s3->slice, "very much not hello") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(s1->slice, "hello") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(s3->slice, "very much not hello") == 0);
GRPC_MDSTR_UNREF(s1);
GRPC_MDSTR_UNREF(s2);
GRPC_MDSTR_UNREF(s3);
@@ -89,9 +89,9 @@ static void test_create_metadata(void) {
GPR_ASSERT(m3 != m1);
GPR_ASSERT(m3->key == m1->key);
GPR_ASSERT(m3->value != m1->value);
- GPR_ASSERT(gpr_slice_str_cmp(m1->key->slice, "a") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(m1->value->slice, "b") == 0);
- GPR_ASSERT(gpr_slice_str_cmp(m3->value->slice, "c") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(m1->key->slice, "a") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(m1->value->slice, "b") == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(m3->value->slice, "c") == 0);
GRPC_MDELEM_UNREF(m1);
GRPC_MDELEM_UNREF(m2);
GRPC_MDELEM_UNREF(m3);
@@ -205,7 +205,7 @@ static void test_things_stick_around(void) {
static void test_slices_work(void) {
/* ensure no memory leaks when switching representation from mdstr to slice */
grpc_mdstr *str;
- gpr_slice slice;
+ grpc_slice slice;
LOG_TEST("test_slices_work");
@@ -213,14 +213,14 @@ static void test_slices_work(void) {
str = grpc_mdstr_from_string(
"123456789012345678901234567890123456789012345678901234567890");
- slice = gpr_slice_ref(str->slice);
+ slice = grpc_slice_ref(str->slice);
GRPC_MDSTR_UNREF(str);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
str = grpc_mdstr_from_string(
"123456789012345678901234567890123456789012345678901234567890");
- slice = gpr_slice_ref(str->slice);
- gpr_slice_unref(slice);
+ slice = grpc_slice_ref(str->slice);
+ grpc_slice_unref(slice);
GRPC_MDSTR_UNREF(str);
grpc_shutdown();
@@ -228,8 +228,8 @@ static void test_slices_work(void) {
static void test_base64_and_huffman_works(void) {
grpc_mdstr *str;
- gpr_slice slice1;
- gpr_slice slice2;
+ grpc_slice slice1;
+ grpc_slice slice2;
LOG_TEST("test_base64_and_huffman_works");
@@ -237,9 +237,9 @@ static void test_base64_and_huffman_works(void) {
str = grpc_mdstr_from_string("abcdefg");
slice1 = grpc_mdstr_as_base64_encoded_and_huffman_compressed(str);
slice2 = grpc_chttp2_base64_encode_and_huffman_compress(str->slice);
- GPR_ASSERT(0 == gpr_slice_cmp(slice1, slice2));
+ GPR_ASSERT(0 == grpc_slice_cmp(slice1, slice2));
- gpr_slice_unref(slice2);
+ grpc_slice_unref(slice2);
GRPC_MDSTR_UNREF(str);
grpc_shutdown();
}
@@ -276,13 +276,13 @@ static void verify_binary_header_size(const char *key, const uint8_t *value,
grpc_mdelem *elem = grpc_mdelem_from_string_and_buffer(key, value, value_len);
GPR_ASSERT(grpc_is_binary_header(key, strlen(key)));
size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem);
- gpr_slice value_slice =
- gpr_slice_from_copied_buffer((const char *)value, value_len);
- gpr_slice base64_encoded = grpc_chttp2_base64_encode(value_slice);
- size_t expected_size = 32 + strlen(key) + GPR_SLICE_LENGTH(base64_encoded);
+ grpc_slice value_slice =
+ grpc_slice_from_copied_buffer((const char *)value, value_len);
+ grpc_slice base64_encoded = grpc_chttp2_base64_encode(value_slice);
+ size_t expected_size = 32 + strlen(key) + GRPC_SLICE_LENGTH(base64_encoded);
GPR_ASSERT(expected_size == elem_size);
- gpr_slice_unref(value_slice);
- gpr_slice_unref(base64_encoded);
+ grpc_slice_unref(value_slice);
+ grpc_slice_unref(base64_encoded);
GRPC_MDELEM_UNREF(elem);
}
diff --git a/test/core/transport/pid_controller_test.c b/test/core/transport/pid_controller_test.c
new file mode 100644
index 0000000000..9614983b00
--- /dev/null
+++ b/test/core/transport/pid_controller_test.c
@@ -0,0 +1,77 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/lib/transport/pid_controller.h"
+
+#include <math.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/useful.h>
+#include "src/core/lib/support/string.h"
+#include "test/core/util/test_config.h"
+
+static void test_noop(void) {
+ gpr_log(GPR_INFO, "test_noop");
+ grpc_pid_controller pid;
+ grpc_pid_controller_init(&pid, 1, 1, 1);
+}
+
+static void test_simple_convergence(double gain_p, double gain_i, double gain_d,
+ double dt, double set_point, double start) {
+ gpr_log(GPR_INFO,
+ "test_simple_convergence(p=%lf, i=%lf, d=%lf); dt=%lf set_point=%lf "
+ "start=%lf",
+ gain_p, gain_i, gain_d, dt, set_point, start);
+ grpc_pid_controller pid;
+ grpc_pid_controller_init(&pid, 0.2, 0.1, 0.1);
+
+ double current = start;
+
+ for (int i = 0; i < 1000; i++) {
+ current += grpc_pid_controller_update(&pid, set_point - current, 1);
+ }
+
+ GPR_ASSERT(fabs(set_point - current) < 0.1);
+ GPR_ASSERT(fabs(pid.error_integral) < 0.1);
+}
+
+int main(int argc, char **argv) {
+ grpc_test_init(argc, argv);
+ test_noop();
+ test_simple_convergence(0.2, 0, 0, 1, 100, 0);
+ test_simple_convergence(0.2, 0.1, 0, 1, 100, 0);
+ test_simple_convergence(0.2, 0.1, 0.1, 1, 100, 0);
+ return 0;
+}
diff --git a/test/core/util/mock_endpoint.c b/test/core/util/mock_endpoint.c
index 13e0e918fb..bf6d85252a 100644
--- a/test/core/util/mock_endpoint.c
+++ b/test/core/util/mock_endpoint.c
@@ -33,24 +33,28 @@
#include "test/core/util/mock_endpoint.h"
+#include <inttypes.h>
+
#include <grpc/support/alloc.h>
#include <grpc/support/string_util.h>
+#include "src/core/lib/iomgr/sockaddr.h"
typedef struct grpc_mock_endpoint {
grpc_endpoint base;
gpr_mu mu;
- void (*on_write)(gpr_slice slice);
- gpr_slice_buffer read_buffer;
- gpr_slice_buffer *on_read_out;
+ void (*on_write)(grpc_slice slice);
+ grpc_slice_buffer read_buffer;
+ grpc_slice_buffer *on_read_out;
grpc_closure *on_read;
+ grpc_resource_user *resource_user;
} grpc_mock_endpoint;
static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
- gpr_slice_buffer *slices, grpc_closure *cb) {
+ grpc_slice_buffer *slices, grpc_closure *cb) {
grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
gpr_mu_lock(&m->mu);
if (m->read_buffer.count > 0) {
- gpr_slice_buffer_swap(&m->read_buffer, slices);
+ grpc_slice_buffer_swap(&m->read_buffer, slices);
grpc_exec_ctx_sched(exec_ctx, cb, GRPC_ERROR_NONE, NULL);
} else {
m->on_read = cb;
@@ -60,7 +64,7 @@ static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
}
static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
- gpr_slice_buffer *slices, grpc_closure *cb) {
+ grpc_slice_buffer *slices, grpc_closure *cb) {
grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
for (size_t i = 0; i < slices->count; i++) {
m->on_write(slices->slices[i]);
@@ -83,11 +87,13 @@ static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
m->on_read = NULL;
}
gpr_mu_unlock(&m->mu);
+ grpc_resource_user_shutdown(exec_ctx, m->resource_user);
}
static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
- gpr_slice_buffer_destroy(&m->read_buffer);
+ grpc_slice_buffer_destroy(&m->read_buffer);
+ grpc_resource_user_unref(exec_ctx, m->resource_user);
gpr_free(m);
}
@@ -95,6 +101,13 @@ static char *me_get_peer(grpc_endpoint *ep) {
return gpr_strdup("fake:mock_endpoint");
}
+static grpc_resource_user *me_get_resource_user(grpc_endpoint *ep) {
+ grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+ return m->resource_user;
+}
+
+static int me_get_fd(grpc_endpoint *ep) { return -1; }
+
static grpc_workqueue *me_get_workqueue(grpc_endpoint *ep) { return NULL; }
static const grpc_endpoint_vtable vtable = {
@@ -105,13 +118,20 @@ static const grpc_endpoint_vtable vtable = {
me_add_to_pollset_set,
me_shutdown,
me_destroy,
+ me_get_resource_user,
me_get_peer,
+ me_get_fd,
};
-grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(gpr_slice slice)) {
+grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
+ grpc_resource_quota *resource_quota) {
grpc_mock_endpoint *m = gpr_malloc(sizeof(*m));
m->base.vtable = &vtable;
- gpr_slice_buffer_init(&m->read_buffer);
+ char *name;
+ gpr_asprintf(&name, "mock_endpoint_%" PRIxPTR, (intptr_t)m);
+ m->resource_user = grpc_resource_user_create(resource_quota, name);
+ gpr_free(name);
+ grpc_slice_buffer_init(&m->read_buffer);
gpr_mu_init(&m->mu);
m->on_write = on_write;
m->on_read = NULL;
@@ -119,15 +139,15 @@ grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(gpr_slice slice)) {
}
void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
- gpr_slice slice) {
+ grpc_slice slice) {
grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
gpr_mu_lock(&m->mu);
if (m->on_read != NULL) {
- gpr_slice_buffer_add(m->on_read_out, slice);
+ grpc_slice_buffer_add(m->on_read_out, slice);
grpc_exec_ctx_sched(exec_ctx, m->on_read, GRPC_ERROR_NONE, NULL);
m->on_read = NULL;
} else {
- gpr_slice_buffer_add(&m->read_buffer, slice);
+ grpc_slice_buffer_add(&m->read_buffer, slice);
}
gpr_mu_unlock(&m->mu);
}
diff --git a/test/core/util/mock_endpoint.h b/test/core/util/mock_endpoint.h
index 051af9866b..ec7f0fcfcd 100644
--- a/test/core/util/mock_endpoint.h
+++ b/test/core/util/mock_endpoint.h
@@ -36,8 +36,10 @@
#include "src/core/lib/iomgr/endpoint.h"
-grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(gpr_slice slice));
+grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
+ grpc_resource_quota *resource_quota);
void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx,
- grpc_endpoint *mock_endpoint, gpr_slice slice);
+ grpc_endpoint *mock_endpoint,
+ grpc_slice slice);
#endif
diff --git a/test/core/util/one_corpus_entry_fuzzer.c b/test/core/util/one_corpus_entry_fuzzer.c
index 95ae4cf706..c016ebb536 100644
--- a/test/core/util/one_corpus_entry_fuzzer.c
+++ b/test/core/util/one_corpus_entry_fuzzer.c
@@ -42,12 +42,13 @@ extern bool squelch;
extern bool leak_check;
int main(int argc, char **argv) {
- gpr_slice buffer;
+ grpc_slice buffer;
squelch = false;
leak_check = false;
GPR_ASSERT(
GRPC_LOG_IF_ERROR("load_file", grpc_load_file(argv[1], 0, &buffer)));
- LLVMFuzzerTestOneInput(GPR_SLICE_START_PTR(buffer), GPR_SLICE_LENGTH(buffer));
- gpr_slice_unref(buffer);
+ LLVMFuzzerTestOneInput(GRPC_SLICE_START_PTR(buffer),
+ GRPC_SLICE_LENGTH(buffer));
+ grpc_slice_unref(buffer);
return 0;
}
diff --git a/test/core/util/parse_hexstring.c b/test/core/util/parse_hexstring.c
index 3ad7ce5828..60ab1bb0c4 100644
--- a/test/core/util/parse_hexstring.c
+++ b/test/core/util/parse_hexstring.c
@@ -34,12 +34,12 @@
#include "test/core/util/parse_hexstring.h"
#include <grpc/support/log.h>
-gpr_slice parse_hexstring(const char *hexstring) {
+grpc_slice parse_hexstring(const char *hexstring) {
size_t nibbles = 0;
const char *p = 0;
uint8_t *out;
uint8_t temp;
- gpr_slice slice;
+ grpc_slice slice;
for (p = hexstring; *p; p++) {
nibbles += (*p >= '0' && *p <= '9') || (*p >= 'a' && *p <= 'f');
@@ -47,8 +47,8 @@ gpr_slice parse_hexstring(const char *hexstring) {
GPR_ASSERT((nibbles & 1) == 0);
- slice = gpr_slice_malloc(nibbles / 2);
- out = GPR_SLICE_START_PTR(slice);
+ slice = grpc_slice_malloc(nibbles / 2);
+ out = GRPC_SLICE_START_PTR(slice);
nibbles = 0;
temp = 0;
diff --git a/test/core/util/parse_hexstring.h b/test/core/util/parse_hexstring.h
index ddbfe541c6..32a4426812 100644
--- a/test/core/util/parse_hexstring.h
+++ b/test/core/util/parse_hexstring.h
@@ -34,8 +34,8 @@
#ifndef GRPC_TEST_CORE_UTIL_PARSE_HEXSTRING_H
#define GRPC_TEST_CORE_UTIL_PARSE_HEXSTRING_H
-#include <grpc/support/slice.h>
+#include <grpc/slice.h>
-gpr_slice parse_hexstring(const char *hexstring);
+grpc_slice parse_hexstring(const char *hexstring);
#endif /* GRPC_TEST_CORE_UTIL_PARSE_HEXSTRING_H */
diff --git a/test/core/util/passthru_endpoint.c b/test/core/util/passthru_endpoint.c
index 7ed9e97bd6..b3405f02e9 100644
--- a/test/core/util/passthru_endpoint.c
+++ b/test/core/util/passthru_endpoint.c
@@ -33,17 +33,21 @@
#include "test/core/util/passthru_endpoint.h"
+#include <inttypes.h>
+
#include <grpc/support/alloc.h>
#include <grpc/support/string_util.h>
+#include "src/core/lib/iomgr/sockaddr.h"
typedef struct passthru_endpoint passthru_endpoint;
typedef struct {
grpc_endpoint base;
passthru_endpoint *parent;
- gpr_slice_buffer read_buffer;
- gpr_slice_buffer *on_read_out;
+ grpc_slice_buffer read_buffer;
+ grpc_slice_buffer *on_read_out;
grpc_closure *on_read;
+ grpc_resource_user *resource_user;
} half;
struct passthru_endpoint {
@@ -55,14 +59,14 @@ struct passthru_endpoint {
};
static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
- gpr_slice_buffer *slices, grpc_closure *cb) {
+ grpc_slice_buffer *slices, grpc_closure *cb) {
half *m = (half *)ep;
gpr_mu_lock(&m->parent->mu);
if (m->parent->shutdown) {
grpc_exec_ctx_sched(exec_ctx, cb, GRPC_ERROR_CREATE("Already shutdown"),
NULL);
} else if (m->read_buffer.count > 0) {
- gpr_slice_buffer_swap(&m->read_buffer, slices);
+ grpc_slice_buffer_swap(&m->read_buffer, slices);
grpc_exec_ctx_sched(exec_ctx, cb, GRPC_ERROR_NONE, NULL);
} else {
m->on_read = cb;
@@ -77,7 +81,7 @@ static half *other_half(half *h) {
}
static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
- gpr_slice_buffer *slices, grpc_closure *cb) {
+ grpc_slice_buffer *slices, grpc_closure *cb) {
half *m = other_half((half *)ep);
gpr_mu_lock(&m->parent->mu);
grpc_error *error = GRPC_ERROR_NONE;
@@ -85,13 +89,13 @@ static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
error = GRPC_ERROR_CREATE("Endpoint already shutdown");
} else if (m->on_read != NULL) {
for (size_t i = 0; i < slices->count; i++) {
- gpr_slice_buffer_add(m->on_read_out, gpr_slice_ref(slices->slices[i]));
+ grpc_slice_buffer_add(m->on_read_out, grpc_slice_ref(slices->slices[i]));
}
grpc_exec_ctx_sched(exec_ctx, m->on_read, GRPC_ERROR_NONE, NULL);
m->on_read = NULL;
} else {
for (size_t i = 0; i < slices->count; i++) {
- gpr_slice_buffer_add(&m->read_buffer, gpr_slice_ref(slices->slices[i]));
+ grpc_slice_buffer_add(&m->read_buffer, grpc_slice_ref(slices->slices[i]));
}
}
gpr_mu_unlock(&m->parent->mu);
@@ -120,6 +124,7 @@ static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
m->on_read = NULL;
}
gpr_mu_unlock(&m->parent->mu);
+ grpc_resource_user_shutdown(exec_ctx, m->resource_user);
}
static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
@@ -128,8 +133,10 @@ static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
if (0 == --p->halves) {
gpr_mu_unlock(&p->mu);
gpr_mu_destroy(&p->mu);
- gpr_slice_buffer_destroy(&p->client.read_buffer);
- gpr_slice_buffer_destroy(&p->server.read_buffer);
+ grpc_slice_buffer_destroy(&p->client.read_buffer);
+ grpc_slice_buffer_destroy(&p->server.read_buffer);
+ grpc_resource_user_unref(exec_ctx, p->client.resource_user);
+ grpc_resource_user_unref(exec_ctx, p->server.resource_user);
gpr_free(p);
} else {
gpr_mu_unlock(&p->mu);
@@ -140,8 +147,15 @@ static char *me_get_peer(grpc_endpoint *ep) {
return gpr_strdup("fake:mock_endpoint");
}
+static int me_get_fd(grpc_endpoint *ep) { return -1; }
+
static grpc_workqueue *me_get_workqueue(grpc_endpoint *ep) { return NULL; }
+static grpc_resource_user *me_get_resource_user(grpc_endpoint *ep) {
+ half *m = (half *)ep;
+ return m->resource_user;
+}
+
static const grpc_endpoint_vtable vtable = {
me_read,
me_write,
@@ -150,23 +164,33 @@ static const grpc_endpoint_vtable vtable = {
me_add_to_pollset_set,
me_shutdown,
me_destroy,
+ me_get_resource_user,
me_get_peer,
+ me_get_fd,
};
-static void half_init(half *m, passthru_endpoint *parent) {
+static void half_init(half *m, passthru_endpoint *parent,
+ grpc_resource_quota *resource_quota,
+ const char *half_name) {
m->base.vtable = &vtable;
m->parent = parent;
- gpr_slice_buffer_init(&m->read_buffer);
+ grpc_slice_buffer_init(&m->read_buffer);
m->on_read = NULL;
+ char *name;
+ gpr_asprintf(&name, "passthru_endpoint_%s_%" PRIxPTR, half_name,
+ (intptr_t)parent);
+ m->resource_user = grpc_resource_user_create(resource_quota, name);
+ gpr_free(name);
}
void grpc_passthru_endpoint_create(grpc_endpoint **client,
- grpc_endpoint **server) {
+ grpc_endpoint **server,
+ grpc_resource_quota *resource_quota) {
passthru_endpoint *m = gpr_malloc(sizeof(*m));
m->halves = 2;
m->shutdown = 0;
- half_init(&m->client, m);
- half_init(&m->server, m);
+ half_init(&m->client, m, resource_quota, "client");
+ half_init(&m->server, m, resource_quota, "server");
gpr_mu_init(&m->mu);
*client = &m->client.base;
*server = &m->server.base;
diff --git a/test/core/util/passthru_endpoint.h b/test/core/util/passthru_endpoint.h
index aa1d3a1763..b81ac5571c 100644
--- a/test/core/util/passthru_endpoint.h
+++ b/test/core/util/passthru_endpoint.h
@@ -37,6 +37,7 @@
#include "src/core/lib/iomgr/endpoint.h"
void grpc_passthru_endpoint_create(grpc_endpoint **client,
- grpc_endpoint **server);
+ grpc_endpoint **server,
+ grpc_resource_quota *resource_quota);
#endif
diff --git a/test/core/util/port_posix.c b/test/core/util/port_posix.c
index 60537b4946..4a42e4c702 100644
--- a/test/core/util/port_posix.c
+++ b/test/core/util/port_posix.c
@@ -39,6 +39,7 @@
#include <errno.h>
#include <netinet/in.h>
+#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
@@ -50,6 +51,8 @@
#include <grpc/support/string_util.h>
#include "src/core/lib/http/httpcli.h"
+#include "src/core/lib/iomgr/resolve_address.h"
+#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/support/env.h"
#include "test/core/util/port_server_client.h"
@@ -115,55 +118,68 @@ static void chose_port(int port) {
chosen_ports[num_chosen_ports - 1] = port;
}
-static int is_port_available(int *port, int is_tcp) {
- const int proto = is_tcp ? IPPROTO_TCP : 0;
- const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto);
- int one = 1;
- struct sockaddr_in addr;
- socklen_t alen = sizeof(addr);
- int actual_port;
-
+static bool is_port_available(int *port, bool is_tcp) {
GPR_ASSERT(*port >= 0);
GPR_ASSERT(*port <= 65535);
- if (fd < 0) {
- gpr_log(GPR_ERROR, "socket() failed: %s", strerror(errno));
- return 0;
- }
- /* Reuseaddr lets us start up a server immediately after it exits */
- if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) {
- gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno));
- close(fd);
- return 0;
- }
+ /* For a port to be considered available, the kernel must support
+ at least one of (IPv6, IPv4), and the port must be available
+ on each supported family. */
+ bool got_socket = false;
+ for (int is_ipv6 = 1; is_ipv6 >= 0; is_ipv6--) {
+ const int fd =
+ socket(is_ipv6 ? AF_INET6 : AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM,
+ is_tcp ? IPPROTO_TCP : 0);
+ if (fd >= 0) {
+ got_socket = true;
+ } else {
+ continue;
+ }
- /* Try binding to port */
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
- addr.sin_port = htons((uint16_t)*port);
- if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno));
- close(fd);
- return 0;
- }
+ /* Reuseaddr lets us start up a server immediately after it exits */
+ const int one = 1;
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) {
+ gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno));
+ close(fd);
+ return false;
+ }
+
+ /* Try binding to port */
+ grpc_resolved_address addr;
+ if (is_ipv6) {
+ grpc_sockaddr_make_wildcard6(*port, &addr); /* [::]:port */
+ } else {
+ grpc_sockaddr_make_wildcard4(*port, &addr); /* 0.0.0.0:port */
+ }
+ if (bind(fd, (struct sockaddr *)addr.addr, (socklen_t)addr.len) < 0) {
+ gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno));
+ close(fd);
+ return false;
+ }
+
+ /* Get the bound port number */
+ if (getsockname(fd, (struct sockaddr *)addr.addr, (socklen_t *)&addr.len) <
+ 0) {
+ gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno));
+ close(fd);
+ return false;
+ }
+ GPR_ASSERT(addr.len <= sizeof(addr.addr));
+ const int actual_port = grpc_sockaddr_get_port(&addr);
+ GPR_ASSERT(actual_port > 0);
+ if (*port == 0) {
+ *port = actual_port;
+ } else {
+ GPR_ASSERT(*port == actual_port);
+ }
- /* Get the bound port number */
- if (getsockname(fd, (struct sockaddr *)&addr, &alen) < 0) {
- gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno));
close(fd);
- return 0;
}
- GPR_ASSERT(alen <= sizeof(addr));
- actual_port = ntohs(addr.sin_port);
- GPR_ASSERT(actual_port > 0);
- if (*port == 0) {
- *port = actual_port;
- } else {
- GPR_ASSERT(*port == actual_port);
+ if (!got_socket) {
+ gpr_log(GPR_ERROR, "socket() failed: %s", strerror(errno));
+ return false;
}
-
- close(fd);
- return 1;
+ return true;
}
int grpc_pick_unused_port(void) {
@@ -180,7 +196,7 @@ int grpc_pick_unused_port(void) {
UDP ports and they are scarcer. */
/* Type of port to first pick in next iteration */
- int is_tcp = 1;
+ bool is_tcp = true;
int trial = 0;
char *env = gpr_getenv("GRPC_TEST_PORT_SERVER");
diff --git a/test/core/util/port_server_client.c b/test/core/util/port_server_client.c
index a5c8c49650..b2342feeb4 100644
--- a/test/core/util/port_server_client.c
+++ b/test/core/util/port_server_client.c
@@ -99,9 +99,12 @@ void grpc_free_port_using_server(char *server, int port) {
req.http.path = path;
grpc_httpcli_context_init(&context);
- grpc_httpcli_get(&exec_ctx, &context, &pr.pops, &req,
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("port_server_client/free");
+ grpc_httpcli_get(&exec_ctx, &context, &pr.pops, resource_quota, &req,
GRPC_TIMEOUT_SECONDS_TO_DEADLINE(10),
grpc_closure_create(freed_port_from_server, &pr), &rsp);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
gpr_mu_lock(pr.mu);
while (!pr.done) {
grpc_pollset_worker *worker = NULL;
@@ -167,10 +170,13 @@ static void got_port_from_server(grpc_exec_ctx *exec_ctx, void *arg,
req.http.path = "/get";
grpc_http_response_destroy(&pr->response);
memset(&pr->response, 0, sizeof(pr->response));
- grpc_httpcli_get(exec_ctx, pr->ctx, &pr->pops, &req,
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("port_server_client/pick_retry");
+ grpc_httpcli_get(exec_ctx, pr->ctx, &pr->pops, resource_quota, &req,
GRPC_TIMEOUT_SECONDS_TO_DEADLINE(10),
grpc_closure_create(got_port_from_server, pr),
&pr->response);
+ grpc_resource_quota_internal_unref(exec_ctx, resource_quota);
return;
}
GPR_ASSERT(response);
@@ -211,9 +217,13 @@ int grpc_pick_port_using_server(char *server) {
req.http.path = "/get";
grpc_httpcli_context_init(&context);
- grpc_httpcli_get(
- &exec_ctx, &context, &pr.pops, &req, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(10),
- grpc_closure_create(got_port_from_server, &pr), &pr.response);
+ grpc_resource_quota *resource_quota =
+ grpc_resource_quota_create("port_server_client/pick");
+ grpc_httpcli_get(&exec_ctx, &context, &pr.pops, resource_quota, &req,
+ GRPC_TIMEOUT_SECONDS_TO_DEADLINE(10),
+ grpc_closure_create(got_port_from_server, &pr),
+ &pr.response);
+ grpc_resource_quota_internal_unref(&exec_ctx, resource_quota);
grpc_exec_ctx_finish(&exec_ctx);
gpr_mu_lock(pr.mu);
while (pr.port == -1) {
diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c
index 6509cc5b68..7bf83a74a1 100644
--- a/test/core/util/reconnect_server.c
+++ b/test/core/util/reconnect_server.c
@@ -73,6 +73,7 @@ static void pretty_print_backoffs(reconnect_server *server) {
static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
grpc_pollset *accepting_pollset,
grpc_tcp_server_acceptor *acceptor) {
+ gpr_free(acceptor);
char *peer;
char *last_colon;
reconnect_server *server = (reconnect_server *)arg;
diff --git a/test/core/util/slice_splitter.c b/test/core/util/slice_splitter.c
index 95b55a6505..177c9892a5 100644
--- a/test/core/util/slice_splitter.c
+++ b/test/core/util/slice_splitter.c
@@ -50,8 +50,8 @@ const char *grpc_slice_split_mode_name(grpc_slice_split_mode mode) {
return "error";
}
-void grpc_split_slices(grpc_slice_split_mode mode, gpr_slice *src_slices,
- size_t src_slice_count, gpr_slice **dst_slices,
+void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice *src_slices,
+ size_t src_slice_count, grpc_slice **dst_slices,
size_t *dst_slice_count) {
size_t i, j;
size_t length;
@@ -59,39 +59,39 @@ void grpc_split_slices(grpc_slice_split_mode mode, gpr_slice *src_slices,
switch (mode) {
case GRPC_SLICE_SPLIT_IDENTITY:
*dst_slice_count = src_slice_count;
- *dst_slices = gpr_malloc(sizeof(gpr_slice) * src_slice_count);
+ *dst_slices = gpr_malloc(sizeof(grpc_slice) * src_slice_count);
for (i = 0; i < src_slice_count; i++) {
(*dst_slices)[i] = src_slices[i];
- gpr_slice_ref((*dst_slices)[i]);
+ grpc_slice_ref((*dst_slices)[i]);
}
break;
case GRPC_SLICE_SPLIT_MERGE_ALL:
*dst_slice_count = 1;
length = 0;
for (i = 0; i < src_slice_count; i++) {
- length += GPR_SLICE_LENGTH(src_slices[i]);
+ length += GRPC_SLICE_LENGTH(src_slices[i]);
}
- *dst_slices = gpr_malloc(sizeof(gpr_slice));
- **dst_slices = gpr_slice_malloc(length);
+ *dst_slices = gpr_malloc(sizeof(grpc_slice));
+ **dst_slices = grpc_slice_malloc(length);
length = 0;
for (i = 0; i < src_slice_count; i++) {
- memcpy(GPR_SLICE_START_PTR(**dst_slices) + length,
- GPR_SLICE_START_PTR(src_slices[i]),
- GPR_SLICE_LENGTH(src_slices[i]));
- length += GPR_SLICE_LENGTH(src_slices[i]);
+ memcpy(GRPC_SLICE_START_PTR(**dst_slices) + length,
+ GRPC_SLICE_START_PTR(src_slices[i]),
+ GRPC_SLICE_LENGTH(src_slices[i]));
+ length += GRPC_SLICE_LENGTH(src_slices[i]);
}
break;
case GRPC_SLICE_SPLIT_ONE_BYTE:
length = 0;
for (i = 0; i < src_slice_count; i++) {
- length += GPR_SLICE_LENGTH(src_slices[i]);
+ length += GRPC_SLICE_LENGTH(src_slices[i]);
}
*dst_slice_count = length;
- *dst_slices = gpr_malloc(sizeof(gpr_slice) * length);
+ *dst_slices = gpr_malloc(sizeof(grpc_slice) * length);
length = 0;
for (i = 0; i < src_slice_count; i++) {
- for (j = 0; j < GPR_SLICE_LENGTH(src_slices[i]); j++) {
- (*dst_slices)[length] = gpr_slice_sub(src_slices[i], j, j + 1);
+ for (j = 0; j < GRPC_SLICE_LENGTH(src_slices[i]); j++) {
+ (*dst_slices)[length] = grpc_slice_sub(src_slices[i], j, j + 1);
length++;
}
}
@@ -100,39 +100,39 @@ void grpc_split_slices(grpc_slice_split_mode mode, gpr_slice *src_slices,
}
void grpc_split_slices_to_buffer(grpc_slice_split_mode mode,
- gpr_slice *src_slices, size_t src_slice_count,
- gpr_slice_buffer *dst) {
- gpr_slice *slices;
+ grpc_slice *src_slices, size_t src_slice_count,
+ grpc_slice_buffer *dst) {
+ grpc_slice *slices;
size_t nslices;
size_t i;
grpc_split_slices(mode, src_slices, src_slice_count, &slices, &nslices);
for (i = 0; i < nslices; i++) {
/* add indexed to avoid re-merging split slices */
- gpr_slice_buffer_add_indexed(dst, slices[i]);
+ grpc_slice_buffer_add_indexed(dst, slices[i]);
}
gpr_free(slices);
}
-void grpc_split_slice_buffer(grpc_slice_split_mode mode, gpr_slice_buffer *src,
- gpr_slice_buffer *dst) {
+void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer *src,
+ grpc_slice_buffer *dst) {
grpc_split_slices_to_buffer(mode, src->slices, src->count, dst);
}
-gpr_slice grpc_slice_merge(gpr_slice *slices, size_t nslices) {
+grpc_slice grpc_slice_merge(grpc_slice *slices, size_t nslices) {
uint8_t *out = NULL;
size_t length = 0;
size_t capacity = 0;
size_t i;
for (i = 0; i < nslices; i++) {
- if (GPR_SLICE_LENGTH(slices[i]) + length > capacity) {
- capacity = GPR_MAX(capacity * 2, GPR_SLICE_LENGTH(slices[i]) + length);
+ if (GRPC_SLICE_LENGTH(slices[i]) + length > capacity) {
+ capacity = GPR_MAX(capacity * 2, GRPC_SLICE_LENGTH(slices[i]) + length);
out = gpr_realloc(out, capacity);
}
- memcpy(out + length, GPR_SLICE_START_PTR(slices[i]),
- GPR_SLICE_LENGTH(slices[i]));
- length += GPR_SLICE_LENGTH(slices[i]);
+ memcpy(out + length, GRPC_SLICE_START_PTR(slices[i]),
+ GRPC_SLICE_LENGTH(slices[i]));
+ length += GRPC_SLICE_LENGTH(slices[i]);
}
- return gpr_slice_new(out, length, gpr_free);
+ return grpc_slice_new(out, length, gpr_free);
}
diff --git a/test/core/util/slice_splitter.h b/test/core/util/slice_splitter.h
index d030c2cb55..61628092b3 100644
--- a/test/core/util/slice_splitter.h
+++ b/test/core/util/slice_splitter.h
@@ -37,8 +37,8 @@
/* utility function to split/merge slices together to help create test
cases */
-#include <grpc/support/slice.h>
-#include <grpc/support/slice_buffer.h>
+#include <grpc/slice.h>
+#include <grpc/slice_buffer.h>
typedef enum {
/* merge all input slices into a single slice */
@@ -51,17 +51,17 @@ typedef enum {
/* allocates *dst_slices; caller must unref all slices in dst_slices then free
it */
-void grpc_split_slices(grpc_slice_split_mode mode, gpr_slice *src_slices,
- size_t src_slice_count, gpr_slice **dst_slices,
+void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice *src_slices,
+ size_t src_slice_count, grpc_slice **dst_slices,
size_t *dst_slice_count);
void grpc_split_slices_to_buffer(grpc_slice_split_mode mode,
- gpr_slice *src_slices, size_t src_slice_count,
- gpr_slice_buffer *dst);
-void grpc_split_slice_buffer(grpc_slice_split_mode mode, gpr_slice_buffer *src,
- gpr_slice_buffer *dst);
+ grpc_slice *src_slices, size_t src_slice_count,
+ grpc_slice_buffer *dst);
+void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer *src,
+ grpc_slice_buffer *dst);
-gpr_slice grpc_slice_merge(gpr_slice *slices, size_t nslices);
+grpc_slice grpc_slice_merge(grpc_slice *slices, size_t nslices);
const char *grpc_slice_split_mode_name(grpc_slice_split_mode mode);
diff --git a/test/core/util/test_config.c b/test/core/util/test_config.c
index 479aeda898..d86ed94637 100644
--- a/test/core/util/test_config.c
+++ b/test/core/util/test_config.c
@@ -33,14 +33,20 @@
#include "test/core/util/test_config.h"
-#include <grpc/support/log.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+
+#include "src/core/lib/support/env.h"
#include "src/core/lib/support/string.h"
double g_fixture_slowdown_factor = 1.0;
+double g_poller_slowdown_factor = 1.0;
#if GPR_GETPID_IN_UNISTD_H
#include <unistd.h>
@@ -274,9 +280,16 @@ static void install_crash_handler() {}
void grpc_test_init(int argc, char **argv) {
install_crash_handler();
- gpr_log(GPR_DEBUG, "test slowdown: machine=%f build=%f total=%f",
+ { /* poll-cv poll strategy runs much more slowly than anything else */
+ char *s = gpr_getenv("GRPC_POLL_STRATEGY");
+ if (s != NULL && 0 == strcmp(s, "poll-cv")) {
+ g_poller_slowdown_factor = 5.0;
+ }
+ gpr_free(s);
+ }
+ gpr_log(GPR_DEBUG, "test slowdown: machine=%f build=%f poll=%f total=%f",
(double)GRPC_TEST_SLOWDOWN_MACHINE_FACTOR,
- (double)GRPC_TEST_SLOWDOWN_BUILD_FACTOR,
+ (double)GRPC_TEST_SLOWDOWN_BUILD_FACTOR, g_poller_slowdown_factor,
(double)GRPC_TEST_SLOWDOWN_FACTOR);
/* seed rng with pid, so we don't end up with the same random numbers as a
concurrently running test binary */
diff --git a/test/core/util/test_config.h b/test/core/util/test_config.h
index 76686f1c51..c13fe86a64 100644
--- a/test/core/util/test_config.h
+++ b/test/core/util/test_config.h
@@ -49,10 +49,11 @@ extern "C" {
#endif
extern double g_fixture_slowdown_factor;
+extern double g_poller_slowdown_factor;
#define GRPC_TEST_SLOWDOWN_FACTOR \
(GRPC_TEST_SLOWDOWN_BUILD_FACTOR * GRPC_TEST_SLOWDOWN_MACHINE_FACTOR * \
- g_fixture_slowdown_factor)
+ g_fixture_slowdown_factor * g_poller_slowdown_factor)
#define GRPC_TIMEOUT_SECONDS_TO_DEADLINE(x) \
gpr_time_add( \
diff --git a/test/core/util/test_tcp_server.c b/test/core/util/test_tcp_server.c
index 9ac97413d4..16df91d968 100644
--- a/test/core/util/test_tcp_server.c
+++ b/test/core/util/test_tcp_server.c
@@ -75,8 +75,8 @@ void test_tcp_server_start(test_tcp_server *server, int port) {
addr->sin_port = htons((uint16_t)port);
memset(&addr->sin_addr, 0, sizeof(addr->sin_addr));
- grpc_error *error = grpc_tcp_server_create(&server->shutdown_complete, NULL,
- &server->tcp_server);
+ grpc_error *error = grpc_tcp_server_create(
+ &exec_ctx, &server->shutdown_complete, NULL, &server->tcp_server);
GPR_ASSERT(error == GRPC_ERROR_NONE);
error =
grpc_tcp_server_add_port(server->tcp_server, &resolved_addr, &port_added);
diff --git a/test/cpp/codegen/compiler_test_golden b/test/cpp/codegen/compiler_test_golden
index 5f0e824655..0b82f2a59f 100644
--- a/test/cpp/codegen/compiler_test_golden
+++ b/test/cpp/codegen/compiler_test_golden
@@ -67,7 +67,7 @@ namespace testing {
// ServiceA detached comment 2
//
// ServiceA leading comment 1
-class ServiceA GRPC_FINAL {
+class ServiceA final {
public:
class StubInterface {
public:
@@ -94,10 +94,10 @@ class ServiceA GRPC_FINAL {
virtual ::grpc::ClientWriterInterface< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) = 0;
virtual ::grpc::ClientAsyncWriterInterface< ::grpc::testing::Request>* AsyncMethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) = 0;
};
- class Stub GRPC_FINAL : public StubInterface {
+ class Stub final : public StubInterface {
public:
Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
- ::grpc::Status MethodA1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response) GRPC_OVERRIDE;
+ ::grpc::Status MethodA1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response) override;
std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>> AsyncMethodA1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>>(AsyncMethodA1Raw(context, request, cq));
}
@@ -110,9 +110,9 @@ class ServiceA GRPC_FINAL {
private:
std::shared_ptr< ::grpc::ChannelInterface> channel_;
- ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>* AsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) GRPC_OVERRIDE;
- ::grpc::ClientWriter< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) GRPC_OVERRIDE;
- ::grpc::ClientAsyncWriter< ::grpc::testing::Request>* AsyncMethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) GRPC_OVERRIDE;
+ ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>* AsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) override;
+ ::grpc::ClientWriter< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) override;
+ ::grpc::ClientAsyncWriter< ::grpc::testing::Request>* AsyncMethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) override;
const ::grpc::RpcMethod rpcmethod_MethodA1_;
const ::grpc::RpcMethod rpcmethod_MethodA2_;
};
@@ -140,11 +140,11 @@ class ServiceA GRPC_FINAL {
WithAsyncMethod_MethodA1() {
::grpc::Service::MarkMethodAsync(0);
}
- ~WithAsyncMethod_MethodA1() GRPC_OVERRIDE {
+ ~WithAsyncMethod_MethodA1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -160,11 +160,11 @@ class ServiceA GRPC_FINAL {
WithAsyncMethod_MethodA2() {
::grpc::Service::MarkMethodAsync(1);
}
- ~WithAsyncMethod_MethodA2() GRPC_OVERRIDE {
+ ~WithAsyncMethod_MethodA2() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodA2(::grpc::ServerContext* context, ::grpc::ServerReader< ::grpc::testing::Request>* reader, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodA2(::grpc::ServerContext* context, ::grpc::ServerReader< ::grpc::testing::Request>* reader, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -181,11 +181,11 @@ class ServiceA GRPC_FINAL {
WithGenericMethod_MethodA1() {
::grpc::Service::MarkMethodGeneric(0);
}
- ~WithGenericMethod_MethodA1() GRPC_OVERRIDE {
+ ~WithGenericMethod_MethodA1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -198,11 +198,11 @@ class ServiceA GRPC_FINAL {
WithGenericMethod_MethodA2() {
::grpc::Service::MarkMethodGeneric(1);
}
- ~WithGenericMethod_MethodA2() GRPC_OVERRIDE {
+ ~WithGenericMethod_MethodA2() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodA2(::grpc::ServerContext* context, ::grpc::ServerReader< ::grpc::testing::Request>* reader, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodA2(::grpc::ServerContext* context, ::grpc::ServerReader< ::grpc::testing::Request>* reader, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -216,11 +216,11 @@ class ServiceA GRPC_FINAL {
::grpc::Service::MarkMethodStreamed(0,
new ::grpc::StreamedUnaryHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithStreamedUnaryMethod_MethodA1<BaseClass>::StreamedMethodA1, this, std::placeholders::_1, std::placeholders::_2)));
}
- ~WithStreamedUnaryMethod_MethodA1() GRPC_OVERRIDE {
+ ~WithStreamedUnaryMethod_MethodA1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable regular version of this method
- ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodA1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -233,7 +233,7 @@ class ServiceA GRPC_FINAL {
};
// ServiceB leading comment 1
-class ServiceB GRPC_FINAL {
+class ServiceB final {
public:
class StubInterface {
public:
@@ -247,17 +247,17 @@ class ServiceB GRPC_FINAL {
private:
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* AsyncMethodB1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
};
- class Stub GRPC_FINAL : public StubInterface {
+ class Stub final : public StubInterface {
public:
Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
- ::grpc::Status MethodB1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response) GRPC_OVERRIDE;
+ ::grpc::Status MethodB1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response) override;
std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>> AsyncMethodB1(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>>(AsyncMethodB1Raw(context, request, cq));
}
private:
std::shared_ptr< ::grpc::ChannelInterface> channel_;
- ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>* AsyncMethodB1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) GRPC_OVERRIDE;
+ ::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>* AsyncMethodB1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) override;
const ::grpc::RpcMethod rpcmethod_MethodB1_;
};
static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
@@ -278,11 +278,11 @@ class ServiceB GRPC_FINAL {
WithAsyncMethod_MethodB1() {
::grpc::Service::MarkMethodAsync(0);
}
- ~WithAsyncMethod_MethodB1() GRPC_OVERRIDE {
+ ~WithAsyncMethod_MethodB1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -299,11 +299,11 @@ class ServiceB GRPC_FINAL {
WithGenericMethod_MethodB1() {
::grpc::Service::MarkMethodGeneric(0);
}
- ~WithGenericMethod_MethodB1() GRPC_OVERRIDE {
+ ~WithGenericMethod_MethodB1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable synchronous version of this method
- ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
@@ -317,11 +317,11 @@ class ServiceB GRPC_FINAL {
::grpc::Service::MarkMethodStreamed(0,
new ::grpc::StreamedUnaryHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithStreamedUnaryMethod_MethodB1<BaseClass>::StreamedMethodB1, this, std::placeholders::_1, std::placeholders::_2)));
}
- ~WithStreamedUnaryMethod_MethodB1() GRPC_OVERRIDE {
+ ~WithStreamedUnaryMethod_MethodB1() override {
BaseClassMustBeDerivedFromService(this);
}
// disable regular version of this method
- ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) GRPC_FINAL GRPC_OVERRIDE {
+ ::grpc::Status MethodB1(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::testing::Response* response) final override {
abort();
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
diff --git a/test/cpp/common/auth_property_iterator_test.cc b/test/cpp/common/auth_property_iterator_test.cc
index 66225ff335..16bebcab74 100644
--- a/test/cpp/common/auth_property_iterator_test.cc
+++ b/test/cpp/common/auth_property_iterator_test.cc
@@ -56,7 +56,7 @@ class TestAuthPropertyIterator : public AuthPropertyIterator {
class AuthPropertyIteratorTest : public ::testing::Test {
protected:
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
ctx_ = grpc_auth_context_create(NULL);
grpc_auth_context_add_cstring_property(ctx_, "name", "chapi");
grpc_auth_context_add_cstring_property(ctx_, "name", "chapo");
@@ -64,7 +64,7 @@ class AuthPropertyIteratorTest : public ::testing::Test {
EXPECT_EQ(1,
grpc_auth_context_set_peer_identity_property_name(ctx_, "name"));
}
- void TearDown() GRPC_OVERRIDE { grpc_auth_context_release(ctx_); }
+ void TearDown() override { grpc_auth_context_release(ctx_); }
grpc_auth_context* ctx_;
};
diff --git a/test/cpp/common/channel_arguments_test.cc b/test/cpp/common/channel_arguments_test.cc
index 1443eb2f68..60d3215265 100644
--- a/test/cpp/common/channel_arguments_test.cc
+++ b/test/cpp/common/channel_arguments_test.cc
@@ -33,12 +33,58 @@
#include <grpc++/support/channel_arguments.h>
+#include <grpc++/grpc++.h>
#include <grpc/grpc.h>
+#include <grpc/support/useful.h>
#include <gtest/gtest.h>
+#include "src/core/lib/iomgr/socket_mutator.h"
namespace grpc {
namespace testing {
+namespace {
+
+// A simple grpc_socket_mutator to be used to test SetSocketMutator
+class TestSocketMutator : public grpc_socket_mutator {
+ public:
+ TestSocketMutator();
+
+ bool MutateFd(int fd) {
+ // Do nothing on the fd
+ return true;
+ }
+};
+
+//
+// C API for TestSocketMutator
+//
+
+bool test_mutator_mutate_fd(int fd, grpc_socket_mutator* mutator) {
+ TestSocketMutator* tsm = (TestSocketMutator*)mutator;
+ return tsm->MutateFd(fd);
+}
+
+int test_mutator_compare(grpc_socket_mutator* a, grpc_socket_mutator* b) {
+ return GPR_ICMP(a, b);
+}
+
+void test_mutator_destroy(grpc_socket_mutator* mutator) {
+ TestSocketMutator* tsm = (TestSocketMutator*)mutator;
+ delete tsm;
+}
+
+grpc_socket_mutator_vtable test_mutator_vtable = {
+ test_mutator_mutate_fd, test_mutator_compare, test_mutator_destroy};
+
+//
+// TestSocketMutator implementation
+//
+
+TestSocketMutator::TestSocketMutator() {
+ grpc_socket_mutator_init(this, &test_mutator_vtable);
+}
+}
+
class ChannelArgumentsTest : public ::testing::Test {
protected:
ChannelArgumentsTest()
@@ -53,7 +99,7 @@ class ChannelArgumentsTest : public ::testing::Test {
grpc::string GetDefaultUserAgentPrefix() {
std::ostringstream user_agent_prefix;
- user_agent_prefix << "grpc-c++/" << grpc_version_string();
+ user_agent_prefix << "grpc-c++/" << Version();
return user_agent_prefix.str();
}
@@ -165,6 +211,26 @@ TEST_F(ChannelArgumentsTest, SetPointer) {
EXPECT_TRUE(HasArg(arg0));
}
+TEST_F(ChannelArgumentsTest, SetSocketMutator) {
+ VerifyDefaultChannelArgs();
+ grpc_arg arg0, arg1;
+ TestSocketMutator* mutator0 = new TestSocketMutator();
+ TestSocketMutator* mutator1 = new TestSocketMutator();
+ arg0 = grpc_socket_mutator_to_arg(mutator0);
+ arg1 = grpc_socket_mutator_to_arg(mutator1);
+
+ channel_args_.SetSocketMutator(mutator0);
+ EXPECT_TRUE(HasArg(arg0));
+
+ channel_args_.SetSocketMutator(mutator1);
+ EXPECT_TRUE(HasArg(arg1));
+ // arg0 is replaced by arg1
+ EXPECT_FALSE(HasArg(arg0));
+
+ // arg0 is destroyed by grpc_socket_mutator_to_arg(mutator1)
+ arg1.value.pointer.vtable->destroy(arg1.value.pointer.p);
+}
+
TEST_F(ChannelArgumentsTest, SetUserAgentPrefix) {
VerifyDefaultChannelArgs();
grpc::string prefix("prefix");
diff --git a/test/cpp/common/channel_filter_test.cc b/test/cpp/common/channel_filter_test.cc
new file mode 100644
index 0000000000..32246a4b76
--- /dev/null
+++ b/test/cpp/common/channel_filter_test.cc
@@ -0,0 +1,80 @@
+//
+// Copyright 2016, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "src/cpp/common/channel_filter.h"
+
+#include <limits.h>
+
+#include <grpc/grpc.h>
+#include <gtest/gtest.h>
+
+namespace grpc {
+namespace testing {
+
+class MyChannelData : public ChannelData {
+ public:
+ MyChannelData() {}
+
+ grpc_error* Init(grpc_exec_ctx* exec_ctx,
+ grpc_channel_element_args* args) override {
+ (void)args->channel_args; // Make sure field is available.
+ return GRPC_ERROR_NONE;
+ }
+};
+
+class MyCallData : public CallData {
+ public:
+ MyCallData() {}
+
+ grpc_error* Init(grpc_exec_ctx* exec_ctx, ChannelData* channel_data,
+ grpc_call_element_args* args) override {
+ (void)args->path; // Make sure field is available.
+ return GRPC_ERROR_NONE;
+ }
+};
+
+// This test ensures that when we make changes to the filter API in
+// C-core, we don't accidentally break the C++ filter API.
+TEST(ChannelFilterTest, RegisterChannelFilter) {
+ grpc::RegisterChannelFilter<MyChannelData, MyCallData>(
+ "myfilter", GRPC_CLIENT_CHANNEL, INT_MAX, nullptr);
+}
+
+// TODO(roth): When we have time, add tests for all methods of the
+// filter API.
+
+} // namespace testing
+} // namespace grpc
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc
index 823f0bd035..8e385d100c 100644
--- a/test/cpp/end2end/async_end2end_test.cc
+++ b/test/cpp/end2end/async_end2end_test.cc
@@ -211,10 +211,10 @@ bool plugin_has_sync_methods(std::unique_ptr<ServerBuilderPlugin>& plugin) {
// that needs to be tested here.
class ServerBuilderSyncPluginDisabler : public ::grpc::ServerBuilderOption {
public:
- void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
+ void UpdateArguments(ChannelArguments* arg) override {}
- void UpdatePlugins(std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins)
- GRPC_OVERRIDE {
+ void UpdatePlugins(
+ std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override {
plugins->erase(std::remove_if(plugins->begin(), plugins->end(),
plugin_has_sync_methods),
plugins->end());
@@ -246,7 +246,7 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
protected:
AsyncEnd2endTest() { GetParam().Log(); }
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
poll_overrider_.reset(new PollingOverrider(!GetParam().disable_blocking));
port_ = grpc_pick_unused_port_or_die();
@@ -269,7 +269,7 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
gpr_tls_set(&g_is_async_end2end_test, 1);
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
server_->Shutdown();
void* ignored_tag;
bool ignored_ok;
@@ -352,15 +352,13 @@ void ServerWait(Server* server, int* notify) {
}
TEST_P(AsyncEnd2endTest, WaitAndShutdownTest) {
int notify = 0;
- std::thread* wait_thread =
- new std::thread(&ServerWait, server_.get(), &notify);
+ std::thread wait_thread(&ServerWait, server_.get(), &notify);
ResetStub();
SendRpc(1);
EXPECT_EQ(0, notify);
server_->Shutdown();
- wait_thread->join();
+ wait_thread.join();
EXPECT_EQ(1, notify);
- delete wait_thread;
}
TEST_P(AsyncEnd2endTest, ShutdownThenWait) {
@@ -991,7 +989,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
expected_server_cq_result = false;
}
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
auto verif = Verifier(GetParam().disable_blocking);
@@ -1027,7 +1025,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
}
}
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
}
@@ -1112,7 +1110,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
expected_cq_result = false;
}
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
auto verif = Verifier(GetParam().disable_blocking);
@@ -1150,7 +1148,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
}
}
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
}
@@ -1252,7 +1250,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
expected_cq_result = false;
}
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
auto verif = Verifier(GetParam().disable_blocking);
@@ -1332,7 +1330,7 @@ class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 8);
}
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
}
diff --git a/test/cpp/end2end/client_crash_test_server.cc b/test/cpp/end2end/client_crash_test_server.cc
index 6e1457407c..0e0a105989 100644
--- a/test/cpp/end2end/client_crash_test_server.cc
+++ b/test/cpp/end2end/client_crash_test_server.cc
@@ -58,11 +58,10 @@ using namespace gflags;
namespace grpc {
namespace testing {
-class ServiceImpl GRPC_FINAL
- : public ::grpc::testing::EchoTestService::Service {
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE {
+class ServiceImpl final : public ::grpc::testing::EchoTestService::Service {
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
EchoRequest request;
EchoResponse response;
while (stream->Read(&request)) {
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index 7af0fb997e..9bb892c694 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -37,6 +37,7 @@
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
+#include <grpc++/resource_quota.h>
#include <grpc++/security/auth_metadata_processor.h>
#include <grpc++/security/credentials.h>
#include <grpc++/security/server_credentials.h>
@@ -91,12 +92,12 @@ class TestMetadataCredentialsPlugin : public MetadataCredentialsPlugin {
is_blocking_(is_blocking),
is_successful_(is_successful) {}
- bool IsBlocking() const GRPC_OVERRIDE { return is_blocking_; }
+ bool IsBlocking() const override { return is_blocking_; }
- Status GetMetadata(grpc::string_ref service_url, grpc::string_ref method_name,
- const grpc::AuthContext& channel_auth_context,
- std::multimap<grpc::string, grpc::string>* metadata)
- GRPC_OVERRIDE {
+ Status GetMetadata(
+ grpc::string_ref service_url, grpc::string_ref method_name,
+ const grpc::AuthContext& channel_auth_context,
+ std::multimap<grpc::string, grpc::string>* metadata) override {
EXPECT_GT(service_url.length(), 0UL);
EXPECT_GT(method_name.length(), 0UL);
EXPECT_TRUE(channel_auth_context.IsPeerAuthenticated());
@@ -144,11 +145,11 @@ class TestAuthMetadataProcessor : public AuthMetadataProcessor {
}
// Interface implementation
- bool IsBlocking() const GRPC_OVERRIDE { return is_blocking_; }
+ bool IsBlocking() const override { return is_blocking_; }
Status Process(const InputMetadata& auth_metadata, AuthContext* context,
OutputMetadata* consumed_auth_metadata,
- OutputMetadata* response_metadata) GRPC_OVERRIDE {
+ OutputMetadata* response_metadata) override {
EXPECT_TRUE(consumed_auth_metadata != nullptr);
EXPECT_TRUE(context != nullptr);
EXPECT_TRUE(response_metadata != nullptr);
@@ -184,7 +185,7 @@ class Proxy : public ::grpc::testing::EchoTestService::Service {
: stub_(grpc::testing::EchoTestService::NewStub(channel)) {}
Status Echo(ServerContext* server_context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
std::unique_ptr<ClientContext> client_context =
ClientContext::FromServerContext(*server_context);
return stub_->Echo(client_context.get(), *request, response);
@@ -198,7 +199,7 @@ class TestServiceImplDupPkg
: public ::grpc::testing::duplicate::EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message("no package");
return Status::OK;
}
@@ -228,7 +229,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
GetParam().Log();
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
if (is_server_started_) {
server_->Shutdown();
if (proxy_server_) proxy_server_->Shutdown();
@@ -240,6 +241,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
server_address_ << "127.0.0.1:" << port;
// Setup server
ServerBuilder builder;
+ ConfigureServerBuilder(&builder);
auto server_creds = GetServerCredentials(GetParam().credentials_type);
if (GetParam().credentials_type != kInsecureCredentialsType) {
server_creds->SetAuthMetadataProcessor(processor);
@@ -247,13 +249,21 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
builder.AddListeningPort(server_address_.str(), server_creds);
builder.RegisterService(&service_);
builder.RegisterService("foo.test.youtube.com", &special_service_);
- builder.SetMaxMessageSize(
- kMaxMessageSize_); // For testing max message size.
builder.RegisterService(&dup_pkg_service_);
+
+ builder.SetSyncServerOption(ServerBuilder::SyncServerOption::NUM_CQS, 4);
+ builder.SetSyncServerOption(
+ ServerBuilder::SyncServerOption::CQ_TIMEOUT_MSEC, 10);
+
server_ = builder.BuildAndStart();
is_server_started_ = true;
}
+ virtual void ConfigureServerBuilder(ServerBuilder* builder) {
+ builder->SetMaxMessageSize(
+ kMaxMessageSize_); // For testing max message size.
+ }
+
void ResetChannel() {
if (!is_server_started_) {
StartServer(std::shared_ptr<AuthMetadataProcessor>());
@@ -279,6 +289,11 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
ServerBuilder builder;
builder.AddListeningPort(proxyaddr.str(), InsecureServerCredentials());
builder.RegisterService(proxy_service_.get());
+
+ builder.SetSyncServerOption(ServerBuilder::SyncServerOption::NUM_CQS, 4);
+ builder.SetSyncServerOption(
+ ServerBuilder::SyncServerOption::CQ_TIMEOUT_MSEC, 10);
+
proxy_server_ = builder.BuildAndStart();
channel_ = CreateChannel(proxyaddr.str(), InsecureChannelCredentials());
@@ -641,25 +656,23 @@ TEST_P(End2endTest, SimpleRpcWithCustomeUserAgentPrefix) {
TEST_P(End2endTest, MultipleRpcsWithVariedBinaryMetadataValue) {
ResetStub();
- std::vector<std::thread*> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
- threads.push_back(new std::thread(SendRpc, stub_.get(), 10, true));
+ threads.emplace_back(SendRpc, stub_.get(), 10, true);
}
for (int i = 0; i < 10; ++i) {
- threads[i]->join();
- delete threads[i];
+ threads[i].join();
}
}
TEST_P(End2endTest, MultipleRpcs) {
ResetStub();
- std::vector<std::thread*> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
- threads.push_back(new std::thread(SendRpc, stub_.get(), 10, false));
+ threads.emplace_back(SendRpc, stub_.get(), 10, false);
}
for (int i = 0; i < 10; ++i) {
- threads[i]->join();
- delete threads[i];
+ threads[i].join();
}
}
@@ -1043,13 +1056,12 @@ TEST_P(ProxyEnd2endTest, SimpleRpcWithEmptyMessages) {
TEST_P(ProxyEnd2endTest, MultipleRpcs) {
ResetStub();
- std::vector<std::thread*> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
- threads.push_back(new std::thread(SendRpc, stub_.get(), 10, false));
+ threads.emplace_back(SendRpc, stub_.get(), 10, false);
}
for (int i = 0; i < 10; ++i) {
- threads[i]->join();
- delete threads[i];
+ threads[i].join();
}
}
@@ -1476,6 +1488,32 @@ TEST_P(SecureEnd2endTest, ClientAuthContext) {
}
}
+class ResourceQuotaEnd2endTest : public End2endTest {
+ public:
+ ResourceQuotaEnd2endTest()
+ : server_resource_quota_("server_resource_quota") {}
+
+ virtual void ConfigureServerBuilder(ServerBuilder* builder) override {
+ builder->SetResourceQuota(server_resource_quota_);
+ }
+
+ private:
+ ResourceQuota server_resource_quota_;
+};
+
+TEST_P(ResourceQuotaEnd2endTest, SimpleRequest) {
+ ResetStub();
+
+ EchoRequest request;
+ EchoResponse response;
+ request.set_message("Hello");
+
+ ClientContext context;
+ Status s = stub_->Echo(&context, request, &response);
+ EXPECT_EQ(response.message(), request.message());
+ EXPECT_TRUE(s.ok());
+}
+
std::vector<TestScenario> CreateTestScenarios(bool use_proxy,
bool test_insecure,
bool test_secure) {
@@ -1513,6 +1551,10 @@ INSTANTIATE_TEST_CASE_P(SecureEnd2end, SecureEnd2endTest,
::testing::ValuesIn(CreateTestScenarios(false, false,
true)));
+INSTANTIATE_TEST_CASE_P(ResourceQuotaEnd2end, ResourceQuotaEnd2endTest,
+ ::testing::ValuesIn(CreateTestScenarios(false, true,
+ true)));
+
} // namespace
} // namespace testing
} // namespace grpc
diff --git a/test/cpp/end2end/filter_end2end_test.cc b/test/cpp/end2end/filter_end2end_test.cc
index 853720fd0d..bd384f68b4 100644
--- a/test/cpp/end2end/filter_end2end_test.cc
+++ b/test/cpp/end2end/filter_end2end_test.cc
@@ -78,35 +78,35 @@ namespace {
int global_num_connections = 0;
int global_num_calls = 0;
-mutex global_mu;
+std::mutex global_mu;
void IncrementConnectionCounter() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
++global_num_connections;
}
void ResetConnectionCounter() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
global_num_connections = 0;
}
int GetConnectionCounterValue() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
return global_num_connections;
}
void IncrementCallCounter() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
++global_num_calls;
}
void ResetCallCounter() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
global_num_calls = 0;
}
int GetCallCounterValue() {
- unique_lock<mutex> lock(global_mu);
+ std::unique_lock<std::mutex> lock(global_mu);
return global_num_calls;
}
@@ -114,20 +114,17 @@ int GetCallCounterValue() {
class ChannelDataImpl : public ChannelData {
public:
- ChannelDataImpl(const grpc_channel_args& args, const char* peer)
- : ChannelData(args, peer) {
+ grpc_error* Init(grpc_exec_ctx* exec_ctx, grpc_channel_element_args* args) {
IncrementConnectionCounter();
+ return GRPC_ERROR_NONE;
}
};
class CallDataImpl : public CallData {
public:
- explicit CallDataImpl(const ChannelDataImpl& channel_data)
- : CallData(channel_data) {}
-
void StartTransportStreamOp(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
- TransportStreamOp* op) GRPC_OVERRIDE {
- // Incrementing the counter could be done from the ctor, but we want
+ TransportStreamOp* op) override {
+ // Incrementing the counter could be done from Init(), but we want
// to test that the individual methods are actually called correctly.
if (op->recv_initial_metadata() != nullptr) IncrementCallCounter();
grpc_call_next_op(exec_ctx, elem, op->op());
@@ -138,7 +135,7 @@ class FilterEnd2endTest : public ::testing::Test {
protected:
FilterEnd2endTest() : server_host_("localhost") {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
int port = grpc_pick_unused_port_or_die();
server_address_ << server_host_ << ":" << port;
// Setup server
@@ -150,7 +147,7 @@ class FilterEnd2endTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
server_->Shutdown();
void* ignored_tag;
bool ignored_ok;
diff --git a/test/cpp/end2end/generic_end2end_test.cc b/test/cpp/end2end/generic_end2end_test.cc
index 57efa5fa17..25c221bb2b 100644
--- a/test/cpp/end2end/generic_end2end_test.cc
+++ b/test/cpp/end2end/generic_end2end_test.cc
@@ -75,7 +75,7 @@ class GenericEnd2endTest : public ::testing::Test {
protected:
GenericEnd2endTest() : server_host_("localhost") {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
int port = grpc_pick_unused_port_or_die();
server_address_ << server_host_ << ":" << port;
// Setup server
@@ -91,7 +91,7 @@ class GenericEnd2endTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
server_->Shutdown();
void* ignored_tag;
bool ignored_ok;
diff --git a/test/cpp/end2end/hybrid_end2end_test.cc b/test/cpp/end2end/hybrid_end2end_test.cc
index 76a5732f33..a4ba76fed1 100644
--- a/test/cpp/end2end/hybrid_end2end_test.cc
+++ b/test/cpp/end2end/hybrid_end2end_test.cc
@@ -188,7 +188,7 @@ class TestServiceImplDupPkg
: public ::grpc::testing::duplicate::EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message(request->message() + "_dup");
return Status::OK;
}
@@ -230,7 +230,7 @@ class HybridEnd2endTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
if (server_) {
server_->Shutdown();
}
@@ -449,9 +449,9 @@ class StreamedUnaryDupPkg
: public duplicate::EchoTestService::WithStreamedUnaryMethod_Echo<
TestServiceImplDupPkg> {
public:
- Status StreamedEcho(ServerContext* context,
- ServerUnaryStreamer<EchoRequest, EchoResponse>* stream)
- GRPC_OVERRIDE {
+ Status StreamedEcho(
+ ServerContext* context,
+ ServerUnaryStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
@@ -487,9 +487,9 @@ TEST_F(HybridEnd2endTest,
class FullyStreamedUnaryDupPkg
: public duplicate::EchoTestService::StreamedUnaryService {
public:
- Status StreamedEcho(ServerContext* context,
- ServerUnaryStreamer<EchoRequest, EchoResponse>* stream)
- GRPC_OVERRIDE {
+ Status StreamedEcho(
+ ServerContext* context,
+ ServerUnaryStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
@@ -528,7 +528,7 @@ class SplitResponseStreamDupPkg
public:
Status StreamedResponseStream(
ServerContext* context,
- ServerSplitStreamer<EchoRequest, EchoResponse>* stream) GRPC_OVERRIDE {
+ ServerSplitStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
@@ -568,7 +568,7 @@ class FullySplitStreamedDupPkg
public:
Status StreamedResponseStream(
ServerContext* context,
- ServerSplitStreamer<EchoRequest, EchoResponse>* stream) GRPC_OVERRIDE {
+ ServerSplitStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
@@ -605,9 +605,9 @@ TEST_F(HybridEnd2endTest,
// Add a second service that is fully server streamed
class FullyStreamedDupPkg : public duplicate::EchoTestService::StreamedService {
public:
- Status StreamedEcho(ServerContext* context,
- ServerUnaryStreamer<EchoRequest, EchoResponse>* stream)
- GRPC_OVERRIDE {
+ Status StreamedEcho(
+ ServerContext* context,
+ ServerUnaryStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
@@ -620,7 +620,7 @@ class FullyStreamedDupPkg : public duplicate::EchoTestService::StreamedService {
}
Status StreamedResponseStream(
ServerContext* context,
- ServerSplitStreamer<EchoRequest, EchoResponse>* stream) GRPC_OVERRIDE {
+ ServerSplitStreamer<EchoRequest, EchoResponse>* stream) override {
EchoRequest req;
EchoResponse resp;
uint32_t next_msg_sz;
diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc
index 0da5861b67..d6664da5a0 100644
--- a/test/cpp/end2end/mock_test.cc
+++ b/test/cpp/end2end/mock_test.cc
@@ -61,46 +61,44 @@ namespace testing {
namespace {
template <class W, class R>
-class MockClientReaderWriter GRPC_FINAL
- : public ClientReaderWriterInterface<W, R> {
+class MockClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
public:
- void WaitForInitialMetadata() GRPC_OVERRIDE {}
- bool NextMessageSize(uint32_t* sz) GRPC_OVERRIDE {
+ void WaitForInitialMetadata() override {}
+ bool NextMessageSize(uint32_t* sz) override {
*sz = UINT_MAX;
return true;
}
- bool Read(R* msg) GRPC_OVERRIDE { return true; }
- bool Write(const W& msg) GRPC_OVERRIDE { return true; }
- bool WritesDone() GRPC_OVERRIDE { return true; }
- Status Finish() GRPC_OVERRIDE { return Status::OK; }
+ bool Read(R* msg) override { return true; }
+ bool Write(const W& msg) override { return true; }
+ bool WritesDone() override { return true; }
+ Status Finish() override { return Status::OK; }
};
template <>
-class MockClientReaderWriter<EchoRequest, EchoResponse> GRPC_FINAL
+class MockClientReaderWriter<EchoRequest, EchoResponse> final
: public ClientReaderWriterInterface<EchoRequest, EchoResponse> {
public:
MockClientReaderWriter() : writes_done_(false) {}
- void WaitForInitialMetadata() GRPC_OVERRIDE {}
- bool NextMessageSize(uint32_t* sz) GRPC_OVERRIDE {
+ void WaitForInitialMetadata() override {}
+ bool NextMessageSize(uint32_t* sz) override {
*sz = UINT_MAX;
return true;
}
- bool Read(EchoResponse* msg) GRPC_OVERRIDE {
+ bool Read(EchoResponse* msg) override {
if (writes_done_) return false;
msg->set_message(last_message_);
return true;
}
- bool Write(const EchoRequest& msg,
- const WriteOptions& options) GRPC_OVERRIDE {
+ bool Write(const EchoRequest& msg, const WriteOptions& options) override {
gpr_log(GPR_INFO, "mock recv msg %s", msg.message().c_str());
last_message_ = msg.message();
return true;
}
- bool WritesDone() GRPC_OVERRIDE {
+ bool WritesDone() override {
writes_done_ = true;
return true;
}
- Status Finish() GRPC_OVERRIDE { return Status::OK; }
+ Status Finish() override { return Status::OK; }
private:
bool writes_done_;
@@ -113,51 +111,51 @@ class MockStub : public EchoTestService::StubInterface {
MockStub() {}
~MockStub() {}
Status Echo(ClientContext* context, const EchoRequest& request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message(request.message());
return Status::OK;
}
Status Unimplemented(ClientContext* context, const EchoRequest& request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
return Status::OK;
}
private:
ClientAsyncResponseReaderInterface<EchoResponse>* AsyncEchoRaw(
ClientContext* context, const EchoRequest& request,
- CompletionQueue* cq) GRPC_OVERRIDE {
+ CompletionQueue* cq) override {
return nullptr;
}
ClientWriterInterface<EchoRequest>* RequestStreamRaw(
- ClientContext* context, EchoResponse* response) GRPC_OVERRIDE {
+ ClientContext* context, EchoResponse* response) override {
return nullptr;
}
ClientAsyncWriterInterface<EchoRequest>* AsyncRequestStreamRaw(
ClientContext* context, EchoResponse* response, CompletionQueue* cq,
- void* tag) GRPC_OVERRIDE {
+ void* tag) override {
return nullptr;
}
ClientReaderInterface<EchoResponse>* ResponseStreamRaw(
- ClientContext* context, const EchoRequest& request) GRPC_OVERRIDE {
+ ClientContext* context, const EchoRequest& request) override {
return nullptr;
}
ClientAsyncReaderInterface<EchoResponse>* AsyncResponseStreamRaw(
ClientContext* context, const EchoRequest& request, CompletionQueue* cq,
- void* tag) GRPC_OVERRIDE {
+ void* tag) override {
return nullptr;
}
ClientReaderWriterInterface<EchoRequest, EchoResponse>* BidiStreamRaw(
- ClientContext* context) GRPC_OVERRIDE {
+ ClientContext* context) override {
return new MockClientReaderWriter<EchoRequest, EchoResponse>();
}
ClientAsyncReaderWriterInterface<EchoRequest, EchoResponse>*
AsyncBidiStreamRaw(ClientContext* context, CompletionQueue* cq,
- void* tag) GRPC_OVERRIDE {
+ void* tag) override {
return nullptr;
}
ClientAsyncResponseReaderInterface<EchoResponse>* AsyncUnimplementedRaw(
ClientContext* context, const EchoRequest& request,
- CompletionQueue* cq) GRPC_OVERRIDE {
+ CompletionQueue* cq) override {
return nullptr;
}
};
@@ -216,14 +214,14 @@ class FakeClient {
class TestServiceImpl : public EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message(request->message());
return Status::OK;
}
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE {
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
EchoRequest request;
EchoResponse response;
while (stream->Read(&request)) {
@@ -239,7 +237,7 @@ class MockTest : public ::testing::Test {
protected:
MockTest() {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
int port = grpc_pick_unused_port_or_die();
server_address_ << "localhost:" << port;
// Setup server
@@ -250,7 +248,7 @@ class MockTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE { server_->Shutdown(); }
+ void TearDown() override { server_->Shutdown(); }
void ResetStub() {
std::shared_ptr<Channel> channel =
diff --git a/test/cpp/end2end/proto_server_reflection_test.cc b/test/cpp/end2end/proto_server_reflection_test.cc
index 75efd01f06..8b9688d200 100644
--- a/test/cpp/end2end/proto_server_reflection_test.cc
+++ b/test/cpp/end2end/proto_server_reflection_test.cc
@@ -56,7 +56,7 @@ class ProtoServerReflectionTest : public ::testing::Test {
public:
ProtoServerReflectionTest() {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
port_ = grpc_pick_unused_port_or_die();
ref_desc_pool_ = protobuf::DescriptorPool::generated_pool();
diff --git a/test/cpp/end2end/round_robin_end2end_test.cc b/test/cpp/end2end/round_robin_end2end_test.cc
new file mode 100644
index 0000000000..cc340b96b3
--- /dev/null
+++ b/test/cpp/end2end/round_robin_end2end_test.cc
@@ -0,0 +1,216 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <memory>
+#include <mutex>
+#include <thread>
+
+#include <grpc++/channel.h>
+#include <grpc++/client_context.h>
+#include <grpc++/create_channel.h>
+#include <grpc++/server.h>
+#include <grpc++/server_builder.h>
+#include <grpc/grpc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/thd.h>
+#include <grpc/support/time.h>
+#include <gtest/gtest.h>
+
+#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "test/core/util/port.h"
+#include "test/core/util/test_config.h"
+#include "test/cpp/end2end/test_service_impl.h"
+
+using grpc::testing::EchoRequest;
+using grpc::testing::EchoResponse;
+using std::chrono::system_clock;
+
+namespace grpc {
+namespace testing {
+namespace {
+
+// Subclass of TestServiceImpl that increments a request counter for
+// every call to the Echo RPC.
+class MyTestServiceImpl : public TestServiceImpl {
+ public:
+ MyTestServiceImpl() : request_count_(0) {}
+
+ Status Echo(ServerContext* context, const EchoRequest* request,
+ EchoResponse* response) override {
+ {
+ std::unique_lock<std::mutex> lock(mu_);
+ ++request_count_;
+ }
+ return TestServiceImpl::Echo(context, request, response);
+ }
+
+ int request_count() {
+ std::unique_lock<std::mutex> lock(mu_);
+ return request_count_;
+ }
+
+ private:
+ std::mutex mu_;
+ int request_count_;
+};
+
+class RoundRobinEnd2endTest : public ::testing::Test {
+ protected:
+ RoundRobinEnd2endTest() : server_host_("localhost") {}
+
+ void StartServers(int num_servers) {
+ for (int i = 0; i < num_servers; ++i) {
+ servers_.emplace_back(new ServerData(server_host_));
+ }
+ }
+
+ void TearDown() override {
+ for (size_t i = 0; i < servers_.size(); ++i) {
+ servers_[i]->Shutdown();
+ }
+ }
+
+ void ResetStub(bool round_robin) {
+ ChannelArguments args;
+ if (round_robin) args.SetLoadBalancingPolicyName("round_robin");
+ std::ostringstream uri;
+ uri << "ipv4:///";
+ for (size_t i = 0; i < servers_.size() - 1; ++i) {
+ uri << "127.0.0.1:" << servers_[i]->port_ << ",";
+ }
+ uri << "127.0.0.1:" << servers_[servers_.size() - 1]->port_;
+ channel_ =
+ CreateCustomChannel(uri.str(), InsecureChannelCredentials(), args);
+ stub_ = grpc::testing::EchoTestService::NewStub(channel_);
+ }
+
+ void SendRpc(int num_rpcs) {
+ EchoRequest request;
+ EchoResponse response;
+ request.set_message("Live long and prosper.");
+ for (int i = 0; i < num_rpcs; i++) {
+ ClientContext context;
+ Status status = stub_->Echo(&context, request, &response);
+ EXPECT_TRUE(status.ok());
+ EXPECT_EQ(response.message(), request.message());
+ }
+ }
+
+ struct ServerData {
+ int port_;
+ std::unique_ptr<Server> server_;
+ MyTestServiceImpl service_;
+ std::unique_ptr<std::thread> thread_;
+
+ explicit ServerData(const grpc::string& server_host) {
+ port_ = grpc_pick_unused_port_or_die();
+ gpr_log(GPR_INFO, "starting server on port %d", port_);
+ std::mutex mu;
+ std::condition_variable cond;
+ thread_.reset(new std::thread(
+ std::bind(&ServerData::Start, this, server_host, &mu, &cond)));
+ std::unique_lock<std::mutex> lock(mu);
+ cond.wait(lock);
+ gpr_log(GPR_INFO, "server startup complete");
+ }
+
+ void Start(const grpc::string& server_host, std::mutex* mu,
+ std::condition_variable* cond) {
+ std::ostringstream server_address;
+ server_address << server_host << ":" << port_;
+ ServerBuilder builder;
+ builder.AddListeningPort(server_address.str(),
+ InsecureServerCredentials());
+ builder.RegisterService(&service_);
+ server_ = builder.BuildAndStart();
+ std::lock_guard<std::mutex> lock(*mu);
+ cond->notify_one();
+ }
+
+ void Shutdown() {
+ server_->Shutdown();
+ thread_->join();
+ }
+ };
+
+ const grpc::string server_host_;
+ CompletionQueue cli_cq_;
+ std::shared_ptr<Channel> channel_;
+ std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
+ std::vector<std::unique_ptr<ServerData>> servers_;
+};
+
+TEST_F(RoundRobinEnd2endTest, PickFirst) {
+ // Start servers and send one RPC per server.
+ const int kNumServers = 3;
+ StartServers(kNumServers);
+ ResetStub(false /* round_robin */);
+ SendRpc(kNumServers);
+ // All requests should have gone to a single server.
+ bool found = false;
+ for (size_t i = 0; i < servers_.size(); ++i) {
+ const int request_count = servers_[i]->service_.request_count();
+ if (request_count == kNumServers) {
+ found = true;
+ } else {
+ EXPECT_EQ(0, request_count);
+ }
+ }
+ EXPECT_TRUE(found);
+ // Check LB policy name for the channel.
+ EXPECT_EQ("pick_first", channel_->GetLoadBalancingPolicyName());
+}
+
+TEST_F(RoundRobinEnd2endTest, RoundRobin) {
+ // Start servers and send one RPC per server.
+ const int kNumServers = 3;
+ StartServers(kNumServers);
+ ResetStub(true /* round_robin */);
+ SendRpc(kNumServers);
+ // One request should have gone to each server.
+ for (size_t i = 0; i < servers_.size(); ++i) {
+ EXPECT_EQ(1, servers_[i]->service_.request_count());
+ }
+ // Check LB policy name for the channel.
+ EXPECT_EQ("round_robin", channel_->GetLoadBalancingPolicyName());
+}
+
+} // namespace
+} // namespace testing
+} // namespace grpc
+
+int main(int argc, char** argv) {
+ grpc_test_init(argc, argv);
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/cpp/end2end/server_builder_plugin_test.cc b/test/cpp/end2end/server_builder_plugin_test.cc
index b967a5d1e9..1b6f4ce37d 100644
--- a/test/cpp/end2end/server_builder_plugin_test.cc
+++ b/test/cpp/end2end/server_builder_plugin_test.cc
@@ -31,13 +31,14 @@
*
*/
+#include <thread>
+
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
#include <grpc++/impl/server_builder_option.h>
#include <grpc++/impl/server_builder_plugin.h>
#include <grpc++/impl/server_initializer.h>
-#include <grpc++/impl/thd.h>
#include <grpc++/security/credentials.h>
#include <grpc++/security/server_credentials.h>
#include <grpc++/server.h>
@@ -65,29 +66,29 @@ class TestServerBuilderPlugin : public ServerBuilderPlugin {
register_service_ = false;
}
- grpc::string name() GRPC_OVERRIDE { return PLUGIN_NAME; }
+ grpc::string name() override { return PLUGIN_NAME; }
- void InitServer(ServerInitializer* si) GRPC_OVERRIDE {
+ void InitServer(ServerInitializer* si) override {
init_server_is_called_ = true;
if (register_service_) {
si->RegisterService(service_);
}
}
- void Finish(ServerInitializer* si) GRPC_OVERRIDE { finish_is_called_ = true; }
+ void Finish(ServerInitializer* si) override { finish_is_called_ = true; }
- void ChangeArguments(const grpc::string& name, void* value) GRPC_OVERRIDE {
+ void ChangeArguments(const grpc::string& name, void* value) override {
change_arguments_is_called_ = true;
}
- bool has_async_methods() const GRPC_OVERRIDE {
+ bool has_async_methods() const override {
if (register_service_) {
return service_->has_async_methods();
}
return false;
}
- bool has_sync_methods() const GRPC_OVERRIDE {
+ bool has_sync_methods() const override {
if (register_service_) {
return service_->has_synchronous_methods();
}
@@ -112,10 +113,10 @@ class InsertPluginServerBuilderOption : public ServerBuilderOption {
public:
InsertPluginServerBuilderOption() { register_service_ = false; }
- void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
+ void UpdateArguments(ChannelArguments* arg) override {}
- void UpdatePlugins(std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins)
- GRPC_OVERRIDE {
+ void UpdatePlugins(
+ std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override {
plugins->clear();
std::unique_ptr<TestServerBuilderPlugin> plugin(
@@ -154,7 +155,7 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
public:
ServerBuilderPluginTest() {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
port_ = grpc_pick_unused_port_or_die();
builder_.reset(new ServerBuilder());
}
@@ -191,7 +192,7 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
// we run some tests without a service, and for those we need to supply a
// frequently polled completion queue
cq_ = builder_->AddCompletionQueue();
- cq_thread_ = new grpc::thread(&ServerBuilderPluginTest::RunCQ, this);
+ cq_thread_ = new std::thread(&ServerBuilderPluginTest::RunCQ, this);
server_ = builder_->BuildAndStart();
EXPECT_TRUE(CheckPresent());
}
@@ -202,7 +203,7 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
stub_ = grpc::testing::EchoTestService::NewStub(channel_);
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
auto plugin = CheckPresent();
EXPECT_TRUE(plugin);
EXPECT_TRUE(plugin->init_server_is_called());
@@ -225,7 +226,7 @@ class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
std::unique_ptr<ServerCompletionQueue> cq_;
std::unique_ptr<Server> server_;
- grpc::thread* cq_thread_;
+ std::thread* cq_thread_;
TestServiceImpl service_;
int port_;
diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc
index 16a5fa2322..b1f9216055 100644
--- a/test/cpp/end2end/server_crash_test.cc
+++ b/test/cpp/end2end/server_crash_test.cc
@@ -60,14 +60,13 @@ namespace testing {
namespace {
-class ServiceImpl GRPC_FINAL
- : public ::grpc::testing::EchoTestService::Service {
+class ServiceImpl final : public ::grpc::testing::EchoTestService::Service {
public:
ServiceImpl() : bidi_stream_count_(0), response_stream_count_(0) {}
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE {
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
bidi_stream_count_++;
EchoRequest request;
EchoResponse response;
@@ -82,7 +81,7 @@ class ServiceImpl GRPC_FINAL
}
Status ResponseStream(ServerContext* context, const EchoRequest* request,
- ServerWriter<EchoResponse>* writer) GRPC_OVERRIDE {
+ ServerWriter<EchoResponse>* writer) override {
EchoResponse response;
response_stream_count_++;
for (int i = 0;; i++) {
@@ -139,7 +138,7 @@ TEST_F(CrashTest, ResponseStream) {
auto server = CreateServerAndClient("response");
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
- gpr_time_from_seconds(5, GPR_TIMESPAN)));
+ gpr_time_from_seconds(60, GPR_TIMESPAN)));
KillClient();
server->Shutdown();
GPR_ASSERT(HadOneResponseStream());
@@ -149,7 +148,7 @@ TEST_F(CrashTest, BidiStream) {
auto server = CreateServerAndClient("bidi");
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
- gpr_time_from_seconds(5, GPR_TIMESPAN)));
+ gpr_time_from_seconds(60, GPR_TIMESPAN)));
KillClient();
server->Shutdown();
GPR_ASSERT(HadOneBidiStream());
diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc
index 4cba3b1c81..5b52b1fc1a 100644
--- a/test/cpp/end2end/shutdown_test.cc
+++ b/test/cpp/end2end/shutdown_test.cc
@@ -61,7 +61,7 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
explicit TestServiceImpl(gpr_event* ev) : ev_(ev) {}
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
gpr_event_set(ev_, (void*)1);
while (!context->IsCancelled()) {
}
@@ -76,7 +76,7 @@ class ShutdownTest : public ::testing::Test {
public:
ShutdownTest() : shutdown_(false), service_(&ev_) { gpr_event_init(&ev_); }
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
port_ = grpc_pick_unused_port_or_die();
server_ = SetUpServer(port_);
}
@@ -91,7 +91,7 @@ class ShutdownTest : public ::testing::Test {
return server;
}
- void TearDown() GRPC_OVERRIDE { GPR_ASSERT(shutdown_); }
+ void TearDown() override { GPR_ASSERT(shutdown_); }
void ResetStub() {
string target = "dns:localhost:" + to_string(port_);
diff --git a/test/cpp/end2end/streaming_throughput_test.cc b/test/cpp/end2end/streaming_throughput_test.cc
index fbef761ca9..302583766b 100644
--- a/test/cpp/end2end/streaming_throughput_test.cc
+++ b/test/cpp/end2end/streaming_throughput_test.cc
@@ -121,9 +121,9 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
}
// Only implement the one method we will be calling for brevity.
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE {
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
EchoRequest request;
gpr_atm should_exit;
gpr_atm_rel_store(&should_exit, static_cast<gpr_atm>(0));
@@ -147,7 +147,7 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
class End2endTest : public ::testing::Test {
protected:
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
int port = grpc_pick_unused_port_or_die();
server_address_ << "localhost:" << port;
// Setup server
@@ -158,7 +158,7 @@ class End2endTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE { server_->Shutdown(); }
+ void TearDown() override { server_->Shutdown(); }
void ResetStub() {
std::shared_ptr<Channel> channel =
diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc
index 2de344efd5..001047778d 100644
--- a/test/cpp/end2end/test_service_impl.cc
+++ b/test/cpp/end2end/test_service_impl.cc
@@ -194,7 +194,7 @@ Status TestServiceImpl::RequestStream(ServerContext* context,
return Status::CANCELLED;
}
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
if (server_try_cancel == CANCEL_DURING_PROCESSING) {
server_try_cancel_thd =
new std::thread(&TestServiceImpl::ServerTryCancel, this, context);
@@ -212,7 +212,7 @@ Status TestServiceImpl::RequestStream(ServerContext* context,
}
gpr_log(GPR_INFO, "Read: %d messages", num_msgs_read);
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
return Status::CANCELLED;
@@ -248,7 +248,7 @@ Status TestServiceImpl::ResponseStream(ServerContext* context,
}
EchoResponse response;
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
if (server_try_cancel == CANCEL_DURING_PROCESSING) {
server_try_cancel_thd =
new std::thread(&TestServiceImpl::ServerTryCancel, this, context);
@@ -259,7 +259,7 @@ Status TestServiceImpl::ResponseStream(ServerContext* context,
writer->Write(response);
}
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
return Status::CANCELLED;
@@ -295,7 +295,7 @@ Status TestServiceImpl::BidiStream(
return Status::CANCELLED;
}
- std::thread* server_try_cancel_thd = NULL;
+ std::thread* server_try_cancel_thd = nullptr;
if (server_try_cancel == CANCEL_DURING_PROCESSING) {
server_try_cancel_thd =
new std::thread(&TestServiceImpl::ServerTryCancel, this, context);
@@ -307,7 +307,7 @@ Status TestServiceImpl::BidiStream(
stream->Write(response);
}
- if (server_try_cancel_thd != NULL) {
+ if (server_try_cancel_thd != nullptr) {
server_try_cancel_thd->join();
delete server_try_cancel_thd;
return Status::CANCELLED;
diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h
index c89f88c900..88e0be7bca 100644
--- a/test/cpp/end2end/test_service_impl.h
+++ b/test/cpp/end2end/test_service_impl.h
@@ -63,20 +63,20 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
: signal_client_(false), host_(new grpc::string(host)) {}
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE;
+ EchoResponse* response) override;
// Unimplemented is left unimplemented to test the returned error.
Status RequestStream(ServerContext* context,
ServerReader<EchoRequest>* reader,
- EchoResponse* response) GRPC_OVERRIDE;
+ EchoResponse* response) override;
Status ResponseStream(ServerContext* context, const EchoRequest* request,
- ServerWriter<EchoResponse>* writer) GRPC_OVERRIDE;
+ ServerWriter<EchoResponse>* writer) override;
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE;
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override;
bool signal_client() {
std::unique_lock<std::mutex> lock(mu_);
diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc
index 0b9d4cda9f..d353f9894b 100644
--- a/test/cpp/end2end/thread_stress_test.cc
+++ b/test/cpp/end2end/thread_stress_test.cc
@@ -86,12 +86,12 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
TestServiceImpl() : signal_client_(false) {}
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message(request->message());
MaybeEchoDeadline(context, request, response);
if (request->has_param() && request->param().client_cancel_after_us()) {
{
- unique_lock<mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
signal_client_ = true;
}
while (!context->IsCancelled()) {
@@ -118,7 +118,7 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
Status RequestStream(ServerContext* context,
ServerReader<EchoRequest>* reader,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
EchoRequest request;
response->set_message("");
while (reader->Read(&request)) {
@@ -130,7 +130,7 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
// Return 3 messages.
// TODO(yangg) make it generic by adding a parameter into EchoRequest
Status ResponseStream(ServerContext* context, const EchoRequest* request,
- ServerWriter<EchoResponse>* writer) GRPC_OVERRIDE {
+ ServerWriter<EchoResponse>* writer) override {
EchoResponse response;
response.set_message(request->message() + "0");
writer->Write(response);
@@ -142,9 +142,9 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
return Status::OK;
}
- Status BidiStream(ServerContext* context,
- ServerReaderWriter<EchoResponse, EchoRequest>* stream)
- GRPC_OVERRIDE {
+ Status BidiStream(
+ ServerContext* context,
+ ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
EchoRequest request;
EchoResponse response;
while (stream->Read(&request)) {
@@ -156,20 +156,20 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
}
bool signal_client() {
- unique_lock<mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
return signal_client_;
}
private:
bool signal_client_;
- mutex mu_;
+ std::mutex mu_;
};
class TestServiceImplDupPkg
: public ::grpc::testing::duplicate::EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
response->set_message("no package");
return Status::OK;
}
@@ -215,12 +215,12 @@ class CommonStressTest {
class CommonStressTestSyncServer : public CommonStressTest<TestServiceImpl> {
public:
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
ServerBuilder builder;
SetUpStart(&builder, &service_);
SetUpEnd(&builder);
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
TearDownStart();
TearDownEnd();
}
@@ -232,32 +232,31 @@ class CommonStressTestSyncServer : public CommonStressTest<TestServiceImpl> {
class CommonStressTestAsyncServer
: public CommonStressTest<grpc::testing::EchoTestService::AsyncService> {
public:
- void SetUp() GRPC_OVERRIDE {
+ CommonStressTestAsyncServer() : contexts_(kNumAsyncServerThreads * 100) {}
+ void SetUp() override {
shutting_down_ = false;
ServerBuilder builder;
SetUpStart(&builder, &service_);
cq_ = builder.AddCompletionQueue();
SetUpEnd(&builder);
- contexts_ = new Context[kNumAsyncServerThreads * 100];
for (int i = 0; i < kNumAsyncServerThreads * 100; i++) {
RefreshContext(i);
}
for (int i = 0; i < kNumAsyncServerThreads; i++) {
- server_threads_.push_back(
- new std::thread(&CommonStressTestAsyncServer::ProcessRpcs, this));
+ server_threads_.emplace_back(&CommonStressTestAsyncServer::ProcessRpcs,
+ this);
}
}
- void TearDown() GRPC_OVERRIDE {
+ void TearDown() override {
{
- unique_lock<mutex> l(mu_);
+ std::unique_lock<std::mutex> l(mu_);
TearDownStart();
shutting_down_ = true;
cq_->Shutdown();
}
for (int i = 0; i < kNumAsyncServerThreads; i++) {
- server_threads_[i]->join();
- delete server_threads_[i];
+ server_threads_[i].join();
}
void* ignored_tag;
@@ -265,7 +264,6 @@ class CommonStressTestAsyncServer
while (cq_->Next(&ignored_tag, &ignored_ok))
;
TearDownEnd();
- delete[] contexts_;
}
private:
@@ -292,7 +290,7 @@ class CommonStressTestAsyncServer
}
}
void RefreshContext(int i) {
- unique_lock<mutex> l(mu_);
+ std::unique_lock<std::mutex> l(mu_);
if (!shutting_down_) {
contexts_[i].state = Context::READY;
contexts_[i].srv_ctx.reset(new ServerContext);
@@ -311,20 +309,21 @@ class CommonStressTestAsyncServer
response_writer;
EchoRequest recv_request;
enum { READY, DONE } state;
- } * contexts_;
+ };
+ std::vector<Context> contexts_;
::grpc::testing::EchoTestService::AsyncService service_;
std::unique_ptr<ServerCompletionQueue> cq_;
bool shutting_down_;
- mutex mu_;
- std::vector<std::thread*> server_threads_;
+ std::mutex mu_;
+ std::vector<std::thread> server_threads_;
};
template <class Common>
class End2endTest : public ::testing::Test {
protected:
End2endTest() {}
- void SetUp() GRPC_OVERRIDE { common_.SetUp(); }
- void TearDown() GRPC_OVERRIDE { common_.TearDown(); }
+ void SetUp() override { common_.SetUp(); }
+ void TearDown() override { common_.TearDown(); }
void ResetStub() { common_.ResetStub(); }
Common common_;
@@ -353,14 +352,12 @@ typedef ::testing::Types<CommonStressTestSyncServer,
TYPED_TEST_CASE(End2endTest, CommonTypes);
TYPED_TEST(End2endTest, ThreadStress) {
this->common_.ResetStub();
- std::vector<std::thread*> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < kNumThreads; ++i) {
- threads.push_back(
- new std::thread(SendRpc, this->common_.GetStub(), kNumRpcs));
+ threads.emplace_back(SendRpc, this->common_.GetStub(), kNumRpcs);
}
for (int i = 0; i < kNumThreads; ++i) {
- threads[i]->join();
- delete threads[i];
+ threads[i].join();
}
}
@@ -369,8 +366,8 @@ class AsyncClientEnd2endTest : public ::testing::Test {
protected:
AsyncClientEnd2endTest() : rpcs_outstanding_(0) {}
- void SetUp() GRPC_OVERRIDE { common_.SetUp(); }
- void TearDown() GRPC_OVERRIDE {
+ void SetUp() override { common_.SetUp(); }
+ void TearDown() override {
void* ignored_tag;
bool ignored_ok;
while (cq_.Next(&ignored_tag, &ignored_ok))
@@ -379,7 +376,7 @@ class AsyncClientEnd2endTest : public ::testing::Test {
}
void Wait() {
- unique_lock<mutex> l(mu_);
+ std::unique_lock<std::mutex> l(mu_);
while (rpcs_outstanding_ != 0) {
cv_.wait(l);
}
@@ -404,7 +401,7 @@ class AsyncClientEnd2endTest : public ::testing::Test {
call->response_reader->Finish(&call->response, &call->status,
(void*)call);
- unique_lock<mutex> l(mu_);
+ std::unique_lock<std::mutex> l(mu_);
rpcs_outstanding_++;
}
}
@@ -422,7 +419,7 @@ class AsyncClientEnd2endTest : public ::testing::Test {
bool notify;
{
- unique_lock<mutex> l(mu_);
+ std::unique_lock<std::mutex> l(mu_);
rpcs_outstanding_--;
notify = (rpcs_outstanding_ == 0);
}
@@ -434,34 +431,32 @@ class AsyncClientEnd2endTest : public ::testing::Test {
Common common_;
CompletionQueue cq_;
- mutex mu_;
- condition_variable cv_;
+ std::mutex mu_;
+ std::condition_variable cv_;
int rpcs_outstanding_;
};
TYPED_TEST_CASE(AsyncClientEnd2endTest, CommonTypes);
TYPED_TEST(AsyncClientEnd2endTest, ThreadStress) {
this->common_.ResetStub();
- std::vector<std::thread *> send_threads, completion_threads;
+ std::vector<std::thread> send_threads, completion_threads;
for (int i = 0; i < kNumAsyncReceiveThreads; ++i) {
- completion_threads.push_back(new std::thread(
+ completion_threads.emplace_back(
&AsyncClientEnd2endTest_ThreadStress_Test<TypeParam>::AsyncCompleteRpc,
- this));
+ this);
}
for (int i = 0; i < kNumAsyncSendThreads; ++i) {
- send_threads.push_back(new std::thread(
+ send_threads.emplace_back(
&AsyncClientEnd2endTest_ThreadStress_Test<TypeParam>::AsyncSendRpc,
- this, kNumRpcs));
+ this, kNumRpcs);
}
for (int i = 0; i < kNumAsyncSendThreads; ++i) {
- send_threads[i]->join();
- delete send_threads[i];
+ send_threads[i].join();
}
this->Wait();
for (int i = 0; i < kNumAsyncReceiveThreads; ++i) {
- completion_threads[i]->join();
- delete completion_threads[i];
+ completion_threads[i].join();
}
}
diff --git a/test/cpp/grpclb/grpclb_api_test.cc b/test/cpp/grpclb/grpclb_api_test.cc
index e67189c69e..191d729a9e 100644
--- a/test/cpp/grpclb/grpclb_api_test.cc
+++ b/test/cpp/grpclb/grpclb_api_test.cc
@@ -71,12 +71,12 @@ TEST_F(GrpclbTest, CreateRequest) {
const grpc::string service_name = "AServiceName";
LoadBalanceRequest request;
grpc_grpclb_request* c_req = grpc_grpclb_request_create(service_name.c_str());
- gpr_slice slice = grpc_grpclb_request_encode(c_req);
- const int num_bytes_written = GPR_SLICE_LENGTH(slice);
+ grpc_slice slice = grpc_grpclb_request_encode(c_req);
+ const int num_bytes_written = GRPC_SLICE_LENGTH(slice);
EXPECT_GT(num_bytes_written, 0);
- request.ParseFromArray(GPR_SLICE_START_PTR(slice), num_bytes_written);
+ request.ParseFromArray(GRPC_SLICE_START_PTR(slice), num_bytes_written);
EXPECT_EQ(request.initial_request().name(), service_name);
- gpr_slice_unref(slice);
+ grpc_slice_unref(slice);
grpc_grpclb_request_destroy(c_req);
}
@@ -88,15 +88,15 @@ TEST_F(GrpclbTest, ParseInitialResponse) {
client_stats_report_interval->set_seconds(123);
client_stats_report_interval->set_nanos(456);
const grpc::string encoded_response = response.SerializeAsString();
- gpr_slice encoded_slice =
- gpr_slice_from_copied_string(encoded_response.c_str());
+ grpc_slice encoded_slice =
+ grpc_slice_from_copied_string(encoded_response.c_str());
grpc_grpclb_initial_response* c_initial_response =
grpc_grpclb_initial_response_parse(encoded_slice);
EXPECT_FALSE(c_initial_response->has_load_balancer_delegate);
EXPECT_EQ(c_initial_response->client_stats_report_interval.seconds, 123);
EXPECT_EQ(c_initial_response->client_stats_report_interval.nanos, 456);
- gpr_slice_unref(encoded_slice);
+ grpc_slice_unref(encoded_slice);
grpc_grpclb_initial_response_destroy(c_initial_response);
}
@@ -116,7 +116,7 @@ TEST_F(GrpclbTest, ParseResponseServerList) {
expiration_interval->set_nanos(999);
const grpc::string encoded_response = response.SerializeAsString();
- const gpr_slice encoded_slice = gpr_slice_from_copied_buffer(
+ const grpc_slice encoded_slice = grpc_slice_from_copied_buffer(
encoded_response.data(), encoded_response.size());
grpc_grpclb_serverlist* c_serverlist =
grpc_grpclb_response_parse_serverlist(encoded_slice);
@@ -137,7 +137,7 @@ TEST_F(GrpclbTest, ParseResponseServerList) {
EXPECT_TRUE(c_serverlist->expiration_interval.has_nanos);
EXPECT_EQ(c_serverlist->expiration_interval.nanos, 999);
- gpr_slice_unref(encoded_slice);
+ grpc_slice_unref(encoded_slice);
grpc_grpclb_destroy_serverlist(c_serverlist);
}
diff --git a/test/cpp/grpclb/grpclb_test.cc b/test/cpp/grpclb/grpclb_test.cc
index b6056f9ae4..de304b9f89 100644
--- a/test/cpp/grpclb/grpclb_test.cc
+++ b/test/cpp/grpclb/grpclb_test.cc
@@ -76,10 +76,25 @@ extern "C" {
// - Send a serverlist with faulty ip:port addresses (port > 2^16, etc).
// - Test reception of invalid serverlist
// - Test pinging
-// - Test against a non-LB server. That server should return UNIMPLEMENTED and
-// the call should fail.
+// - Test against a non-LB server.
// - Random LB server closing the stream unexpectedly.
// - Test using DNS-resolvable names (localhost?)
+// - Test handling of creation of faulty RR instance by having the LB return a
+// serverlist with non-existent backends after having initially returned a
+// valid one.
+//
+// Findings from end to end testing to be covered here:
+// - Handling of LB servers restart, including reconnection after backing-off
+// retries.
+// - Destruction of load balanced channel (and therefore of grpclb instance)
+// while:
+// 1) the internal LB call is still active. This should work by virtue
+// of the weak reference the LB call holds. The call should be terminated as
+// part of the grpclb shutdown process.
+// 2) the retry timer is active. Again, the weak reference it holds should
+// prevent a premature call to \a glb_destroy.
+// - Restart of backend servers with no changes to serverlist. This exercises
+// the RR handover mechanism.
namespace grpc {
namespace {
@@ -96,6 +111,7 @@ typedef struct server_fixture {
grpc_completion_queue *cq;
char *servers_hostport;
int port;
+ const char *lb_token_prefix;
gpr_thd_id tid;
int num_calls_serviced;
} server_fixture;
@@ -109,9 +125,10 @@ typedef struct test_fixture {
static void *tag(intptr_t t) { return (void *)t; }
-static gpr_slice build_response_payload_slice(
+static grpc_slice build_response_payload_slice(
const char *host, int *ports, size_t nports,
- int64_t expiration_interval_secs, int32_t expiration_interval_nanos) {
+ int64_t expiration_interval_secs, int32_t expiration_interval_nanos,
+ const char *token_prefix) {
// server_list {
// servers {
// ip_address: <in_addr/6 bytes of an IP>
@@ -138,17 +155,16 @@ static gpr_slice build_response_payload_slice(
struct in_addr ip4;
GPR_ASSERT(inet_pton(AF_INET, host, &ip4) == 1);
server->set_ip_address(
- grpc::string(reinterpret_cast<const char *>(&ip4), sizeof(ip4)));
+ string(reinterpret_cast<const char *>(&ip4), sizeof(ip4)));
server->set_port(ports[i]);
- // The following long long int cast is meant to work around the
- // disfunctional implementation of std::to_string in gcc 4.4, which doesn't
- // have a version for int but does have one for long long int.
- string token_data = "token" + std::to_string((long long int)ports[i]);
- token_data.resize(64, '-');
- server->set_load_balance_token(token_data);
+ // Missing tokens are acceptable. Test that path.
+ if (strlen(token_prefix) > 0) {
+ string token_data = token_prefix + std::to_string(ports[i]);
+ server->set_load_balance_token(token_data);
+ }
}
- const grpc::string &enc_resp = response.SerializeAsString();
- return gpr_slice_from_copied_buffer(enc_resp.data(), enc_resp.size());
+ const string &enc_resp = response.SerializeAsString();
+ return grpc_slice_from_copied_buffer(enc_resp.data(), enc_resp.size());
}
static void drain_cq(grpc_completion_queue *cq) {
@@ -210,17 +226,17 @@ static void start_lb_server(server_fixture *sf, int *ports, size_t nports,
// validate initial request.
grpc_byte_buffer_reader bbr;
grpc_byte_buffer_reader_init(&bbr, request_payload_recv);
- gpr_slice request_payload_slice = grpc_byte_buffer_reader_readall(&bbr);
+ grpc_slice request_payload_slice = grpc_byte_buffer_reader_readall(&bbr);
grpc::lb::v1::LoadBalanceRequest request;
- request.ParseFromArray(GPR_SLICE_START_PTR(request_payload_slice),
- GPR_SLICE_LENGTH(request_payload_slice));
+ request.ParseFromArray(GRPC_SLICE_START_PTR(request_payload_slice),
+ GRPC_SLICE_LENGTH(request_payload_slice));
GPR_ASSERT(request.has_initial_request());
GPR_ASSERT(request.initial_request().name() == sf->servers_hostport);
- gpr_slice_unref(request_payload_slice);
+ grpc_slice_unref(request_payload_slice);
grpc_byte_buffer_reader_destroy(&bbr);
grpc_byte_buffer_destroy(request_payload_recv);
- gpr_slice response_payload_slice;
+ grpc_slice response_payload_slice;
op = ops;
op->op = GRPC_OP_SEND_INITIAL_METADATA;
op->data.send_initial_metadata.count = 0;
@@ -239,14 +255,14 @@ static void start_lb_server(server_fixture *sf, int *ports, size_t nports,
for (int i = 0; i < 2; i++) {
if (i == 0) {
// First half of the ports.
- response_payload_slice =
- build_response_payload_slice("127.0.0.1", ports, nports / 2, -1, -1);
+ response_payload_slice = build_response_payload_slice(
+ "127.0.0.1", ports, nports / 2, -1, -1, sf->lb_token_prefix);
} else {
// Second half of the ports.
sleep_ms(update_delay_ms);
- response_payload_slice =
- build_response_payload_slice("127.0.0.1", ports + (nports / 2),
- (nports + 1) / 2 /* ceil */, -1, -1);
+ response_payload_slice = build_response_payload_slice(
+ "127.0.0.1", ports + (nports / 2), (nports + 1) / 2 /* ceil */, -1,
+ -1, "" /* this half doesn't get to receive an LB token */);
}
response_payload = grpc_raw_byte_buffer_create(&response_payload_slice, 1);
@@ -264,7 +280,7 @@ static void start_lb_server(server_fixture *sf, int *ports, size_t nports,
sf->servers_hostport, i);
grpc_byte_buffer_destroy(response_payload);
- gpr_slice_unref(response_payload_slice);
+ grpc_slice_unref(response_payload_slice);
}
gpr_log(GPR_INFO, "LB Server[%s] shutting down", sf->servers_hostport);
@@ -328,12 +344,9 @@ static void start_backend_server(server_fixture *sf) {
return;
}
GPR_ASSERT(ev.type == GRPC_OP_COMPLETE);
-
- // The following long long int cast is meant to work around the
- // disfunctional implementation of std::to_string in gcc 4.4, which doesn't
- // have a version for int but does have one for long long int.
- string expected_token = "token" + std::to_string((long long int)sf->port);
- expected_token.resize(64, '-');
+ const string expected_token =
+ strlen(sf->lb_token_prefix) == 0 ? "" : sf->lb_token_prefix +
+ std::to_string(sf->port);
GPR_ASSERT(contains_metadata(&request_metadata_recv, "lb-token",
expected_token.c_str()));
@@ -355,7 +368,7 @@ static void start_backend_server(server_fixture *sf) {
gpr_log(GPR_INFO, "Server[%s] after tag 101", sf->servers_hostport);
bool exit = false;
- gpr_slice response_payload_slice = gpr_slice_from_copied_string(PAYLOAD);
+ grpc_slice response_payload_slice = grpc_slice_from_copied_string(PAYLOAD);
while (!exit) {
op = ops;
op->op = GRPC_OP_RECV_MESSAGE;
@@ -414,7 +427,7 @@ static void start_backend_server(server_fixture *sf) {
++sf->num_calls_serviced;
gpr_log(GPR_INFO, "Server[%s] OUT OF THE LOOP", sf->servers_hostport);
- gpr_slice_unref(response_payload_slice);
+ grpc_slice_unref(response_payload_slice);
op = ops;
op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
@@ -456,7 +469,8 @@ static void perform_request(client_fixture *cf) {
int i;
memset(ops, 0, sizeof(ops));
- gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ grpc_slice request_payload_slice =
+ grpc_slice_from_copied_string("hello world");
c = grpc_channel_create_call(cf->client, NULL, GRPC_PROPAGATE_DEFAULTS,
cf->cq, "/foo", "foo.test.google.fr:1234",
@@ -509,13 +523,14 @@ static void perform_request(client_fixture *cf) {
CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
cq_verify(cqv);
+ gpr_log(GPR_INFO, "Client after sending msg %d / 4", i + 1);
GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, PAYLOAD));
grpc_byte_buffer_destroy(request_payload);
grpc_byte_buffer_destroy(response_payload_recv);
}
- gpr_slice_unref(request_payload_slice);
+ grpc_slice_unref(request_payload_slice);
op = ops;
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
@@ -530,16 +545,17 @@ static void perform_request(client_fixture *cf) {
cq_verify(cqv);
peer = grpc_call_get_peer(c);
gpr_log(GPR_INFO, "Client DONE WITH SERVER %s ", peer);
- gpr_free(peer);
grpc_call_destroy(c);
- cq_verify_empty_timeout(cqv, 1);
+ cq_verify_empty_timeout(cqv, 1 /* seconds */);
cq_verifier_destroy(cqv);
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
gpr_free(details);
+ gpr_log(GPR_INFO, "Client call (peer %s) DESTROYED.", peer);
+ gpr_free(peer);
}
static void setup_client(const char *server_hostport, client_fixture *cf) {
@@ -615,6 +631,7 @@ static void fork_lb_server(void *arg) {
tf->lb_server_update_delay_ms);
}
+#define LB_TOKEN_PREFIX "token"
static test_fixture setup_test_fixture(int lb_server_update_delay_ms) {
test_fixture tf;
memset(&tf, 0, sizeof(tf));
@@ -624,16 +641,25 @@ static test_fixture setup_test_fixture(int lb_server_update_delay_ms) {
gpr_thd_options_set_joinable(&options);
for (int i = 0; i < NUM_BACKENDS; ++i) {
+ // Only the first half of the servers expect an LB token.
+ if (i < NUM_BACKENDS / 2) {
+ tf.lb_backends[i].lb_token_prefix = LB_TOKEN_PREFIX;
+ } else {
+ tf.lb_backends[i].lb_token_prefix = "";
+ }
setup_server("127.0.0.1", &tf.lb_backends[i]);
gpr_thd_new(&tf.lb_backends[i].tid, fork_backend_server, &tf.lb_backends[i],
&options);
}
+ tf.lb_server.lb_token_prefix = LB_TOKEN_PREFIX;
setup_server("127.0.0.1", &tf.lb_server);
gpr_thd_new(&tf.lb_server.tid, fork_lb_server, &tf.lb_server, &options);
char *server_uri;
- gpr_asprintf(&server_uri, "test:%s?lb_policy=grpclb&lb_enabled=1",
+ // The grpclb LB policy will be automatically selected by virtue of
+ // the fact that the returned addresses are balancer addresses.
+ gpr_asprintf(&server_uri, "test:///%s?lb_enabled=1",
tf.lb_server.servers_hostport);
setup_client(server_uri, &tf.client);
gpr_free(server_uri);
@@ -673,39 +699,42 @@ static test_fixture test_update(int lb_server_update_delay_ms) {
TEST(GrpclbTest, Updates) {
grpc::test_fixture tf_result;
- // Clients take a bit over one second to complete a call (the last part of the
+ // Clients take at least one second to complete a call (the last part of the
// call sleeps for 1 second while verifying the client's completion queue is
- // empty). Therefore:
+ // empty), more if the system is under load. Therefore:
//
// If the LB server waits 800ms before sending an update, it will arrive
- // before the first client request is done, skipping the second server from
- // batch 1 altogether: the 2nd client request will go to the 1st server of
- // batch 2 (ie, the third one out of the four total servers).
+ // before the first client request finishes, skipping the second server from
+ // batch 1. All subsequent picks will come from the second half of the
+ // backends, those coming in the LB update.
tf_result = grpc::test_update(800);
GPR_ASSERT(tf_result.lb_backends[0].num_calls_serviced == 1);
GPR_ASSERT(tf_result.lb_backends[1].num_calls_serviced == 0);
- GPR_ASSERT(tf_result.lb_backends[2].num_calls_serviced == 2);
- GPR_ASSERT(tf_result.lb_backends[3].num_calls_serviced == 1);
+ GPR_ASSERT(tf_result.lb_backends[2].num_calls_serviced +
+ tf_result.lb_backends[3].num_calls_serviced >
+ 0);
+ int num_serviced_calls = 0;
+ for (int i = 0; i < 4; i++) {
+ num_serviced_calls += tf_result.lb_backends[i].num_calls_serviced;
+ }
+ GPR_ASSERT(num_serviced_calls == 4);
- // If the LB server waits 1500ms, the update arrives after having picked the
- // 2nd server from batch 1 but before the next pick for the first server of
- // batch 2. All server are used.
- tf_result = grpc::test_update(1500);
- GPR_ASSERT(tf_result.lb_backends[0].num_calls_serviced == 1);
- GPR_ASSERT(tf_result.lb_backends[1].num_calls_serviced == 1);
- GPR_ASSERT(tf_result.lb_backends[2].num_calls_serviced == 1);
- GPR_ASSERT(tf_result.lb_backends[3].num_calls_serviced == 1);
-
- // If the LB server waits > 2000ms, the update arrives after the first two
- // request are done and the third pick is performed, which returns, in RR
- // fashion, the 1st server of the 1st update. Therefore, the second server of
- // batch 1 is hit at least one, whereas the first server of batch 2 is never
- // hit.
+ // If the LB server waits 2500ms, the update arrives after two calls and three
+ // picks. The third pick will be the 1st server of the 1st update (RR policy
+ // going around). The fourth and final pick will come from the second LB
+ // update. In any case, the total number of serviced calls must again be equal
+ // to four across all the backends.
tf_result = grpc::test_update(2500);
GPR_ASSERT(tf_result.lb_backends[0].num_calls_serviced >= 1);
- GPR_ASSERT(tf_result.lb_backends[1].num_calls_serviced > 0);
- GPR_ASSERT(tf_result.lb_backends[2].num_calls_serviced > 0);
- GPR_ASSERT(tf_result.lb_backends[3].num_calls_serviced == 0);
+ GPR_ASSERT(tf_result.lb_backends[1].num_calls_serviced == 1);
+ GPR_ASSERT(tf_result.lb_backends[2].num_calls_serviced +
+ tf_result.lb_backends[3].num_calls_serviced >
+ 0);
+ num_serviced_calls = 0;
+ for (int i = 0; i < 4; i++) {
+ num_serviced_calls += tf_result.lb_backends[i].num_calls_serviced;
+ }
+ GPR_ASSERT(num_serviced_calls == 4);
}
TEST(GrpclbTest, InvalidAddressInServerlist) {}
diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc
index 4197ba8bab..c58910abc3 100644
--- a/test/cpp/interop/client.cc
+++ b/test/cpp/interop/client.cc
@@ -54,33 +54,35 @@ DEFINE_int32(server_port, 0, "Server port.");
DEFINE_string(server_host, "127.0.0.1", "Server host to connect to");
DEFINE_string(server_host_override, "foo.test.google.fr",
"Override the server host which is sent in HTTP header");
-DEFINE_string(test_case, "large_unary",
- "Configure different test cases. Valid options are:\n\n"
- "all : all test cases;\n"
- "cancel_after_begin : cancel stream after starting it;\n"
- "cancel_after_first_response: cancel on first response;\n"
- "client_compressed_streaming : compressed request streaming with "
- "client_compressed_unary : single compressed request;\n"
- "client_streaming : request streaming with single response;\n"
- "compute_engine_creds: large_unary with compute engine auth;\n"
- "custom_metadata: server will echo custom metadata;\n"
- "empty_stream : bi-di stream with no request/response;\n"
- "empty_unary : empty (zero bytes) request and response;\n"
- "half_duplex : half-duplex streaming;\n"
- "jwt_token_creds: large_unary with JWT token auth;\n"
- "large_unary : single request and (large) response;\n"
- "oauth2_auth_token: raw oauth2 access token auth;\n"
- "per_rpc_creds: raw oauth2 access token on a single rpc;\n"
- "ping_pong : full-duplex streaming;\n"
- "response streaming;\n"
- "server_compressed_streaming : single request with compressed "
- "server_compressed_unary : single compressed response;\n"
- "server_streaming : single request with response streaming;\n"
- "slow_consumer : single request with response streaming with "
- "slow client consumer;\n"
- "status_code_and_message: verify status code & message;\n"
- "timeout_on_sleeping_server: deadline exceeds on stream;\n"
- "unimplemented_method: client calls an unimplemented method;\n");
+DEFINE_string(
+ test_case, "large_unary",
+ "Configure different test cases. Valid options are:\n\n"
+ "all : all test cases;\n"
+ "cancel_after_begin : cancel stream after starting it;\n"
+ "cancel_after_first_response: cancel on first response;\n"
+ "client_compressed_streaming : compressed request streaming with "
+ "client_compressed_unary : single compressed request;\n"
+ "client_streaming : request streaming with single response;\n"
+ "compute_engine_creds: large_unary with compute engine auth;\n"
+ "custom_metadata: server will echo custom metadata;\n"
+ "empty_stream : bi-di stream with no request/response;\n"
+ "empty_unary : empty (zero bytes) request and response;\n"
+ "half_duplex : half-duplex streaming;\n"
+ "jwt_token_creds: large_unary with JWT token auth;\n"
+ "large_unary : single request and (large) response;\n"
+ "oauth2_auth_token: raw oauth2 access token auth;\n"
+ "per_rpc_creds: raw oauth2 access token on a single rpc;\n"
+ "ping_pong : full-duplex streaming;\n"
+ "response streaming;\n"
+ "server_compressed_streaming : single request with compressed "
+ "server_compressed_unary : single compressed response;\n"
+ "server_streaming : single request with response streaming;\n"
+ "slow_consumer : single request with response streaming with "
+ "slow client consumer;\n"
+ "status_code_and_message: verify status code & message;\n"
+ "timeout_on_sleeping_server: deadline exceeds on stream;\n"
+ "unimplemented_method: client calls an unimplemented method;\n"
+ "unimplemented_service: client calls an unimplemented service;\n");
DEFINE_string(default_service_account, "",
"Email of GCE default service account");
DEFINE_string(service_account_key_file, "",
@@ -152,6 +154,8 @@ int main(int argc, char** argv) {
client.DoCustomMetadata();
} else if (FLAGS_test_case == "unimplemented_method") {
client.DoUnimplementedMethod();
+ } else if (FLAGS_test_case == "unimplemented_service") {
+ client.DoUnimplementedService();
} else if (FLAGS_test_case == "cacheable_unary") {
client.DoCacheableUnary();
} else if (FLAGS_test_case == "all") {
@@ -172,6 +176,7 @@ int main(int argc, char** argv) {
client.DoStatusWithMessage();
client.DoCustomMetadata();
client.DoUnimplementedMethod();
+ client.DoUnimplementedService();
client.DoCacheableUnary();
// service_account_creds and jwt_token_creds can only run with ssl.
if (FLAGS_use_tls) {
@@ -207,7 +212,8 @@ int main(int argc, char** argv) {
"server_streaming",
"status_code_and_message",
"timeout_on_sleeping_server",
- "unimplemented_method"};
+ "unimplemented_method",
+ "unimplemented_service"};
char* joined_testcases =
gpr_strjoin_sep(testcases, GPR_ARRAY_SIZE(testcases), "\n", NULL);
diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc
index 1668589cc4..d1242627ef 100644
--- a/test/cpp/interop/interop_client.cc
+++ b/test/cpp/interop/interop_client.cc
@@ -107,6 +107,11 @@ TestService::Stub* InteropClient::ServiceStub::Get() {
return stub_.get();
}
+UnimplementedService::Stub*
+InteropClient::ServiceStub::GetUnimplementedServiceStub() {
+ return UnimplementedService::NewStub(channel_).get();
+}
+
void InteropClient::ServiceStub::Reset(std::shared_ptr<Channel> channel) {
channel_ = channel;
@@ -162,8 +167,8 @@ bool InteropClient::AssertStatusCode(const Status& s,
bool InteropClient::DoEmpty() {
gpr_log(GPR_DEBUG, "Sending an empty rpc...");
- Empty request = Empty::default_instance();
- Empty response = Empty::default_instance();
+ Empty request;
+ Empty response;
ClientContext context;
Status s = serviceStub_.Get()->EmptyCall(&context, request, &response);
@@ -1002,11 +1007,30 @@ bool InteropClient::DoCustomMetadata() {
return true;
}
+bool InteropClient::DoUnimplementedService() {
+ gpr_log(GPR_DEBUG, "Sending a request for an unimplemented service...");
+
+ Empty request;
+ Empty response;
+ ClientContext context;
+
+ UnimplementedService::Stub* stub = serviceStub_.GetUnimplementedServiceStub();
+
+ Status s = stub->UnimplementedCall(&context, request, &response);
+
+ if (!AssertStatusCode(s, StatusCode::UNIMPLEMENTED)) {
+ return false;
+ }
+
+ gpr_log(GPR_DEBUG, "unimplemented service done.");
+ return true;
+}
+
bool InteropClient::DoUnimplementedMethod() {
gpr_log(GPR_DEBUG, "Sending a request for an unimplemented rpc...");
- Empty request = Empty::default_instance();
- Empty response = Empty::default_instance();
+ Empty request;
+ Empty response;
ClientContext context;
Status s =
diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h
index 0a96e7734d..7ec7ebee20 100644
--- a/test/cpp/interop/interop_client.h
+++ b/test/cpp/interop/interop_client.h
@@ -80,6 +80,7 @@ class InteropClient {
bool DoStatusWithMessage();
bool DoCustomMetadata();
bool DoUnimplementedMethod();
+ bool DoUnimplementedService();
bool DoCacheableUnary();
// Auth tests.
// username is a string containing the user email
@@ -100,6 +101,7 @@ class InteropClient {
ServiceStub(std::shared_ptr<Channel> channel, bool new_stub_every_call);
TestService::Stub* Get();
+ UnimplementedService::Stub* GetUnimplementedServiceStub();
void Reset(std::shared_ptr<Channel> channel);
diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc
index 8b50ae8c05..67456ce18b 100644
--- a/test/cpp/interop/interop_server.cc
+++ b/test/cpp/interop/interop_server.cc
@@ -344,7 +344,7 @@ void grpc::testing::interop::RunServer(
}
std::unique_ptr<Server> server(builder.BuildAndStart());
gpr_log(GPR_INFO, "Server listening on %s", server_address.str().c_str());
- while (!g_got_sigint) {
+ while (!gpr_atm_no_barrier_load(&g_got_sigint)) {
sleep(5);
}
}
diff --git a/test/cpp/interop/interop_server_bootstrap.cc b/test/cpp/interop/interop_server_bootstrap.cc
index 424f7ca7f0..99518c6943 100644
--- a/test/cpp/interop/interop_server_bootstrap.cc
+++ b/test/cpp/interop/interop_server_bootstrap.cc
@@ -37,10 +37,10 @@
#include "test/cpp/interop/server_helper.h"
#include "test/cpp/util/test_config.h"
-bool grpc::testing::interop::g_got_sigint = false;
+gpr_atm grpc::testing::interop::g_got_sigint;
static void sigint_handler(int x) {
- grpc::testing::interop::g_got_sigint = true;
+ gpr_atm_no_barrier_store(&grpc::testing::interop::g_got_sigint, true);
}
int main(int argc, char** argv) {
diff --git a/test/cpp/interop/interop_test.cc b/test/cpp/interop/interop_test.cc
index c066598d36..d4004740a4 100644
--- a/test/cpp/interop/interop_test.cc
+++ b/test/cpp/interop/interop_test.cc
@@ -126,7 +126,7 @@ int main(int argc, char** argv) {
return 1;
}
/* wait a little */
- sleep(2);
+ sleep(10);
/* start the clients */
ret = test_client(root, "127.0.0.1", port);
if (ret != 0) return ret;
diff --git a/test/cpp/interop/server_helper.h b/test/cpp/interop/server_helper.h
index fc4ea8b3e8..99539adee5 100644
--- a/test/cpp/interop/server_helper.h
+++ b/test/cpp/interop/server_helper.h
@@ -36,9 +36,11 @@
#include <memory>
+#include <grpc/compression.h>
+#include <grpc/impl/codegen/atm.h>
+
#include <grpc++/security/server_credentials.h>
#include <grpc++/server_context.h>
-#include <grpc/compression.h>
namespace grpc {
namespace testing {
@@ -62,7 +64,7 @@ class InteropServerContextInspector {
namespace interop {
-extern bool g_got_sigint;
+extern gpr_atm g_got_sigint;
void RunServer(std::shared_ptr<ServerCredentials> creds);
} // namespace interop
diff --git a/test/cpp/interop/stress_test.cc b/test/cpp/interop/stress_test.cc
index 46d09b7f28..97e658869f 100644
--- a/test/cpp/interop/stress_test.cc
+++ b/test/cpp/interop/stress_test.cc
@@ -40,7 +40,6 @@
#include <gflags/gflags.h>
#include <grpc++/create_channel.h>
#include <grpc++/grpc++.h>
-#include <grpc++/impl/thd.h>
#include <grpc/support/log.h>
#include <grpc/support/time.h>
@@ -321,7 +320,7 @@ int main(int argc, char** argv) {
gpr_log(GPR_INFO, "Starting test(s)..");
- std::vector<grpc::thread> test_threads;
+ std::vector<std::thread> test_threads;
// Create and start the test threads.
// Note that:
@@ -361,7 +360,7 @@ int main(int argc, char** argv) {
"/stress_test/server_%d/channel_%d/stub_%d/qps",
server_idx, channel_idx, stub_idx);
- test_threads.emplace_back(grpc::thread(
+ test_threads.emplace_back(std::thread(
&StressTestInteropClient::MainLoop, client,
metrics_service.CreateQpsGauge(buffer, &is_already_created)));
@@ -372,9 +371,9 @@ int main(int argc, char** argv) {
}
// Start metrics server before waiting for the stress test threads
+ std::unique_ptr<grpc::Server> metrics_server;
if (FLAGS_metrics_port > 0) {
- std::unique_ptr<grpc::Server> metrics_server =
- metrics_service.StartServer(FLAGS_metrics_port);
+ metrics_server = metrics_service.StartServer(FLAGS_metrics_port);
}
// Wait for the stress test threads to complete
diff --git a/test/cpp/microbenchmarks/bm_fullstack.cc b/test/cpp/microbenchmarks/bm_fullstack.cc
new file mode 100644
index 0000000000..6c0bf80488
--- /dev/null
+++ b/test/cpp/microbenchmarks/bm_fullstack.cc
@@ -0,0 +1,450 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/* Benchmark gRPC end2end in various configurations */
+
+#include <sstream>
+
+#include <grpc++/channel.h>
+#include <grpc++/create_channel.h>
+#include <grpc++/impl/grpc_library.h>
+#include <grpc++/security/credentials.h>
+#include <grpc++/security/server_credentials.h>
+#include <grpc++/server.h>
+#include <grpc++/server_builder.h>
+#include <grpc/support/log.h>
+
+extern "C" {
+#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/iomgr/endpoint.h"
+#include "src/core/lib/iomgr/endpoint_pair.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/iomgr/tcp_posix.h"
+#include "src/core/lib/surface/channel.h"
+#include "src/core/lib/surface/completion_queue.h"
+#include "src/core/lib/surface/server.h"
+#include "test/core/util/passthru_endpoint.h"
+#include "test/core/util/port.h"
+}
+#include "src/cpp/client/create_channel_internal.h"
+#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "third_party/benchmark/include/benchmark/benchmark.h"
+
+namespace grpc {
+namespace testing {
+
+static class InitializeStuff {
+ public:
+ InitializeStuff() {
+ init_lib_.init();
+ rq_ = grpc_resource_quota_create("bm");
+ }
+
+ ~InitializeStuff() { init_lib_.shutdown(); }
+
+ grpc_resource_quota* rq() { return rq_; }
+
+ private:
+ internal::GrpcLibrary init_lib_;
+ grpc_resource_quota* rq_;
+} initialize_stuff;
+
+/*******************************************************************************
+ * FIXTURES
+ */
+
+class FullstackFixture {
+ public:
+ FullstackFixture(Service* service, const grpc::string& address) {
+ ServerBuilder b;
+ b.AddListeningPort(address, InsecureServerCredentials());
+ cq_ = b.AddCompletionQueue(true);
+ b.RegisterService(service);
+ server_ = b.BuildAndStart();
+ channel_ = CreateChannel(address, InsecureChannelCredentials());
+ }
+
+ virtual ~FullstackFixture() {
+ server_->Shutdown();
+ cq_->Shutdown();
+ void* tag;
+ bool ok;
+ while (cq_->Next(&tag, &ok)) {
+ }
+ }
+
+ ServerCompletionQueue* cq() { return cq_.get(); }
+ std::shared_ptr<Channel> channel() { return channel_; }
+
+ private:
+ std::unique_ptr<Server> server_;
+ std::unique_ptr<ServerCompletionQueue> cq_;
+ std::shared_ptr<Channel> channel_;
+};
+
+class TCP : public FullstackFixture {
+ public:
+ TCP(Service* service) : FullstackFixture(service, MakeAddress()) {}
+
+ private:
+ static grpc::string MakeAddress() {
+ int port = grpc_pick_unused_port_or_die();
+ std::stringstream addr;
+ addr << "localhost:" << port;
+ return addr.str();
+ }
+};
+
+class UDS : public FullstackFixture {
+ public:
+ UDS(Service* service) : FullstackFixture(service, MakeAddress()) {}
+
+ private:
+ static grpc::string MakeAddress() {
+ int port = grpc_pick_unused_port_or_die(); // just for a unique id - not a
+ // real port
+ std::stringstream addr;
+ addr << "unix:/tmp/bm_fullstack." << port;
+ return addr.str();
+ }
+};
+
+class EndpointPairFixture {
+ public:
+ EndpointPairFixture(Service* service, grpc_endpoint_pair endpoints) {
+ ServerBuilder b;
+ cq_ = b.AddCompletionQueue(true);
+ b.RegisterService(service);
+ server_ = b.BuildAndStart();
+
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+
+ /* add server endpoint to server_ */
+ {
+ const grpc_channel_args* server_args =
+ grpc_server_get_channel_args(server_->c_server());
+ grpc_transport* transport = grpc_create_chttp2_transport(
+ &exec_ctx, server_args, endpoints.server, 0 /* is_client */);
+
+ grpc_pollset** pollsets;
+ size_t num_pollsets = 0;
+ grpc_server_get_pollsets(server_->c_server(), &pollsets, &num_pollsets);
+
+ for (size_t i = 0; i < num_pollsets; i++) {
+ grpc_endpoint_add_to_pollset(&exec_ctx, endpoints.server, pollsets[i]);
+ }
+
+ grpc_server_setup_transport(&exec_ctx, server_->c_server(), transport,
+ NULL, server_args);
+ grpc_chttp2_transport_start_reading(&exec_ctx, transport, NULL);
+ }
+
+ /* create channel */
+ {
+ ChannelArguments args;
+ args.SetString(GRPC_ARG_DEFAULT_AUTHORITY, "test.authority");
+
+ grpc_channel_args c_args = args.c_channel_args();
+ grpc_transport* transport =
+ grpc_create_chttp2_transport(&exec_ctx, &c_args, endpoints.client, 1);
+ GPR_ASSERT(transport);
+ grpc_channel* channel = grpc_channel_create(
+ &exec_ctx, "target", &c_args, GRPC_CLIENT_DIRECT_CHANNEL, transport);
+ grpc_chttp2_transport_start_reading(&exec_ctx, transport, NULL);
+
+ channel_ = CreateChannelInternal("", channel);
+ }
+
+ grpc_exec_ctx_finish(&exec_ctx);
+ }
+
+ virtual ~EndpointPairFixture() {
+ server_->Shutdown();
+ cq_->Shutdown();
+ void* tag;
+ bool ok;
+ while (cq_->Next(&tag, &ok)) {
+ }
+ }
+
+ ServerCompletionQueue* cq() { return cq_.get(); }
+ std::shared_ptr<Channel> channel() { return channel_; }
+
+ private:
+ std::unique_ptr<Server> server_;
+ std::unique_ptr<ServerCompletionQueue> cq_;
+ std::shared_ptr<Channel> channel_;
+};
+
+class SockPair : public EndpointPairFixture {
+ public:
+ SockPair(Service* service)
+ : EndpointPairFixture(service, grpc_iomgr_create_endpoint_pair(
+ "test", initialize_stuff.rq(), 8192)) {
+ }
+};
+
+class InProcessCHTTP2 : public EndpointPairFixture {
+ public:
+ InProcessCHTTP2(Service* service)
+ : EndpointPairFixture(service, MakeEndpoints()) {}
+
+ private:
+ grpc_endpoint_pair MakeEndpoints() {
+ grpc_endpoint_pair p;
+ grpc_passthru_endpoint_create(&p.client, &p.server, initialize_stuff.rq());
+ return p;
+ }
+};
+
+/*******************************************************************************
+ * CONTEXT MUTATORS
+ */
+
+static const int kPregenerateKeyCount = 100000;
+
+template <class F>
+auto MakeVector(size_t length, F f) -> std::vector<decltype(f())> {
+ std::vector<decltype(f())> out;
+ out.reserve(length);
+ for (size_t i = 0; i < length; i++) {
+ out.push_back(f());
+ }
+ return out;
+}
+
+class NoOpMutator {
+ public:
+ template <class ContextType>
+ NoOpMutator(ContextType* context) {}
+};
+
+template <int length>
+class RandomBinaryMetadata {
+ public:
+ static const grpc::string& Key() { return kKey; }
+
+ static const grpc::string& Value() {
+ return kValues[rand() % kValues.size()];
+ }
+
+ private:
+ static const grpc::string kKey;
+ static const std::vector<grpc::string> kValues;
+
+ static grpc::string GenerateOneString() {
+ grpc::string s;
+ s.reserve(length + 1);
+ for (int i = 0; i < length; i++) {
+ s += (char)rand();
+ }
+ return s;
+ }
+};
+
+template <int length>
+const grpc::string RandomBinaryMetadata<length>::kKey = "foo-bin";
+
+template <int length>
+const std::vector<grpc::string> RandomBinaryMetadata<length>::kValues =
+ MakeVector(kPregenerateKeyCount, GenerateOneString);
+
+template <int length>
+class RandomAsciiMetadata {
+ public:
+ static const grpc::string& Key() { return kKey; }
+
+ static const grpc::string& Value() {
+ return kValues[rand() % kValues.size()];
+ }
+
+ private:
+ static const grpc::string kKey;
+ static const std::vector<grpc::string> kValues;
+
+ static grpc::string GenerateOneString() {
+ grpc::string s;
+ s.reserve(length + 1);
+ for (int i = 0; i < length; i++) {
+ s += (char)(rand() % 26 + 'a');
+ }
+ return s;
+ }
+};
+
+template <int length>
+const grpc::string RandomAsciiMetadata<length>::kKey = "foo";
+
+template <int length>
+const std::vector<grpc::string> RandomAsciiMetadata<length>::kValues =
+ MakeVector(kPregenerateKeyCount, GenerateOneString);
+
+template <class Generator, int kNumKeys>
+class Client_AddMetadata : public NoOpMutator {
+ public:
+ Client_AddMetadata(ClientContext* context) : NoOpMutator(context) {
+ for (int i = 0; i < kNumKeys; i++) {
+ context->AddMetadata(Generator::Key(), Generator::Value());
+ }
+ }
+};
+
+template <class Generator, int kNumKeys>
+class Server_AddInitialMetadata : public NoOpMutator {
+ public:
+ Server_AddInitialMetadata(ServerContext* context) : NoOpMutator(context) {
+ for (int i = 0; i < kNumKeys; i++) {
+ context->AddInitialMetadata(Generator::Key(), Generator::Value());
+ }
+ }
+};
+
+/*******************************************************************************
+ * BENCHMARKING KERNELS
+ */
+
+static void* tag(intptr_t x) { return reinterpret_cast<void*>(x); }
+
+template <class Fixture, class ClientContextMutator, class ServerContextMutator>
+static void BM_UnaryPingPong(benchmark::State& state) {
+ EchoTestService::AsyncService service;
+ std::unique_ptr<Fixture> fixture(new Fixture(&service));
+ EchoRequest send_request;
+ EchoResponse send_response;
+ EchoResponse recv_response;
+ Status recv_status;
+ struct ServerEnv {
+ ServerContext ctx;
+ EchoRequest recv_request;
+ grpc::ServerAsyncResponseWriter<EchoResponse> response_writer;
+ ServerEnv() : response_writer(&ctx) {}
+ };
+ uint8_t server_env_buffer[2 * sizeof(ServerEnv)];
+ ServerEnv* server_env[2] = {
+ reinterpret_cast<ServerEnv*>(server_env_buffer),
+ reinterpret_cast<ServerEnv*>(server_env_buffer + sizeof(ServerEnv))};
+ new (server_env[0]) ServerEnv;
+ new (server_env[1]) ServerEnv;
+ service.RequestEcho(&server_env[0]->ctx, &server_env[0]->recv_request,
+ &server_env[0]->response_writer, fixture->cq(),
+ fixture->cq(), tag(0));
+ service.RequestEcho(&server_env[1]->ctx, &server_env[1]->recv_request,
+ &server_env[1]->response_writer, fixture->cq(),
+ fixture->cq(), tag(1));
+ std::unique_ptr<EchoTestService::Stub> stub(
+ EchoTestService::NewStub(fixture->channel()));
+ while (state.KeepRunning()) {
+ ClientContext cli_ctx;
+ ClientContextMutator cli_ctx_mut(&cli_ctx);
+ std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
+ stub->AsyncEcho(&cli_ctx, send_request, fixture->cq()));
+ void* t;
+ bool ok;
+ GPR_ASSERT(fixture->cq()->Next(&t, &ok));
+ GPR_ASSERT(ok);
+ GPR_ASSERT(t == tag(0) || t == tag(1));
+ intptr_t slot = reinterpret_cast<intptr_t>(t);
+ ServerEnv* senv = server_env[slot];
+ ServerContextMutator svr_ctx_mut(&senv->ctx);
+ senv->response_writer.Finish(send_response, Status::OK, tag(3));
+ response_reader->Finish(&recv_response, &recv_status, tag(4));
+ for (int i = (1 << 3) | (1 << 4); i != 0;) {
+ GPR_ASSERT(fixture->cq()->Next(&t, &ok));
+ GPR_ASSERT(ok);
+ int tagnum = (int)reinterpret_cast<intptr_t>(t);
+ GPR_ASSERT(i & (1 << tagnum));
+ i -= 1 << tagnum;
+ }
+ GPR_ASSERT(recv_status.ok());
+
+ senv->~ServerEnv();
+ senv = new (senv) ServerEnv();
+ service.RequestEcho(&senv->ctx, &senv->recv_request, &senv->response_writer,
+ fixture->cq(), fixture->cq(), tag(slot));
+ }
+ fixture.reset();
+ server_env[0]->~ServerEnv();
+ server_env[1]->~ServerEnv();
+}
+
+/*******************************************************************************
+ * CONFIGURATIONS
+ */
+
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, TCP, NoOpMutator, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, UDS, NoOpMutator, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, SockPair, NoOpMutator, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<10>, 1>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<31>, 1>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<100>, 1>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<10>, 2>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<31>, 2>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomBinaryMetadata<100>, 2>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomBinaryMetadata<10>, 1>);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomBinaryMetadata<31>, 1>);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomBinaryMetadata<100>, 1>);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomAsciiMetadata<10>, 1>, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomAsciiMetadata<31>, 1>, NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2,
+ Client_AddMetadata<RandomAsciiMetadata<100>, 1>,
+ NoOpMutator);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomAsciiMetadata<10>, 1>);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomAsciiMetadata<31>, 1>);
+BENCHMARK_TEMPLATE(BM_UnaryPingPong, InProcessCHTTP2, NoOpMutator,
+ Server_AddInitialMetadata<RandomAsciiMetadata<100>, 1>);
+
+} // namespace testing
+} // namespace grpc
+
+BENCHMARK_MAIN();
diff --git a/test/cpp/microbenchmarks/noop-benchmark.cc b/test/cpp/microbenchmarks/noop-benchmark.cc
new file mode 100644
index 0000000000..99fa6d5f6e
--- /dev/null
+++ b/test/cpp/microbenchmarks/noop-benchmark.cc
@@ -0,0 +1,45 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/* This benchmark exists to ensure that the benchmark integration is
+ * working */
+
+#include "third_party/benchmark/include/benchmark/benchmark.h"
+
+static void BM_NoOp(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ }
+}
+BENCHMARK(BM_NoOp);
+
+BENCHMARK_MAIN();
diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h
index 5fb87b2782..fdd78ebb89 100644
--- a/test/cpp/qps/client.h
+++ b/test/cpp/qps/client.h
@@ -36,6 +36,7 @@
#include <condition_variable>
#include <mutex>
+#include <unordered_map>
#include <vector>
#include <grpc++/channel.h>
@@ -102,7 +103,7 @@ class ClientRequestCreator<ByteBuffer> {
if (payload_config.has_bytebuf_params()) {
std::unique_ptr<char[]> buf(
new char[payload_config.bytebuf_params().req_size()]);
- gpr_slice s = gpr_slice_from_copied_buffer(
+ grpc_slice s = grpc_slice_from_copied_buffer(
buf.get(), payload_config.bytebuf_params().req_size());
Slice slice(s, Slice::STEAL_REF);
*req = ByteBuffer(&slice, 1);
@@ -112,21 +113,39 @@ class ClientRequestCreator<ByteBuffer> {
}
};
-class HistogramEntry GRPC_FINAL {
+class HistogramEntry final {
public:
- HistogramEntry() : used_(false) {}
- bool used() const { return used_; }
+ HistogramEntry() : value_used_(false), status_used_(false) {}
+ bool value_used() const { return value_used_; }
double value() const { return value_; }
void set_value(double v) {
- used_ = true;
+ value_used_ = true;
value_ = v;
}
+ bool status_used() const { return status_used_; }
+ int status() const { return status_; }
+ void set_status(int status) {
+ status_used_ = true;
+ status_ = status;
+ }
private:
- bool used_;
+ bool value_used_;
double value_;
+ bool status_used_;
+ int status_;
};
+typedef std::unordered_map<int, int64_t> StatusHistogram;
+
+inline void MergeStatusHistogram(const StatusHistogram& from,
+ StatusHistogram* to) {
+ for (StatusHistogram::const_iterator it = from.begin(); it != from.end();
+ ++it) {
+ (*to)[it->first] += it->second;
+ }
+}
+
class Client {
public:
Client()
@@ -139,34 +158,41 @@ class Client {
ClientStats Mark(bool reset) {
Histogram latencies;
+ StatusHistogram statuses;
UsageTimer::Result timer_result;
MaybeStartRequests();
- // avoid std::vector for old compilers that expect a copy constructor
if (reset) {
- Histogram* to_merge = new Histogram[threads_.size()];
+ std::vector<Histogram> to_merge(threads_.size());
+ std::vector<StatusHistogram> to_merge_status(threads_.size());
+
for (size_t i = 0; i < threads_.size(); i++) {
- threads_[i]->BeginSwap(&to_merge[i]);
+ threads_[i]->BeginSwap(&to_merge[i], &to_merge_status[i]);
}
std::unique_ptr<UsageTimer> timer(new UsageTimer);
timer_.swap(timer);
for (size_t i = 0; i < threads_.size(); i++) {
- threads_[i]->EndSwap();
latencies.Merge(to_merge[i]);
+ MergeStatusHistogram(to_merge_status[i], &statuses);
}
- delete[] to_merge;
timer_result = timer->Mark();
} else {
// merge snapshots of each thread histogram
for (size_t i = 0; i < threads_.size(); i++) {
- threads_[i]->MergeStatsInto(&latencies);
+ threads_[i]->MergeStatsInto(&latencies, &statuses);
}
timer_result = timer_->Mark();
}
ClientStats stats;
latencies.FillProto(stats.mutable_latencies());
+ for (StatusHistogram::const_iterator it = statuses.begin();
+ it != statuses.end(); ++it) {
+ RequestResultCount* rrc = stats.add_request_results();
+ rrc->set_status_code(it->first);
+ rrc->set_count(it->second);
+ }
stats.set_time_elapsed(timer_result.wall);
stats.set_time_system(timer_result.system);
stats.set_time_user(timer_result.user);
@@ -258,16 +284,16 @@ class Client {
~Thread() { impl_.join(); }
- void BeginSwap(Histogram* n) {
+ void BeginSwap(Histogram* n, StatusHistogram* s) {
std::lock_guard<std::mutex> g(mu_);
n->Swap(&histogram_);
+ s->swap(statuses_);
}
- void EndSwap() {}
-
- void MergeStatsInto(Histogram* hist) {
+ void MergeStatsInto(Histogram* hist, StatusHistogram* s) {
std::unique_lock<std::mutex> g(mu_);
hist->Merge(histogram_);
+ MergeStatusHistogram(statuses_, s);
}
private:
@@ -288,9 +314,12 @@ class Client {
const bool thread_still_ok = client_->ThreadFunc(&entry, idx_);
// lock, update histogram if needed and see if we're done
std::lock_guard<std::mutex> g(mu_);
- if (entry.used()) {
+ if (entry.value_used()) {
histogram_.Add(entry.value());
}
+ if (entry.status_used()) {
+ statuses_[entry.status()]++;
+ }
if (!thread_still_ok) {
gpr_log(GPR_ERROR, "Finishing client thread due to RPC error");
}
@@ -304,6 +333,7 @@ class Client {
std::mutex mu_;
Histogram histogram_;
+ StatusHistogram statuses_;
Client* client_;
const size_t idx_;
std::thread impl_;
diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 081114859c..4032039ea1 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -83,7 +83,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
BenchmarkService::Stub*, grpc::ClientContext*, const RequestType&,
CompletionQueue*)>
start_req,
- std::function<void(grpc::Status, ResponseType*)> on_done)
+ std::function<void(grpc::Status, ResponseType*, HistogramEntry*)> on_done)
: context_(),
stub_(stub),
cq_(nullptr),
@@ -93,8 +93,8 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
callback_(on_done),
next_issue_(next_issue),
start_req_(start_req) {}
- ~ClientRpcContextUnaryImpl() GRPC_OVERRIDE {}
- void Start(CompletionQueue* cq) GRPC_OVERRIDE {
+ ~ClientRpcContextUnaryImpl() override {}
+ void Start(CompletionQueue* cq) override {
cq_ = cq;
if (!next_issue_) { // ready to issue
RunNextState(true, nullptr);
@@ -102,7 +102,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
alarm_.reset(new Alarm(cq_, next_issue_(), ClientRpcContext::tag(this)));
}
}
- bool RunNextState(bool ok, HistogramEntry* entry) GRPC_OVERRIDE {
+ bool RunNextState(bool ok, HistogramEntry* entry) override {
switch (next_state_) {
case State::READY:
start_ = UsageTimer::Now();
@@ -113,7 +113,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
return true;
case State::RESP_DONE:
entry->set_value((UsageTimer::Now() - start_) * 1e9);
- callback_(status_, &response_);
+ callback_(status_, &response_, entry);
next_state_ = State::INVALID;
return false;
default:
@@ -121,7 +121,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
return false;
}
}
- ClientRpcContext* StartNewClone() GRPC_OVERRIDE {
+ ClientRpcContext* StartNewClone() override {
return new ClientRpcContextUnaryImpl(stub_, req_, next_issue_, start_req_,
callback_);
}
@@ -135,7 +135,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
ResponseType response_;
enum State { INVALID, READY, RESP_DONE };
State next_state_;
- std::function<void(grpc::Status, ResponseType*)> callback_;
+ std::function<void(grpc::Status, ResponseType*, HistogramEntry*)> callback_;
std::function<gpr_timespec()> next_issue_;
std::function<std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
BenchmarkService::Stub*, grpc::ClientContext*, const RequestType&,
@@ -177,7 +177,6 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
shutdown_state_.emplace_back(new PerThreadShutdownState());
}
- using namespace std::placeholders;
int t = 0;
for (int ch = 0; ch < config.client_channels(); ch++) {
for (int i = 0; i < config.outstanding_rpcs_per_channel(); i++) {
@@ -217,7 +216,7 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
}
return num_threads;
}
- void DestroyMultithreading() GRPC_OVERRIDE GRPC_FINAL {
+ void DestroyMultithreading() override final {
for (auto ss = shutdown_state_.begin(); ss != shutdown_state_.end(); ++ss) {
std::lock_guard<std::mutex> lock((*ss)->mutex);
(*ss)->shutdown = true;
@@ -228,8 +227,7 @@ class AsyncClient : public ClientImpl<StubType, RequestType> {
this->EndThreads(); // this needed for resolution
}
- bool ThreadFunc(HistogramEntry* entry,
- size_t thread_idx) GRPC_OVERRIDE GRPC_FINAL {
+ bool ThreadFunc(HistogramEntry* entry, size_t thread_idx) override final {
void* got_tag;
bool ok;
@@ -279,7 +277,7 @@ static std::unique_ptr<BenchmarkService::Stub> BenchmarkStubCreator(
return BenchmarkService::NewStub(ch);
}
-class AsyncUnaryClient GRPC_FINAL
+class AsyncUnaryClient final
: public AsyncClient<BenchmarkService::Stub, SimpleRequest> {
public:
explicit AsyncUnaryClient(const ClientConfig& config)
@@ -287,10 +285,13 @@ class AsyncUnaryClient GRPC_FINAL
config, SetupCtx, BenchmarkStubCreator) {
StartThreads(num_async_threads_);
}
- ~AsyncUnaryClient() GRPC_OVERRIDE {}
+ ~AsyncUnaryClient() override {}
private:
- static void CheckDone(grpc::Status s, SimpleResponse* response) {}
+ static void CheckDone(grpc::Status s, SimpleResponse* response,
+ HistogramEntry* entry) {
+ entry->set_status(s.error_code());
+ }
static std::unique_ptr<grpc::ClientAsyncResponseReader<SimpleResponse>>
StartReq(BenchmarkService::Stub* stub, grpc::ClientContext* ctx,
const SimpleRequest& request, CompletionQueue* cq) {
@@ -326,13 +327,13 @@ class ClientRpcContextStreamingImpl : public ClientRpcContext {
callback_(on_done),
next_issue_(next_issue),
start_req_(start_req) {}
- ~ClientRpcContextStreamingImpl() GRPC_OVERRIDE {}
- void Start(CompletionQueue* cq) GRPC_OVERRIDE {
+ ~ClientRpcContextStreamingImpl() override {}
+ void Start(CompletionQueue* cq) override {
cq_ = cq;
stream_ = start_req_(stub_, &context_, cq, ClientRpcContext::tag(this));
next_state_ = State::STREAM_IDLE;
}
- bool RunNextState(bool ok, HistogramEntry* entry) GRPC_OVERRIDE {
+ bool RunNextState(bool ok, HistogramEntry* entry) override {
while (true) {
switch (next_state_) {
case State::STREAM_IDLE:
@@ -374,7 +375,7 @@ class ClientRpcContextStreamingImpl : public ClientRpcContext {
}
}
}
- ClientRpcContext* StartNewClone() GRPC_OVERRIDE {
+ ClientRpcContext* StartNewClone() override {
return new ClientRpcContextStreamingImpl(stub_, req_, next_issue_,
start_req_, callback_);
}
@@ -407,7 +408,7 @@ class ClientRpcContextStreamingImpl : public ClientRpcContext {
stream_;
};
-class AsyncStreamingClient GRPC_FINAL
+class AsyncStreamingClient final
: public AsyncClient<BenchmarkService::Stub, SimpleRequest> {
public:
explicit AsyncStreamingClient(const ClientConfig& config)
@@ -416,7 +417,7 @@ class AsyncStreamingClient GRPC_FINAL
StartThreads(num_async_threads_);
}
- ~AsyncStreamingClient() GRPC_OVERRIDE {}
+ ~AsyncStreamingClient() override {}
private:
static void CheckDone(grpc::Status s, SimpleResponse* response) {}
@@ -455,8 +456,8 @@ class ClientRpcContextGenericStreamingImpl : public ClientRpcContext {
callback_(on_done),
next_issue_(next_issue),
start_req_(start_req) {}
- ~ClientRpcContextGenericStreamingImpl() GRPC_OVERRIDE {}
- void Start(CompletionQueue* cq) GRPC_OVERRIDE {
+ ~ClientRpcContextGenericStreamingImpl() override {}
+ void Start(CompletionQueue* cq) override {
cq_ = cq;
const grpc::string kMethodName(
"/grpc.testing.BenchmarkService/StreamingCall");
@@ -464,7 +465,7 @@ class ClientRpcContextGenericStreamingImpl : public ClientRpcContext {
ClientRpcContext::tag(this));
next_state_ = State::STREAM_IDLE;
}
- bool RunNextState(bool ok, HistogramEntry* entry) GRPC_OVERRIDE {
+ bool RunNextState(bool ok, HistogramEntry* entry) override {
while (true) {
switch (next_state_) {
case State::STREAM_IDLE:
@@ -506,7 +507,7 @@ class ClientRpcContextGenericStreamingImpl : public ClientRpcContext {
}
}
}
- ClientRpcContext* StartNewClone() GRPC_OVERRIDE {
+ ClientRpcContext* StartNewClone() override {
return new ClientRpcContextGenericStreamingImpl(stub_, req_, next_issue_,
start_req_, callback_);
}
@@ -543,7 +544,7 @@ static std::unique_ptr<grpc::GenericStub> GenericStubCreator(
return std::unique_ptr<grpc::GenericStub>(new grpc::GenericStub(ch));
}
-class GenericAsyncStreamingClient GRPC_FINAL
+class GenericAsyncStreamingClient final
: public AsyncClient<grpc::GenericStub, ByteBuffer> {
public:
explicit GenericAsyncStreamingClient(const ClientConfig& config)
@@ -552,7 +553,7 @@ class GenericAsyncStreamingClient GRPC_FINAL
StartThreads(num_async_threads_);
}
- ~GenericAsyncStreamingClient() GRPC_OVERRIDE {}
+ ~GenericAsyncStreamingClient() override {}
private:
static void CheckDone(grpc::Status s, ByteBuffer* response) {}
diff --git a/test/cpp/qps/client_sync.cc b/test/cpp/qps/client_sync.cc
index 0ccf4e270b..b1e61865e7 100644
--- a/test/cpp/qps/client_sync.cc
+++ b/test/cpp/qps/client_sync.cc
@@ -108,10 +108,10 @@ class SynchronousClient
std::vector<SimpleResponse> responses_;
private:
- void DestroyMultithreading() GRPC_OVERRIDE GRPC_FINAL { EndThreads(); }
+ void DestroyMultithreading() override final { EndThreads(); }
};
-class SynchronousUnaryClient GRPC_FINAL : public SynchronousClient {
+class SynchronousUnaryClient final : public SynchronousClient {
public:
SynchronousUnaryClient(const ClientConfig& config)
: SynchronousClient(config) {
@@ -119,7 +119,7 @@ class SynchronousUnaryClient GRPC_FINAL : public SynchronousClient {
}
~SynchronousUnaryClient() {}
- bool ThreadFunc(HistogramEntry* entry, size_t thread_idx) GRPC_OVERRIDE {
+ bool ThreadFunc(HistogramEntry* entry, size_t thread_idx) override {
if (!WaitToIssue(thread_idx)) {
return true;
}
@@ -130,21 +130,17 @@ class SynchronousUnaryClient GRPC_FINAL : public SynchronousClient {
grpc::Status s =
stub->UnaryCall(&context, request_, &responses_[thread_idx]);
entry->set_value((UsageTimer::Now() - start) * 1e9);
- if (!s.ok()) {
- gpr_log(GPR_ERROR, "RPC error: %d: %s", s.error_code(),
- s.error_message().c_str());
- }
- return s.ok();
+ entry->set_status(s.error_code());
+ return true;
}
};
-class SynchronousStreamingClient GRPC_FINAL : public SynchronousClient {
+class SynchronousStreamingClient final : public SynchronousClient {
public:
SynchronousStreamingClient(const ClientConfig& config)
- : SynchronousClient(config) {
- context_ = new grpc::ClientContext[num_threads_];
- stream_ = new std::unique_ptr<
- grpc::ClientReaderWriter<SimpleRequest, SimpleResponse>>[num_threads_];
+ : SynchronousClient(config),
+ context_(num_threads_),
+ stream_(num_threads_) {
for (size_t thread_idx = 0; thread_idx < num_threads_; thread_idx++) {
auto* stub = channels_[thread_idx % channels_.size()].get_stub();
stream_[thread_idx] = stub->StreamingCall(&context_[thread_idx]);
@@ -164,11 +160,9 @@ class SynchronousStreamingClient GRPC_FINAL : public SynchronousClient {
}
}
}
- delete[] stream_;
- delete[] context_;
}
- bool ThreadFunc(HistogramEntry* entry, size_t thread_idx) GRPC_OVERRIDE {
+ bool ThreadFunc(HistogramEntry* entry, size_t thread_idx) override {
if (!WaitToIssue(thread_idx)) {
return true;
}
@@ -185,8 +179,9 @@ class SynchronousStreamingClient GRPC_FINAL : public SynchronousClient {
private:
// These are both conceptually std::vector but cannot be for old compilers
// that expect contained classes to support copy constructors
- grpc::ClientContext* context_;
- std::unique_ptr<grpc::ClientReaderWriter<SimpleRequest, SimpleResponse>>*
+ std::vector<grpc::ClientContext> context_;
+ std::vector<
+ std::unique_ptr<grpc::ClientReaderWriter<SimpleRequest, SimpleResponse>>>
stream_;
};
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index 6c675e3483..93ef32db77 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -44,6 +44,7 @@
#include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/support/env.h"
@@ -99,23 +100,36 @@ static std::unordered_map<string, std::deque<int>> get_hosts_and_cores(
return hosts;
}
-static deque<string> get_workers(const string& name) {
- char* env = gpr_getenv(name.c_str());
- if (!env) return deque<string>();
-
+static deque<string> get_workers(const string& env_name) {
+ char* env = gpr_getenv(env_name.c_str());
+ if (!env) {
+ env = gpr_strdup("");
+ }
deque<string> out;
char* p = env;
- for (;;) {
- char* comma = strchr(p, ',');
- if (comma) {
- out.emplace_back(p, comma);
- p = comma + 1;
- } else {
- out.emplace_back(p);
- gpr_free(env);
- return out;
+ if (strlen(env) != 0) {
+ for (;;) {
+ char* comma = strchr(p, ',');
+ if (comma) {
+ out.emplace_back(p, comma);
+ p = comma + 1;
+ } else {
+ out.emplace_back(p);
+ break;
+ }
}
}
+ if (out.size() == 0) {
+ gpr_log(GPR_ERROR,
+ "Environment variable \"%s\" does not contain a list of QPS "
+ "workers to use. Set it to a comma-separated list of "
+ "hostname:port pairs, starting with hosts that should act as "
+ "servers. E.g. export "
+ "%s=\"serverhost1:1234,clienthost1:1234,clienthost2:1234\"",
+ env_name.c_str(), env_name.c_str());
+ }
+ gpr_free(env);
+ return out;
}
// helpers for postprocess_scenario_result
@@ -125,6 +139,8 @@ static double UserTime(ClientStats s) { return s.time_user(); }
static double ServerWallTime(ServerStats s) { return s.time_elapsed(); }
static double ServerSystemTime(ServerStats s) { return s.time_system(); }
static double ServerUserTime(ServerStats s) { return s.time_user(); }
+static double ServerTotalCpuTime(ServerStats s) { return s.total_cpu_time(); }
+static double ServerIdleCpuTime(ServerStats s) { return s.idle_cpu_time(); }
static int Cores(int n) { return n; }
// Postprocess ScenarioResult and populate result summary.
@@ -132,7 +148,8 @@ static void postprocess_scenario_result(ScenarioResult* result) {
Histogram histogram;
histogram.MergeProto(result->latencies());
- auto qps = histogram.Count() / average(result->client_stats(), WallTime);
+ auto time_estimate = average(result->client_stats(), WallTime);
+ auto qps = histogram.Count() / time_estimate;
auto qps_per_server_core = qps / sum(result->server_cores(), Cores);
result->mutable_summary()->set_qps(qps);
@@ -148,6 +165,7 @@ static void postprocess_scenario_result(ScenarioResult* result) {
sum(result->server_stats(), ServerWallTime);
auto server_user_time = 100.0 * sum(result->server_stats(), ServerUserTime) /
sum(result->server_stats(), ServerWallTime);
+
auto client_system_time = 100.0 * sum(result->client_stats(), SystemTime) /
sum(result->client_stats(), WallTime);
auto client_user_time = 100.0 * sum(result->client_stats(), UserTime) /
@@ -157,41 +175,53 @@ static void postprocess_scenario_result(ScenarioResult* result) {
result->mutable_summary()->set_server_user_time(server_user_time);
result->mutable_summary()->set_client_system_time(client_system_time);
result->mutable_summary()->set_client_user_time(client_user_time);
-}
-
-// Namespace for classes and functions used only in RunScenario
-// Using this rather than local definitions to workaround gcc-4.4 limitations
-// regarding using templates without linkage
-namespace runsc {
-
-// ClientContext allocator
-static ClientContext* AllocContext(list<ClientContext>* contexts) {
- contexts->emplace_back();
- auto context = &contexts->back();
- context->set_wait_for_ready(true);
- return context;
-}
-struct ServerData {
- unique_ptr<WorkerService::Stub> stub;
- unique_ptr<ClientReaderWriter<ServerArgs, ServerStatus>> stream;
-};
+ // For Non-linux platform, get_cpu_usage() is not implemented. Thus,
+ // ServerTotalCpuTime and ServerIdleCpuTime are both 0.
+ if (average(result->server_stats(), ServerTotalCpuTime) == 0) {
+ result->mutable_summary()->set_server_cpu_usage(0);
+ } else {
+ auto server_cpu_usage =
+ 100 -
+ 100 * average(result->server_stats(), ServerIdleCpuTime) /
+ average(result->server_stats(), ServerTotalCpuTime);
+ result->mutable_summary()->set_server_cpu_usage(server_cpu_usage);
+ }
-struct ClientData {
- unique_ptr<WorkerService::Stub> stub;
- unique_ptr<ClientReaderWriter<ClientArgs, ClientStatus>> stream;
-};
-} // namespace runsc
+ if (result->request_results_size() > 0) {
+ int64_t successes = 0;
+ int64_t failures = 0;
+ for (int i = 0; i < result->request_results_size(); i++) {
+ RequestResultCount rrc = result->request_results(i);
+ if (rrc.status_code() == 0) {
+ successes += rrc.count();
+ } else {
+ failures += rrc.count();
+ }
+ }
+ result->mutable_summary()->set_successful_requests_per_second(
+ successes / time_estimate);
+ result->mutable_summary()->set_failed_requests_per_second(failures /
+ time_estimate);
+ }
+}
std::unique_ptr<ScenarioResult> RunScenario(
const ClientConfig& initial_client_config, size_t num_clients,
const ServerConfig& initial_server_config, size_t num_servers,
- int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count) {
+ int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count,
+ const char* qps_server_target_override, bool configure_core_lists) {
// Log everything from the driver
gpr_set_log_verbosity(GPR_LOG_SEVERITY_DEBUG);
// ClientContext allocations (all are destroyed at scope exit)
list<ClientContext> contexts;
+ auto alloc_context = [](list<ClientContext>* contexts) {
+ contexts->emplace_back();
+ auto context = &contexts->back();
+ context->set_wait_for_ready(true);
+ return context;
+ };
// To be added to the result, containing the final configuration used for
// client and config (including host, etc.)
@@ -225,9 +255,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
workers.push_back(addr);
}
}
-
- // Setup the hosts and core counts
- auto hosts_cores = get_hosts_and_cores(workers);
+ GPR_ASSERT(workers.size() != 0);
// if num_clients is set to <=0, do dynamic sizing: all workers
// except for servers are clients
@@ -244,10 +272,16 @@ std::unique_ptr<ScenarioResult> RunScenario(
workers.resize(num_clients + num_servers);
// Start servers
- using runsc::ServerData;
- // servers is array rather than std::vector to avoid gcc-4.4 issues
- // where class contained in std::vector must have a copy constructor
- auto* servers = new ServerData[num_servers];
+ struct ServerData {
+ unique_ptr<WorkerService::Stub> stub;
+ unique_ptr<ClientReaderWriter<ServerArgs, ServerStatus>> stream;
+ };
+ std::vector<ServerData> servers(num_servers);
+ std::unordered_map<string, std::deque<int>> hosts_cores;
+
+ if (configure_core_lists) {
+ hosts_cores = get_hosts_and_cores(workers);
+ }
for (size_t i = 0; i < num_servers; i++) {
gpr_log(GPR_INFO, "Starting server on %s (worker #%" PRIuPTR ")",
workers[i].c_str(), i);
@@ -255,44 +289,42 @@ std::unique_ptr<ScenarioResult> RunScenario(
CreateChannel(workers[i], InsecureChannelCredentials()));
ServerConfig server_config = initial_server_config;
- char* host;
- char* driver_port;
- char* cli_target;
- gpr_split_host_port(workers[i].c_str(), &host, &driver_port);
- string host_str(host);
int server_core_limit = initial_server_config.core_limit();
int client_core_limit = initial_client_config.core_limit();
- if (server_core_limit == 0 && client_core_limit > 0) {
- // In this case, limit the server cores if it matches the
- // same host as one or more clients
- const auto& dq = hosts_cores.at(host_str);
- bool match = false;
- int limit = dq.size();
- for (size_t cli = 0; cli < num_clients; cli++) {
- if (host_str == get_host(workers[cli + num_servers])) {
- limit -= client_core_limit;
- match = true;
+ if (configure_core_lists) {
+ string host_str(get_host(workers[i]));
+ if (server_core_limit == 0 && client_core_limit > 0) {
+ // In this case, limit the server cores if it matches the
+ // same host as one or more clients
+ const auto& dq = hosts_cores.at(host_str);
+ bool match = false;
+ int limit = dq.size();
+ for (size_t cli = 0; cli < num_clients; cli++) {
+ if (host_str == get_host(workers[cli + num_servers])) {
+ limit -= client_core_limit;
+ match = true;
+ }
+ }
+ if (match) {
+ GPR_ASSERT(limit > 0);
+ server_core_limit = limit;
}
}
- if (match) {
- GPR_ASSERT(limit > 0);
- server_core_limit = limit;
- }
- }
- if (server_core_limit > 0) {
- auto& dq = hosts_cores.at(host_str);
- GPR_ASSERT(dq.size() >= static_cast<size_t>(server_core_limit));
- for (int core = 0; core < server_core_limit; core++) {
- server_config.add_core_list(dq.front());
- dq.pop_front();
+ if (server_core_limit > 0) {
+ auto& dq = hosts_cores.at(host_str);
+ GPR_ASSERT(dq.size() >= static_cast<size_t>(server_core_limit));
+ gpr_log(GPR_INFO, "Setting server core_list");
+ for (int core = 0; core < server_core_limit; core++) {
+ server_config.add_core_list(dq.front());
+ dq.pop_front();
+ }
}
}
ServerArgs args;
*args.mutable_setup() = server_config;
- servers[i].stream =
- servers[i].stub->RunServer(runsc::AllocContext(&contexts));
+ servers[i].stream = servers[i].stub->RunServer(alloc_context(&contexts));
if (!servers[i].stream->Write(args)) {
gpr_log(GPR_ERROR, "Could not write args to server %zu", i);
}
@@ -300,20 +332,29 @@ std::unique_ptr<ScenarioResult> RunScenario(
if (!servers[i].stream->Read(&init_status)) {
gpr_log(GPR_ERROR, "Server %zu did not yield initial status", i);
}
- gpr_join_host_port(&cli_target, host, init_status.port());
- client_config.add_server_targets(cli_target);
- gpr_free(host);
- gpr_free(driver_port);
- gpr_free(cli_target);
+ if (qps_server_target_override != NULL &&
+ strlen(qps_server_target_override) > 0) {
+ // overriding the qps server target only works if there is 1 server
+ GPR_ASSERT(num_servers == 1);
+ client_config.add_server_targets(qps_server_target_override);
+ } else {
+ std::string host;
+ char* cli_target;
+ host = get_host(workers[i]);
+ gpr_join_host_port(&cli_target, host.c_str(), init_status.port());
+ client_config.add_server_targets(cli_target);
+ gpr_free(cli_target);
+ }
}
// Targets are all set by now
result_client_config = client_config;
// Start clients
- using runsc::ClientData;
- // clients is array rather than std::vector to avoid gcc-4.4 issues
- // where class contained in std::vector must have a copy constructor
- auto* clients = new ClientData[num_clients];
+ struct ClientData {
+ unique_ptr<WorkerService::Stub> stub;
+ unique_ptr<ClientReaderWriter<ClientArgs, ClientStatus>> stream;
+ };
+ std::vector<ClientData> clients(num_clients);
size_t channels_allocated = 0;
for (size_t i = 0; i < num_clients; i++) {
const auto& worker = workers[i + num_servers];
@@ -325,7 +366,8 @@ std::unique_ptr<ScenarioResult> RunScenario(
int server_core_limit = initial_server_config.core_limit();
int client_core_limit = initial_client_config.core_limit();
- if ((server_core_limit > 0) || (client_core_limit > 0)) {
+ if (configure_core_lists &&
+ ((server_core_limit > 0) || (client_core_limit > 0))) {
auto& dq = hosts_cores.at(get_host(worker));
if (client_core_limit == 0) {
// limit client cores if it matches a server host
@@ -343,6 +385,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
}
if (client_core_limit > 0) {
GPR_ASSERT(dq.size() >= static_cast<size_t>(client_core_limit));
+ gpr_log(GPR_INFO, "Setting client core_list");
for (int core = 0; core < client_core_limit; core++) {
per_client_config.add_core_list(dq.front());
dq.pop_front();
@@ -362,8 +405,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
ClientArgs args;
*args.mutable_setup() = per_client_config;
- clients[i].stream =
- clients[i].stub->RunClient(runsc::AllocContext(&contexts));
+ clients[i].stream = clients[i].stub->RunClient(alloc_context(&contexts));
if (!clients[i].stream->Write(args)) {
gpr_log(GPR_ERROR, "Could not write args to client %zu", i);
}
@@ -444,6 +486,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
// Finish a run
std::unique_ptr<ScenarioResult> result(new ScenarioResult);
Histogram merged_latencies;
+ std::unordered_map<int, int64_t> merged_statuses;
gpr_log(GPR_INFO, "Finishing clients");
for (size_t i = 0; i < num_clients; i++) {
@@ -462,6 +505,10 @@ std::unique_ptr<ScenarioResult> RunScenario(
gpr_log(GPR_INFO, "Received final status from client %zu", i);
const auto& stats = client_status.stats();
merged_latencies.MergeProto(stats.latencies());
+ for (int i = 0; i < stats.request_results_size(); i++) {
+ merged_statuses[stats.request_results(i).status_code()] +=
+ stats.request_results(i).count();
+ }
result->add_client_stats()->CopyFrom(stats);
// That final status should be the last message on the client stream
GPR_ASSERT(!client->stream->Read(&client_status));
@@ -478,9 +525,14 @@ std::unique_ptr<ScenarioResult> RunScenario(
s.error_message().c_str());
}
}
- delete[] clients;
merged_latencies.FillProto(result->mutable_latencies());
+ for (std::unordered_map<int, int64_t>::iterator it = merged_statuses.begin();
+ it != merged_statuses.end(); ++it) {
+ RequestResultCount* rrc = result->add_request_results();
+ rrc->set_status_code(it->first);
+ rrc->set_count(it->second);
+ }
gpr_log(GPR_INFO, "Finishing servers");
for (size_t i = 0; i < num_servers; i++) {
@@ -515,8 +567,6 @@ std::unique_ptr<ScenarioResult> RunScenario(
}
}
- delete[] servers;
-
postprocess_scenario_result(result.get());
return result;
}
@@ -525,6 +575,9 @@ bool RunQuit() {
// Get client, server lists
bool result = true;
auto workers = get_workers("QPS_WORKERS");
+ if (workers.size() == 0) {
+ return false;
+ }
for (size_t i = 0; i < workers.size(); i++) {
auto stub = WorkerService::NewStub(
CreateChannel(workers[i], InsecureChannelCredentials()));
diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h
index 93f4370caf..b5c8152e1b 100644
--- a/test/cpp/qps/driver.h
+++ b/test/cpp/qps/driver.h
@@ -45,7 +45,9 @@ namespace testing {
std::unique_ptr<ScenarioResult> RunScenario(
const grpc::testing::ClientConfig& client_config, size_t num_clients,
const grpc::testing::ServerConfig& server_config, size_t num_servers,
- int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count);
+ int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count,
+ const char* qps_server_target_override = "",
+ bool configure_core_lists = true);
bool RunQuit();
} // namespace testing
diff --git a/test/cpp/qps/gen_build_yaml.py b/test/cpp/qps/gen_build_yaml.py
index 369da2c8ca..188d6196e5 100755
--- a/test/cpp/qps/gen_build_yaml.py
+++ b/test/cpp/qps/gen_build_yaml.py
@@ -43,28 +43,38 @@ sys.path.append(run_tests_root)
import performance.scenario_config as scenario_config
-def _scenario_json_string(scenario_json):
+configs_from_yaml = yaml.load(open(os.path.join(os.path.dirname(sys.argv[0]), '../../../build.yaml')))['configs'].keys()
+
+def mutate_scenario(scenario_json, is_tsan):
# tweak parameters to get fast test times
+ scenario_json = dict(scenario_json)
scenario_json['warmup_seconds'] = 0
scenario_json['benchmark_seconds'] = 1
- scenarios_json = {'scenarios': [scenario_config.remove_nonproto_fields(scenario_json)]}
+ outstanding_rpcs_divisor = 1
+ if is_tsan and (
+ scenario_json['client_config']['client_type'] == 'SYNC_CLIENT' or
+ scenario_json['server_config']['server_type'] == 'SYNC_SERVER'):
+ outstanding_rpcs_divisor = 10
+ scenario_json['client_config']['outstanding_rpcs_per_channel'] = max(1,
+ int(scenario_json['client_config']['outstanding_rpcs_per_channel'] / outstanding_rpcs_divisor))
+ return scenario_json
+
+def _scenario_json_string(scenario_json, is_tsan):
+ scenarios_json = {'scenarios': [scenario_config.remove_nonproto_fields(mutate_scenario(scenario_json, is_tsan))]}
return json.dumps(scenarios_json)
-def threads_of_type(scenario_json, path):
- d = scenario_json
- for el in path.split('/'):
- if el not in d:
- return 0
- d = d[el]
- return d
+def threads_required(scenario_json, where, is_tsan):
+ scenario_json = mutate_scenario(scenario_json, is_tsan)
+ if scenario_json['%s_config' % where]['%s_type' % where] == 'ASYNC_%s' % where.upper():
+ return scenario_json['%s_config' % where].get('async_%s_threads' % where, 0)
+ return scenario_json['client_config']['outstanding_rpcs_per_channel'] * scenario_json['client_config']['client_channels']
-def guess_cpu(scenario_json):
- client = threads_of_type(scenario_json, 'client_config/async_client_threads')
- server = threads_of_type(scenario_json, 'server_config/async_server_threads')
+def guess_cpu(scenario_json, is_tsan):
+ client = threads_required(scenario_json, 'client', is_tsan)
+ server = threads_required(scenario_json, 'server', is_tsan)
# make an arbitrary guess if set to auto-detect
# about the size of the jenkins instances we have for unit tests
- if client == 0: client = 8
- if server == 0: server = 8
+ if client == 0 or server == 0: return 'capacity'
return (scenario_json['num_clients'] * client +
scenario_json['num_servers'] * server)
@@ -73,16 +83,33 @@ print yaml.dump({
{
'name': 'json_run_localhost',
'shortname': 'json_run_localhost:%s' % scenario_json['name'],
- 'args': ['--scenarios_json', _scenario_json_string(scenario_json)],
+ 'args': ['--scenarios_json', _scenario_json_string(scenario_json, False)],
+ 'ci_platforms': ['linux'],
+ 'platforms': ['linux'],
+ 'flaky': False,
+ 'language': 'c++',
+ 'boringssl': True,
+ 'defaults': 'boringssl',
+ 'cpu_cost': guess_cpu(scenario_json, False),
+ 'exclude_configs': ['tsan', 'asan'],
+ 'timeout_seconds': 6*60
+ }
+ for scenario_json in scenario_config.CXXLanguage().scenarios()
+ if 'scalable' in scenario_json.get('CATEGORIES', [])
+ ] + [
+ {
+ 'name': 'json_run_localhost',
+ 'shortname': 'json_run_localhost:%s_low_thread_count' % scenario_json['name'],
+ 'args': ['--scenarios_json', _scenario_json_string(scenario_json, True)],
'ci_platforms': ['linux'],
'platforms': ['linux'],
'flaky': False,
'language': 'c++',
'boringssl': True,
'defaults': 'boringssl',
- 'cpu_cost': guess_cpu(scenario_json),
- 'exclude_configs': [],
- 'timeout_seconds': 3*60
+ 'cpu_cost': guess_cpu(scenario_json, True),
+ 'exclude_configs': sorted(c for c in configs_from_yaml if c not in ('tsan', 'asan')),
+ 'timeout_seconds': 6*60
}
for scenario_json in scenario_config.CXXLanguage().scenarios()
if 'scalable' in scenario_json.get('CATEGORIES', [])
diff --git a/test/cpp/qps/interarrival.h b/test/cpp/qps/interarrival.h
index 0980d5e8ba..4bef06f566 100644
--- a/test/cpp/qps/interarrival.h
+++ b/test/cpp/qps/interarrival.h
@@ -69,11 +69,11 @@ inline RandomDistInterface::~RandomDistInterface() {}
// independent identical stationary sources. For more information,
// see http://en.wikipedia.org/wiki/Exponential_distribution
-class ExpDist GRPC_FINAL : public RandomDistInterface {
+class ExpDist final : public RandomDistInterface {
public:
explicit ExpDist(double lambda) : lambda_recip_(1.0 / lambda) {}
- ~ExpDist() GRPC_OVERRIDE {}
- double transform(double uni) const GRPC_OVERRIDE {
+ ~ExpDist() override {}
+ double transform(double uni) const override {
// Note: Use 1.0-uni above to avoid NaN if uni is 0
return lambda_recip_ * (-log(1.0 - uni));
}
diff --git a/test/cpp/qps/json_run_localhost.cc b/test/cpp/qps/json_run_localhost.cc
index 74e40fbf1a..b7b2553f12 100644
--- a/test/cpp/qps/json_run_localhost.cc
+++ b/test/cpp/qps/json_run_localhost.cc
@@ -31,7 +31,11 @@
*
*/
+#include <signal.h>
+#include <string.h>
+
#include <memory>
+#include <mutex>
#include <sstream>
#include <string>
@@ -43,6 +47,11 @@
using grpc::SubProcess;
+constexpr auto kNumWorkers = 2;
+
+static SubProcess* g_driver;
+static SubProcess* g_workers[kNumWorkers];
+
template <class T>
std::string as_string(const T& val) {
std::ostringstream out;
@@ -50,9 +59,38 @@ std::string as_string(const T& val) {
return out.str();
}
+static void sighandler(int sig) {
+ const int errno_saved = errno;
+ if (g_driver != NULL) g_driver->Interrupt();
+ for (int i = 0; i < kNumWorkers; ++i) {
+ if (g_workers[i]) g_workers[i]->Interrupt();
+ }
+ errno = errno_saved;
+}
+
+static void register_sighandler() {
+ struct sigaction act;
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sighandler;
+
+ sigaction(SIGINT, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
+}
+
+static void LogStatus(int status, const char* label) {
+ if (WIFEXITED(status)) {
+ gpr_log(GPR_INFO, "%s: subprocess exited with status %d", label,
+ WEXITSTATUS(status));
+ } else if (WIFSIGNALED(status)) {
+ gpr_log(GPR_INFO, "%s: subprocess terminated with signal %d", label,
+ WTERMSIG(status));
+ } else {
+ gpr_log(GPR_INFO, "%s: unknown subprocess status: %d", label, status);
+ }
+}
+
int main(int argc, char** argv) {
- typedef std::unique_ptr<SubProcess> SubProcessPtr;
- std::vector<SubProcessPtr> jobs;
+ register_sighandler();
std::string my_bin = argv[0];
std::string bin_dir = my_bin.substr(0, my_bin.rfind('/'));
@@ -60,11 +98,11 @@ int main(int argc, char** argv) {
std::ostringstream env;
bool first = true;
- for (int i = 0; i < 2; i++) {
- auto port = grpc_pick_unused_port_or_die();
+ for (int i = 0; i < kNumWorkers; i++) {
+ const auto port = grpc_pick_unused_port_or_die();
std::vector<std::string> args = {bin_dir + "/qps_worker", "-driver_port",
as_string(port)};
- jobs.emplace_back(new SubProcess(args));
+ g_workers[i] = new SubProcess(args);
if (!first) env << ",";
env << "localhost:" << port;
first = false;
@@ -75,12 +113,27 @@ int main(int argc, char** argv) {
for (int i = 1; i < argc; i++) {
args.push_back(argv[i]);
}
- GPR_ASSERT(SubProcess(args).Join() == 0);
- for (auto it = jobs.begin(); it != jobs.end(); ++it) {
- (*it)->Interrupt();
+ g_driver = new SubProcess(args);
+ const int driver_join_status = g_driver->Join();
+ if (driver_join_status != 0) {
+ LogStatus(driver_join_status, "driver");
}
- for (auto it = jobs.begin(); it != jobs.end(); ++it) {
- (*it)->Join();
+ for (int i = 0; i < kNumWorkers; ++i) {
+ if (g_workers[i]) g_workers[i]->Interrupt();
}
+
+ for (int i = 0; i < kNumWorkers; ++i) {
+ if (g_workers[i]) {
+ const int worker_status = g_workers[i]->Join();
+ if (worker_status != 0) {
+ LogStatus(worker_status, "worker");
+ }
+ }
+ }
+
+ delete g_driver;
+ g_driver = NULL;
+ for (int i = 0; i < kNumWorkers; ++i) delete g_workers[i];
+ GPR_ASSERT(driver_join_status == 0);
}
diff --git a/test/cpp/qps/qps_json_driver.cc b/test/cpp/qps/qps_json_driver.cc
index 1524ebbc38..da835b995a 100644
--- a/test/cpp/qps/qps_json_driver.cc
+++ b/test/cpp/qps/qps_json_driver.cc
@@ -49,10 +49,119 @@ DEFINE_string(scenarios_file, "",
DEFINE_string(scenarios_json, "",
"JSON string containing an array of Scenario objects");
DEFINE_bool(quit, false, "Quit the workers");
+DEFINE_string(search_param, "",
+ "The parameter, whose value is to be searched for to achieve "
+ "targeted cpu load. For now, we have 'offered_load'. Later, "
+ "'num_channels', 'num_outstanding_requests', etc. shall be "
+ "added.");
+DEFINE_double(
+ initial_search_value, 0.0,
+ "initial parameter value to start the search with (i.e. lower bound)");
+DEFINE_double(targeted_cpu_load, 70.0,
+ "Targeted cpu load (unit: %, range [0,100])");
+DEFINE_double(stride, 1,
+ "Defines each stride of the search. The larger the stride is, "
+ "the coarser the result will be, but will also be faster.");
+DEFINE_double(error_tolerance, 0.01,
+ "Defines threshold for stopping the search. When current search "
+ "range is narrower than the error_tolerance computed range, we "
+ "stop the search.");
+
+DEFINE_string(qps_server_target_override, "",
+ "Override QPS server target to configure in client configs."
+ "Only applicable if there is a single benchmark server.");
+DEFINE_bool(configure_core_lists, true,
+ "Provide 'core_list' parameters to workers. Value determined "
+ "by cores available and 'core_limit' parameters of the scenarios.");
namespace grpc {
namespace testing {
+static std::unique_ptr<ScenarioResult> RunAndReport(const Scenario& scenario,
+ bool* success) {
+ std::cerr << "RUNNING SCENARIO: " << scenario.name() << "\n";
+ auto result = RunScenario(
+ scenario.client_config(), scenario.num_clients(),
+ scenario.server_config(), scenario.num_servers(),
+ scenario.warmup_seconds(), scenario.benchmark_seconds(),
+ scenario.spawn_local_worker_count(),
+ FLAGS_qps_server_target_override.c_str(), FLAGS_configure_core_lists);
+
+ // Amend the result with scenario config. Eventually we should adjust
+ // RunScenario contract so we don't need to touch the result here.
+ result->mutable_scenario()->CopyFrom(scenario);
+
+ GetReporter()->ReportQPS(*result);
+ GetReporter()->ReportQPSPerCore(*result);
+ GetReporter()->ReportLatency(*result);
+ GetReporter()->ReportTimes(*result);
+ GetReporter()->ReportCpuUsage(*result);
+
+ for (int i = 0; *success && i < result->client_success_size(); i++) {
+ *success = result->client_success(i);
+ }
+ for (int i = 0; *success && i < result->server_success_size(); i++) {
+ *success = result->server_success(i);
+ }
+
+ return result;
+}
+
+static double GetCpuLoad(Scenario* scenario, double offered_load,
+ bool* success) {
+ scenario->mutable_client_config()
+ ->mutable_load_params()
+ ->mutable_poisson()
+ ->set_offered_load(offered_load);
+ auto result = RunAndReport(*scenario, success);
+ return result->summary().server_cpu_usage();
+}
+
+static double BinarySearch(Scenario* scenario, double targeted_cpu_load,
+ double low, double high, bool* success) {
+ while (low <= high * (1 - FLAGS_error_tolerance)) {
+ double mid = low + (high - low) / 2;
+ double current_cpu_load = GetCpuLoad(scenario, mid, success);
+ gpr_log(GPR_DEBUG, "Binary Search: current_offered_load %.0f", mid);
+ if (!*success) {
+ gpr_log(GPR_ERROR, "Client/Server Failure");
+ break;
+ }
+ if (targeted_cpu_load <= current_cpu_load) {
+ high = mid - FLAGS_stride;
+ } else {
+ low = mid + FLAGS_stride;
+ }
+ }
+
+ return low;
+}
+
+static double SearchOfferedLoad(double initial_offered_load,
+ double targeted_cpu_load, Scenario* scenario,
+ bool* success) {
+ std::cerr << "RUNNING SCENARIO: " << scenario->name() << "\n";
+ double current_offered_load = initial_offered_load;
+ double current_cpu_load = GetCpuLoad(scenario, current_offered_load, success);
+ if (current_cpu_load > targeted_cpu_load) {
+ gpr_log(GPR_ERROR, "Initial offered load too high");
+ return -1;
+ }
+
+ while (*success && (current_cpu_load < targeted_cpu_load)) {
+ current_offered_load *= 2;
+ current_cpu_load = GetCpuLoad(scenario, current_offered_load, success);
+ gpr_log(GPR_DEBUG, "Binary Search: current_offered_load %.0f",
+ current_offered_load);
+ }
+
+ double targeted_offered_load =
+ BinarySearch(scenario, targeted_cpu_load, current_offered_load / 2,
+ current_offered_load, success);
+
+ return targeted_offered_load;
+}
+
static bool QpsDriver() {
grpc::string json;
@@ -68,11 +177,11 @@ static bool QpsDriver() {
if (scfile) {
// Read the json data from disk
- FILE *json_file = fopen(FLAGS_scenarios_file.c_str(), "r");
+ FILE* json_file = fopen(FLAGS_scenarios_file.c_str(), "r");
GPR_ASSERT(json_file != NULL);
fseek(json_file, 0, SEEK_END);
long len = ftell(json_file);
- char *data = new char[len];
+ char* data = new char[len];
fseek(json_file, 0, SEEK_SET);
GPR_ASSERT(len == (long)fread(data, 1, len, json_file));
fclose(json_file);
@@ -93,28 +202,19 @@ static bool QpsDriver() {
GPR_ASSERT(scenarios.scenarios_size() > 0);
for (int i = 0; i < scenarios.scenarios_size(); i++) {
- const Scenario &scenario = scenarios.scenarios(i);
- std::cerr << "RUNNING SCENARIO: " << scenario.name() << "\n";
- auto result =
- RunScenario(scenario.client_config(), scenario.num_clients(),
- scenario.server_config(), scenario.num_servers(),
- scenario.warmup_seconds(), scenario.benchmark_seconds(),
- scenario.spawn_local_worker_count());
-
- // Amend the result with scenario config. Eventually we should adjust
- // RunScenario contract so we don't need to touch the result here.
- result->mutable_scenario()->CopyFrom(scenario);
-
- GetReporter()->ReportQPS(*result);
- GetReporter()->ReportQPSPerCore(*result);
- GetReporter()->ReportLatency(*result);
- GetReporter()->ReportTimes(*result);
-
- for (int i = 0; success && i < result->client_success_size(); i++) {
- success = result->client_success(i);
- }
- for (int i = 0; success && i < result->server_success_size(); i++) {
- success = result->server_success(i);
+ if (FLAGS_search_param == "") {
+ const Scenario& scenario = scenarios.scenarios(i);
+ RunAndReport(scenario, &success);
+ } else {
+ if (FLAGS_search_param == "offered_load") {
+ Scenario* scenario = scenarios.mutable_scenarios(i);
+ double targeted_offered_load =
+ SearchOfferedLoad(FLAGS_initial_search_value,
+ FLAGS_targeted_cpu_load, scenario, &success);
+ gpr_log(GPR_INFO, "targeted_offered_load %f", targeted_offered_load);
+ } else {
+ gpr_log(GPR_ERROR, "Unimplemented search param");
+ }
}
}
return success;
@@ -123,7 +223,7 @@ static bool QpsDriver() {
} // namespace testing
} // namespace grpc
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
grpc::testing::InitBenchmark(&argc, &argv, true);
bool ok = grpc::testing::QpsDriver();
diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc
index d3e53fe14a..d437920e68 100644
--- a/test/cpp/qps/qps_worker.cc
+++ b/test/cpp/qps/qps_worker.cc
@@ -100,7 +100,7 @@ static std::unique_ptr<Server> CreateServer(const ServerConfig& config) {
abort();
}
-class ScopedProfile GRPC_FINAL {
+class ScopedProfile final {
public:
ScopedProfile(const char* filename, bool enable) : enable_(enable) {
if (enable_) grpc_profiler_start(filename);
@@ -113,14 +113,14 @@ class ScopedProfile GRPC_FINAL {
const bool enable_;
};
-class WorkerServiceImpl GRPC_FINAL : public WorkerService::Service {
+class WorkerServiceImpl final : public WorkerService::Service {
public:
WorkerServiceImpl(int server_port, QpsWorker* worker)
: acquired_(false), server_port_(server_port), worker_(worker) {}
- Status RunClient(ServerContext* ctx,
- ServerReaderWriter<ClientStatus, ClientArgs>* stream)
- GRPC_OVERRIDE {
+ Status RunClient(
+ ServerContext* ctx,
+ ServerReaderWriter<ClientStatus, ClientArgs>* stream) override {
InstanceGuard g(this);
if (!g.Acquired()) {
return Status(StatusCode::RESOURCE_EXHAUSTED, "Client worker busy");
@@ -132,9 +132,9 @@ class WorkerServiceImpl GRPC_FINAL : public WorkerService::Service {
return ret;
}
- Status RunServer(ServerContext* ctx,
- ServerReaderWriter<ServerStatus, ServerArgs>* stream)
- GRPC_OVERRIDE {
+ Status RunServer(
+ ServerContext* ctx,
+ ServerReaderWriter<ServerStatus, ServerArgs>* stream) override {
InstanceGuard g(this);
if (!g.Acquired()) {
return Status(StatusCode::RESOURCE_EXHAUSTED, "Server worker busy");
@@ -147,12 +147,12 @@ class WorkerServiceImpl GRPC_FINAL : public WorkerService::Service {
}
Status CoreCount(ServerContext* ctx, const CoreRequest*,
- CoreResponse* resp) GRPC_OVERRIDE {
+ CoreResponse* resp) override {
resp->set_cores(gpr_cpu_num_cores());
return Status::OK;
}
- Status QuitWorker(ServerContext* ctx, const Void*, Void*) GRPC_OVERRIDE {
+ Status QuitWorker(ServerContext* ctx, const Void*, Void*) override {
InstanceGuard g(this);
if (!g.Acquired()) {
return Status(StatusCode::RESOURCE_EXHAUSTED, "Quitting worker busy");
diff --git a/test/cpp/qps/report.cc b/test/cpp/qps/report.cc
index 2ec7d8676c..7f84816421 100644
--- a/test/cpp/qps/report.cc
+++ b/test/cpp/qps/report.cc
@@ -71,8 +71,20 @@ void CompositeReporter::ReportTimes(const ScenarioResult& result) {
}
}
+void CompositeReporter::ReportCpuUsage(const ScenarioResult& result) {
+ for (size_t i = 0; i < reporters_.size(); ++i) {
+ reporters_[i]->ReportCpuUsage(result);
+ }
+}
+
void GprLogReporter::ReportQPS(const ScenarioResult& result) {
gpr_log(GPR_INFO, "QPS: %.1f", result.summary().qps());
+ if (result.summary().failed_requests_per_second() > 0) {
+ gpr_log(GPR_INFO, "failed requests/second: %.1f",
+ result.summary().failed_requests_per_second());
+ gpr_log(GPR_INFO, "successful requests/second: %.1f",
+ result.summary().successful_requests_per_second());
+ }
}
void GprLogReporter::ReportQPSPerCore(const ScenarioResult& result) {
@@ -101,6 +113,11 @@ void GprLogReporter::ReportTimes(const ScenarioResult& result) {
result.summary().client_user_time());
}
+void GprLogReporter::ReportCpuUsage(const ScenarioResult& result) {
+ gpr_log(GPR_INFO, "Server CPU usage: %.2f%%",
+ result.summary().server_cpu_usage());
+}
+
void JsonReporter::ReportQPS(const ScenarioResult& result) {
grpc::string json_string =
SerializeJson(result, "type.googleapis.com/grpc.testing.ScenarioResult");
@@ -121,5 +138,9 @@ void JsonReporter::ReportTimes(const ScenarioResult& result) {
// NOP - all reporting is handled by ReportQPS.
}
+void JsonReporter::ReportCpuUsage(const ScenarioResult& result) {
+ // NOP - all reporting is handled by ReportQPS.
+}
+
} // namespace testing
} // namespace grpc
diff --git a/test/cpp/qps/report.h b/test/cpp/qps/report.h
index 39cf498e7b..faf87ff060 100644
--- a/test/cpp/qps/report.h
+++ b/test/cpp/qps/report.h
@@ -70,6 +70,9 @@ class Reporter {
/** Reports system and user time for client and server systems. */
virtual void ReportTimes(const ScenarioResult& result) = 0;
+ /** Reports server cpu usage. */
+ virtual void ReportCpuUsage(const ScenarioResult& result) = 0;
+
private:
const string name_;
};
@@ -82,10 +85,11 @@ class CompositeReporter : public Reporter {
/** Adds a \a reporter to the composite. */
void add(std::unique_ptr<Reporter> reporter);
- void ReportQPS(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportQPSPerCore(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportLatency(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportTimes(const ScenarioResult& result) GRPC_OVERRIDE;
+ void ReportQPS(const ScenarioResult& result) override;
+ void ReportQPSPerCore(const ScenarioResult& result) override;
+ void ReportLatency(const ScenarioResult& result) override;
+ void ReportTimes(const ScenarioResult& result) override;
+ void ReportCpuUsage(const ScenarioResult& result) override;
private:
std::vector<std::unique_ptr<Reporter> > reporters_;
@@ -97,10 +101,11 @@ class GprLogReporter : public Reporter {
GprLogReporter(const string& name) : Reporter(name) {}
private:
- void ReportQPS(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportQPSPerCore(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportLatency(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportTimes(const ScenarioResult& result) GRPC_OVERRIDE;
+ void ReportQPS(const ScenarioResult& result) override;
+ void ReportQPSPerCore(const ScenarioResult& result) override;
+ void ReportLatency(const ScenarioResult& result) override;
+ void ReportTimes(const ScenarioResult& result) override;
+ void ReportCpuUsage(const ScenarioResult& result) override;
};
/** Dumps the report to a JSON file. */
@@ -110,10 +115,11 @@ class JsonReporter : public Reporter {
: Reporter(name), report_file_(report_file) {}
private:
- void ReportQPS(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportQPSPerCore(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportLatency(const ScenarioResult& result) GRPC_OVERRIDE;
- void ReportTimes(const ScenarioResult& result) GRPC_OVERRIDE;
+ void ReportQPS(const ScenarioResult& result) override;
+ void ReportQPSPerCore(const ScenarioResult& result) override;
+ void ReportLatency(const ScenarioResult& result) override;
+ void ReportTimes(const ScenarioResult& result) override;
+ void ReportCpuUsage(const ScenarioResult& result) override;
const string report_file_;
};
diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h
index e8bc396696..c3d18e5789 100644
--- a/test/cpp/qps/server.h
+++ b/test/cpp/qps/server.h
@@ -75,6 +75,8 @@ class Server {
stats.set_time_elapsed(timer_result.wall);
stats.set_time_system(timer_result.system);
stats.set_time_user(timer_result.user);
+ stats.set_total_cpu_time(timer_result.total_cpu_time);
+ stats.set_idle_cpu_time(timer_result.idle_cpu_time);
return stats;
}
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc
index 2fcc64819b..b3a06aeaf5 100644
--- a/test/cpp/qps/server_async.cc
+++ b/test/cpp/qps/server_async.cc
@@ -38,6 +38,7 @@
#include <thread>
#include <grpc++/generic/async_generic_service.h>
+#include <grpc++/resource_quota.h>
#include <grpc++/security/server_credentials.h>
#include <grpc++/server.h>
#include <grpc++/server_builder.h>
@@ -57,7 +58,7 @@ namespace testing {
template <class RequestType, class ResponseType, class ServiceType,
class ServerContextType>
-class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
+class AsyncQpsServerTest final : public grpc::testing::Server {
public:
AsyncQpsServerTest(
const ServerConfig &config,
@@ -95,6 +96,11 @@ class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
srv_cqs_.emplace_back(builder.AddCompletionQueue());
}
+ if (config.resource_quota_size() > 0) {
+ builder.SetResourceQuota(ResourceQuota("AsyncQpsServerTest")
+ .Resize(config.resource_quota_size()));
+ }
+
server_ = builder.BuildAndStart();
using namespace std::placeholders;
@@ -190,7 +196,7 @@ class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
return reinterpret_cast<ServerRpcContext *>(tag);
}
- class ServerRpcContextUnaryImpl GRPC_FINAL : public ServerRpcContext {
+ class ServerRpcContextUnaryImpl final : public ServerRpcContext {
public:
ServerRpcContextUnaryImpl(
std::function<void(ServerContextType *, RequestType *,
@@ -207,11 +213,9 @@ class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
request_method_(srv_ctx_.get(), &req_, &response_writer_,
AsyncQpsServerTest::tag(this));
}
- ~ServerRpcContextUnaryImpl() GRPC_OVERRIDE {}
- bool RunNextState(bool ok) GRPC_OVERRIDE {
- return (this->*next_state_)(ok);
- }
- void Reset() GRPC_OVERRIDE {
+ ~ServerRpcContextUnaryImpl() override {}
+ bool RunNextState(bool ok) override { return (this->*next_state_)(ok); }
+ void Reset() override {
srv_ctx_.reset(new ServerContextType);
req_ = RequestType();
response_writer_ =
@@ -251,7 +255,7 @@ class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
grpc::ServerAsyncResponseWriter<ResponseType> response_writer_;
};
- class ServerRpcContextStreamingImpl GRPC_FINAL : public ServerRpcContext {
+ class ServerRpcContextStreamingImpl final : public ServerRpcContext {
public:
ServerRpcContextStreamingImpl(
std::function<void(
@@ -267,11 +271,9 @@ class AsyncQpsServerTest GRPC_FINAL : public grpc::testing::Server {
stream_(srv_ctx_.get()) {
request_method_(srv_ctx_.get(), &stream_, AsyncQpsServerTest::tag(this));
}
- ~ServerRpcContextStreamingImpl() GRPC_OVERRIDE {}
- bool RunNextState(bool ok) GRPC_OVERRIDE {
- return (this->*next_state_)(ok);
- }
- void Reset() GRPC_OVERRIDE {
+ ~ServerRpcContextStreamingImpl() override {}
+ bool RunNextState(bool ok) override { return (this->*next_state_)(ok); }
+ void Reset() override {
srv_ctx_.reset(new ServerContextType);
req_ = RequestType();
stream_ = grpc::ServerAsyncReaderWriter<ResponseType, RequestType>(
@@ -374,7 +376,7 @@ static Status ProcessGenericRPC(const PayloadConfig &payload_config,
ByteBuffer *response) {
int resp_size = payload_config.bytebuf_params().resp_size();
std::unique_ptr<char[]> buf(new char[resp_size]);
- gpr_slice s = gpr_slice_from_copied_buffer(buf.get(), resp_size);
+ grpc_slice s = grpc_slice_from_copied_buffer(buf.get(), resp_size);
Slice slice(s, Slice::STEAL_REF);
*response = ByteBuffer(&slice, 1);
return Status::OK;
diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc
index 0caed0ab49..8076a4a6b9 100644
--- a/test/cpp/qps/server_sync.cc
+++ b/test/cpp/qps/server_sync.cc
@@ -31,6 +31,7 @@
*
*/
+#include <grpc++/resource_quota.h>
#include <grpc++/security/server_credentials.h>
#include <grpc++/server.h>
#include <grpc++/server_builder.h>
@@ -47,10 +48,10 @@
namespace grpc {
namespace testing {
-class BenchmarkServiceImpl GRPC_FINAL : public BenchmarkService::Service {
+class BenchmarkServiceImpl final : public BenchmarkService::Service {
public:
Status UnaryCall(ServerContext* context, const SimpleRequest* request,
- SimpleResponse* response) GRPC_OVERRIDE {
+ SimpleResponse* response) override {
if (request->response_size() > 0) {
if (!Server::SetPayload(request->response_type(),
request->response_size(),
@@ -62,7 +63,7 @@ class BenchmarkServiceImpl GRPC_FINAL : public BenchmarkService::Service {
}
Status StreamingCall(
ServerContext* context,
- ServerReaderWriter<SimpleResponse, SimpleRequest>* stream) GRPC_OVERRIDE {
+ ServerReaderWriter<SimpleResponse, SimpleRequest>* stream) override {
SimpleRequest request;
while (stream->Read(&request)) {
SimpleResponse response;
@@ -79,7 +80,7 @@ class BenchmarkServiceImpl GRPC_FINAL : public BenchmarkService::Service {
}
};
-class SynchronousServer GRPC_FINAL : public grpc::testing::Server {
+class SynchronousServer final : public grpc::testing::Server {
public:
explicit SynchronousServer(const ServerConfig& config) : Server(config) {
ServerBuilder builder;
@@ -91,6 +92,11 @@ class SynchronousServer GRPC_FINAL : public grpc::testing::Server {
Server::CreateServerCredentials(config));
gpr_free(server_address);
+ if (config.resource_quota_size() > 0) {
+ builder.SetResourceQuota(ResourceQuota("AsyncQpsServerTest")
+ .Resize(config.resource_quota_size()));
+ }
+
builder.RegisterService(&service_);
impl_ = builder.BuildAndStart();
diff --git a/test/cpp/qps/usage_timer.cc b/test/cpp/qps/usage_timer.cc
index ff595b2ba0..c6697fbdfd 100644
--- a/test/cpp/qps/usage_timer.cc
+++ b/test/cpp/qps/usage_timer.cc
@@ -33,10 +33,14 @@
#include "test/cpp/qps/usage_timer.h"
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include <sys/resource.h>
#include <sys/time.h>
-
UsageTimer::UsageTimer() : start_(Sample()) {}
double UsageTimer::Now() {
@@ -48,6 +52,27 @@ static double time_double(struct timeval* tv) {
return tv->tv_sec + 1e-6 * tv->tv_usec;
}
+static void get_cpu_usage(unsigned long long* total_cpu_time,
+ unsigned long long* idle_cpu_time) {
+#ifdef __linux__
+ std::ifstream proc_stat("/proc/stat");
+ proc_stat.ignore(5);
+ std::string cpu_time_str;
+ std::string first_line;
+ std::getline(proc_stat, first_line);
+ std::stringstream first_line_s(first_line);
+ for (int i = 0; i < 10; ++i) {
+ std::getline(first_line_s, cpu_time_str, ' ');
+ *total_cpu_time += std::stol(cpu_time_str);
+ if (i == 3) {
+ *idle_cpu_time = std::stol(cpu_time_str);
+ }
+ }
+#else
+ gpr_log(GPR_INFO, "get_cpu_usage(): Non-linux platform is not supported.");
+#endif
+}
+
UsageTimer::Result UsageTimer::Sample() {
struct rusage usage;
struct timeval tv;
@@ -58,6 +83,9 @@ UsageTimer::Result UsageTimer::Sample() {
r.wall = time_double(&tv);
r.user = time_double(&usage.ru_utime);
r.system = time_double(&usage.ru_stime);
+ r.total_cpu_time = 0;
+ r.idle_cpu_time = 0;
+ get_cpu_usage(&r.total_cpu_time, &r.idle_cpu_time);
return r;
}
@@ -67,5 +95,8 @@ UsageTimer::Result UsageTimer::Mark() const {
r.wall = s.wall - start_.wall;
r.user = s.user - start_.user;
r.system = s.system - start_.system;
+ r.total_cpu_time = s.total_cpu_time - start_.total_cpu_time;
+ r.idle_cpu_time = s.idle_cpu_time - start_.idle_cpu_time;
+
return r;
}
diff --git a/test/cpp/qps/usage_timer.h b/test/cpp/qps/usage_timer.h
index 8343cd6653..0fc1b47996 100644
--- a/test/cpp/qps/usage_timer.h
+++ b/test/cpp/qps/usage_timer.h
@@ -42,6 +42,8 @@ class UsageTimer {
double wall;
double user;
double system;
+ unsigned long long total_cpu_time;
+ unsigned long long idle_cpu_time;
};
Result Mark() const;
diff --git a/test/cpp/thread_manager/thread_manager_test.cc b/test/cpp/thread_manager/thread_manager_test.cc
new file mode 100644
index 0000000000..284761c53a
--- /dev/null
+++ b/test/cpp/thread_manager/thread_manager_test.cc
@@ -0,0 +1,135 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *is % allowed in string
+ */
+
+#include <memory>
+#include <string>
+
+#include <gflags/gflags.h>
+#include <grpc++/grpc++.h>
+#include <grpc/support/log.h>
+#include <grpc/support/port_platform.h>
+
+#include "src/cpp/thread_manager/thread_manager.h"
+#include "test/cpp/util/test_config.h"
+
+namespace grpc {
+class ThreadManagerTest final : public grpc::ThreadManager {
+ public:
+ ThreadManagerTest()
+ : ThreadManager(kMinPollers, kMaxPollers),
+ num_do_work_(0),
+ num_poll_for_work_(0),
+ num_work_found_(0) {}
+
+ grpc::ThreadManager::WorkStatus PollForWork(void **tag, bool *ok) override;
+ void DoWork(void *tag, bool ok) override;
+ void PerformTest();
+
+ private:
+ void SleepForMs(int sleep_time_ms);
+
+ static const int kMinPollers = 2;
+ static const int kMaxPollers = 10;
+
+ static const int kPollingTimeoutMsec = 10;
+ static const int kDoWorkDurationMsec = 1;
+
+ // PollForWork will return SHUTDOWN after these many number of invocations
+ static const int kMaxNumPollForWork = 50;
+
+ gpr_atm num_do_work_; // Number of calls to DoWork
+ gpr_atm num_poll_for_work_; // Number of calls to PollForWork
+ gpr_atm num_work_found_; // Number of times WORK_FOUND was returned
+};
+
+void ThreadManagerTest::SleepForMs(int duration_ms) {
+ gpr_timespec sleep_time =
+ gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+ gpr_time_from_millis(duration_ms, GPR_TIMESPAN));
+ gpr_sleep_until(sleep_time);
+}
+
+grpc::ThreadManager::WorkStatus ThreadManagerTest::PollForWork(void **tag,
+ bool *ok) {
+ int call_num = gpr_atm_no_barrier_fetch_add(&num_poll_for_work_, 1);
+
+ if (call_num >= kMaxNumPollForWork) {
+ Shutdown();
+ return SHUTDOWN;
+ }
+
+ // Simulate "polling for work" by sleeping for sometime
+ SleepForMs(kPollingTimeoutMsec);
+
+ *tag = nullptr;
+ *ok = true;
+
+ // Return timeout roughly 1 out of every 3 calls
+ if (call_num % 3 == 0) {
+ return TIMEOUT;
+ } else {
+ gpr_atm_no_barrier_fetch_add(&num_work_found_, 1);
+ return WORK_FOUND;
+ }
+}
+
+void ThreadManagerTest::DoWork(void *tag, bool ok) {
+ gpr_atm_no_barrier_fetch_add(&num_do_work_, 1);
+ SleepForMs(kDoWorkDurationMsec); // Simulate doing work by sleeping
+}
+
+void ThreadManagerTest::PerformTest() {
+ // Initialize() starts the ThreadManager
+ Initialize();
+
+ // Wait for all the threads to gracefully terminate
+ Wait();
+
+ // The number of times DoWork() was called is equal to the number of times
+ // WORK_FOUND was returned
+ gpr_log(GPR_DEBUG, "DoWork() called %ld times",
+ gpr_atm_no_barrier_load(&num_do_work_));
+ GPR_ASSERT(gpr_atm_no_barrier_load(&num_do_work_) ==
+ gpr_atm_no_barrier_load(&num_work_found_));
+}
+} // namespace grpc
+
+int main(int argc, char **argv) {
+ std::srand(std::time(NULL));
+
+ grpc::testing::InitTest(&argc, &argv, true);
+ grpc::ThreadManagerTest test_rpc_manager;
+ test_rpc_manager.PerformTest();
+
+ return 0;
+}
diff --git a/test/cpp/util/byte_buffer_proto_helper.cc b/test/cpp/util/byte_buffer_proto_helper.cc
index d625d6f3f4..ab5ca261e6 100644
--- a/test/cpp/util/byte_buffer_proto_helper.cc
+++ b/test/cpp/util/byte_buffer_proto_helper.cc
@@ -51,7 +51,7 @@ std::unique_ptr<ByteBuffer> SerializeToByteBuffer(
grpc::protobuf::Message* message) {
grpc::string buf;
message->SerializeToString(&buf);
- gpr_slice s = gpr_slice_from_copied_string(buf.c_str());
+ grpc_slice s = grpc_slice_from_copied_string(buf.c_str());
Slice slice(s, Slice::STEAL_REF);
return std::unique_ptr<ByteBuffer>(new ByteBuffer(&slice, 1));
}
diff --git a/test/cpp/util/byte_buffer_test.cc b/test/cpp/util/byte_buffer_test.cc
index 2089a62011..470ce0cbf4 100644
--- a/test/cpp/util/byte_buffer_test.cc
+++ b/test/cpp/util/byte_buffer_test.cc
@@ -37,7 +37,7 @@
#include <vector>
#include <grpc++/support/slice.h>
-#include <grpc/support/slice.h>
+#include <grpc/slice.h>
#include <gtest/gtest.h>
namespace grpc {
@@ -49,14 +49,14 @@ const char* kContent2 = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy world";
class ByteBufferTest : public ::testing::Test {};
TEST_F(ByteBufferTest, CreateFromSingleSlice) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
Slice s(hello, Slice::STEAL_REF);
ByteBuffer buffer(&s, 1);
}
TEST_F(ByteBufferTest, CreateFromVector) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
- gpr_slice world = gpr_slice_from_copied_string(kContent2);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
+ grpc_slice world = grpc_slice_from_copied_string(kContent2);
std::vector<Slice> slices;
slices.push_back(Slice(hello, Slice::STEAL_REF));
slices.push_back(Slice(world, Slice::STEAL_REF));
@@ -64,15 +64,15 @@ TEST_F(ByteBufferTest, CreateFromVector) {
}
TEST_F(ByteBufferTest, Clear) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
Slice s(hello, Slice::STEAL_REF);
ByteBuffer buffer(&s, 1);
buffer.Clear();
}
TEST_F(ByteBufferTest, Length) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
- gpr_slice world = gpr_slice_from_copied_string(kContent2);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
+ grpc_slice world = grpc_slice_from_copied_string(kContent2);
std::vector<Slice> slices;
slices.push_back(Slice(hello, Slice::STEAL_REF));
slices.push_back(Slice(world, Slice::STEAL_REF));
@@ -80,12 +80,12 @@ TEST_F(ByteBufferTest, Length) {
EXPECT_EQ(strlen(kContent1) + strlen(kContent2), buffer.Length());
}
-bool SliceEqual(const Slice& a, gpr_slice b) {
- if (a.size() != GPR_SLICE_LENGTH(b)) {
+bool SliceEqual(const Slice& a, grpc_slice b) {
+ if (a.size() != GRPC_SLICE_LENGTH(b)) {
return false;
}
for (size_t i = 0; i < a.size(); i++) {
- if (a.begin()[i] != GPR_SLICE_START_PTR(b)[i]) {
+ if (a.begin()[i] != GRPC_SLICE_START_PTR(b)[i]) {
return false;
}
}
@@ -93,8 +93,8 @@ bool SliceEqual(const Slice& a, gpr_slice b) {
}
TEST_F(ByteBufferTest, Dump) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
- gpr_slice world = gpr_slice_from_copied_string(kContent2);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
+ grpc_slice world = grpc_slice_from_copied_string(kContent2);
std::vector<Slice> slices;
slices.push_back(Slice(hello, Slice::STEAL_REF));
slices.push_back(Slice(world, Slice::STEAL_REF));
@@ -106,8 +106,8 @@ TEST_F(ByteBufferTest, Dump) {
}
TEST_F(ByteBufferTest, SerializationMakesCopy) {
- gpr_slice hello = gpr_slice_from_copied_string(kContent1);
- gpr_slice world = gpr_slice_from_copied_string(kContent2);
+ grpc_slice hello = grpc_slice_from_copied_string(kContent1);
+ grpc_slice world = grpc_slice_from_copied_string(kContent2);
std::vector<Slice> slices;
slices.push_back(Slice(hello, Slice::STEAL_REF));
slices.push_back(Slice(world, Slice::STEAL_REF));
diff --git a/test/cpp/util/cli_call.cc b/test/cpp/util/cli_call.cc
index 1edffbe08e..a02a8b2ee2 100644
--- a/test/cpp/util/cli_call.cc
+++ b/test/cpp/util/cli_call.cc
@@ -41,8 +41,8 @@
#include <grpc++/generic/generic_stub.h>
#include <grpc++/support/byte_buffer.h>
#include <grpc/grpc.h>
+#include <grpc/slice.h>
#include <grpc/support/log.h>
-#include <grpc/support/slice.h>
namespace grpc {
namespace testing {
@@ -72,7 +72,7 @@ Status CliCall::Call(std::shared_ptr<grpc::Channel> channel,
cq.Next(&got_tag, &ok);
GPR_ASSERT(ok);
- gpr_slice s = gpr_slice_from_copied_string(request.c_str());
+ grpc_slice s = grpc_slice_from_copied_string(request.c_str());
grpc::Slice req_slice(s, grpc::Slice::STEAL_REF);
grpc::ByteBuffer send_buffer(&req_slice, 1);
call->Write(send_buffer, tag(2));
diff --git a/test/cpp/util/cli_call.h b/test/cpp/util/cli_call.h
index 2fbc9618b6..65da86bd4e 100644
--- a/test/cpp/util/cli_call.h
+++ b/test/cpp/util/cli_call.h
@@ -43,7 +43,7 @@
namespace grpc {
namespace testing {
-class CliCall GRPC_FINAL {
+class CliCall final {
public:
typedef std::multimap<grpc::string, grpc::string> OutgoingMetadataContainer;
typedef std::multimap<grpc::string_ref, grpc::string_ref>
diff --git a/test/cpp/util/cli_call_test.cc b/test/cpp/util/cli_call_test.cc
index 75e90f824f..2e8501b2c3 100644
--- a/test/cpp/util/cli_call_test.cc
+++ b/test/cpp/util/cli_call_test.cc
@@ -56,7 +56,7 @@ namespace testing {
class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
if (!context->client_metadata().empty()) {
for (std::multimap<grpc::string_ref, grpc::string_ref>::const_iterator
iter = context->client_metadata().begin();
@@ -75,7 +75,7 @@ class CliCallTest : public ::testing::Test {
protected:
CliCallTest() {}
- void SetUp() GRPC_OVERRIDE {
+ void SetUp() override {
int port = grpc_pick_unused_port_or_die();
server_address_ << "localhost:" << port;
// Setup server
@@ -86,7 +86,7 @@ class CliCallTest : public ::testing::Test {
server_ = builder.BuildAndStart();
}
- void TearDown() GRPC_OVERRIDE { server_->Shutdown(); }
+ void TearDown() override { server_->Shutdown(); }
void ResetStub() {
channel_ =
diff --git a/test/cpp/util/config_grpc_cli.h b/test/cpp/util/config_grpc_cli.h
index ea8231aa26..ac1e3044b7 100644
--- a/test/cpp/util/config_grpc_cli.h
+++ b/test/cpp/util/config_grpc_cli.h
@@ -77,7 +77,7 @@ namespace compiler {
typedef GRPC_CUSTOM_DISKSOURCETREE DiskSourceTree;
typedef GRPC_CUSTOM_IMPORTER Importer;
typedef GRPC_CUSTOM_MULTIFILEERRORCOLLECTOR MultiFileErrorCollector;
-} // namespace importer
+} // namespace compiler
} // namespace protobuf
} // namespace grpc
diff --git a/test/cpp/util/grpc_tool.cc b/test/cpp/util/grpc_tool.cc
index 03c33abe9f..b9900ca1b7 100644
--- a/test/cpp/util/grpc_tool.cc
+++ b/test/cpp/util/grpc_tool.cc
@@ -86,11 +86,12 @@ class GrpcTool {
// callback);
// bool PrintTypeId(int argc, const char** argv, GrpcToolOutputCallback
// callback);
- // bool ParseMessage(int argc, const char** argv, GrpcToolOutputCallback
- // callback);
- // bool ToText(int argc, const char** argv, GrpcToolOutputCallback callback);
- // bool ToBinary(int argc, const char** argv, GrpcToolOutputCallback
- // callback);
+ bool ParseMessage(int argc, const char** argv, const CliCredentials& cred,
+ GrpcToolOutputCallback callback);
+ bool ToText(int argc, const char** argv, const CliCredentials& cred,
+ GrpcToolOutputCallback callback);
+ bool ToBinary(int argc, const char** argv, const CliCredentials& cred,
+ GrpcToolOutputCallback callback);
void SetPrintCommandMode(int exit_status) {
print_command_usage_ = true;
@@ -173,9 +174,9 @@ const Command ops[] = {
{"list", BindWith5Args(&GrpcTool::ListServices), 1, 3},
{"call", BindWith5Args(&GrpcTool::CallMethod), 2, 3},
{"type", BindWith5Args(&GrpcTool::PrintType), 2, 2},
- // {"parse", BindWith5Args(&GrpcTool::ParseMessage), 2, 3},
- // {"totext", BindWith5Args(&GrpcTool::ToText), 2, 3},
- // {"tobinary", BindWith5Args(&GrpcTool::ToBinary), 2, 3},
+ {"parse", BindWith5Args(&GrpcTool::ParseMessage), 2, 3},
+ {"totext", BindWith5Args(&GrpcTool::ToText), 2, 3},
+ {"tobinary", BindWith5Args(&GrpcTool::ToBinary), 2, 3},
};
void Usage(const grpc::string& msg) {
@@ -185,9 +186,9 @@ void Usage(const grpc::string& msg) {
" grpc_cli ls ... ; List services\n"
" grpc_cli call ... ; Call method\n"
" grpc_cli type ... ; Print type\n"
- // " grpc_cli parse ... ; Parse message\n"
- // " grpc_cli totext ... ; Convert binary message to text\n"
- // " grpc_cli tobinary ... ; Convert text message to binary\n"
+ " grpc_cli parse ... ; Parse message\n"
+ " grpc_cli totext ... ; Convert binary message to text\n"
+ " grpc_cli tobinary ... ; Convert text message to binary\n"
" grpc_cli help ... ; Print this message, or per-command usage\n"
"\n",
msg.c_str());
@@ -414,6 +415,7 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
grpc::string request_text;
grpc::string server_address(argv[0]);
grpc::string method_name(argv[1]);
+ grpc::string formatted_method_name;
std::unique_ptr<grpc::testing::ProtoFileParser> parser;
grpc::string serialized_request_proto;
@@ -450,7 +452,9 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
if (FLAGS_binary_input) {
serialized_request_proto = request_text;
+ formatted_method_name = method_name;
} else {
+ formatted_method_name = parser->GetFormattedMethodName(method_name);
serialized_request_proto = parser->GetSerializedProtoFromMethod(
method_name, request_text, true /* is_request */);
if (parser->HasError()) {
@@ -466,9 +470,9 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
ParseMetadataFlag(&client_metadata);
PrintMetadata(client_metadata, "Sending client initial metadata:");
grpc::Status status = grpc::testing::CliCall::Call(
- channel, parser->GetFormatedMethodName(method_name),
- serialized_request_proto, &serialized_response_proto, client_metadata,
- &server_initial_metadata, &server_trailing_metadata);
+ channel, formatted_method_name, serialized_request_proto,
+ &serialized_response_proto, client_metadata, &server_initial_metadata,
+ &server_trailing_metadata);
PrintMetadata(server_initial_metadata,
"Received initial metadata from server:");
PrintMetadata(server_trailing_metadata,
@@ -493,5 +497,122 @@ bool GrpcTool::CallMethod(int argc, const char** argv,
return callback(output_ss.str());
}
+bool GrpcTool::ParseMessage(int argc, const char** argv,
+ const CliCredentials& cred,
+ GrpcToolOutputCallback callback) {
+ CommandUsage(
+ "Parse message\n"
+ " grpc_cli parse <address> <type> [<message>]\n"
+ " <address> ; host:port\n"
+ " <type> ; Protocol buffer type name\n"
+ " <message> ; Text protobuffer (overrides --infile)\n"
+ " --protofiles ; Comma separated proto files used as a"
+ " fallback when parsing request/response\n"
+ " --proto_path ; The search path of proto files, valid"
+ " only when --protofiles is given\n"
+ " --infile ; Input filename (defaults to stdin)\n"
+ " --outfile ; Output filename (defaults to stdout)\n"
+ " --binary_input ; Input in binary format\n"
+ " --binary_output ; Output in binary format\n" +
+ cred.GetCredentialUsage());
+
+ std::stringstream output_ss;
+ grpc::string message_text;
+ grpc::string server_address(argv[0]);
+ grpc::string type_name(argv[1]);
+ std::unique_ptr<grpc::testing::ProtoFileParser> parser;
+ grpc::string serialized_request_proto;
+
+ if (argc == 3) {
+ message_text = argv[2];
+ if (!FLAGS_infile.empty()) {
+ fprintf(stderr, "warning: message given in argv, ignoring --infile.\n");
+ }
+ } else {
+ std::stringstream input_stream;
+ if (FLAGS_infile.empty()) {
+ if (isatty(STDIN_FILENO)) {
+ fprintf(stderr, "reading request message from stdin...\n");
+ }
+ input_stream << std::cin.rdbuf();
+ } else {
+ std::ifstream input_file(FLAGS_infile, std::ios::in | std::ios::binary);
+ input_stream << input_file.rdbuf();
+ input_file.close();
+ }
+ message_text = input_stream.str();
+ }
+
+ if (!FLAGS_binary_input || !FLAGS_binary_output) {
+ std::shared_ptr<grpc::Channel> channel =
+ grpc::CreateChannel(server_address, cred.GetCredentials());
+ parser.reset(
+ new grpc::testing::ProtoFileParser(FLAGS_remotedb ? channel : nullptr,
+ FLAGS_proto_path, FLAGS_protofiles));
+ if (parser->HasError()) {
+ return false;
+ }
+ }
+
+ if (FLAGS_binary_input) {
+ serialized_request_proto = message_text;
+ } else {
+ serialized_request_proto =
+ parser->GetSerializedProtoFromMessageType(type_name, message_text);
+ if (parser->HasError()) {
+ return false;
+ }
+ }
+
+ if (FLAGS_binary_output) {
+ output_ss << serialized_request_proto;
+ } else {
+ grpc::string output_text = parser->GetTextFormatFromMessageType(
+ type_name, serialized_request_proto);
+ if (parser->HasError()) {
+ return false;
+ }
+ output_ss << output_text << std::endl;
+ }
+
+ return callback(output_ss.str());
+}
+
+bool GrpcTool::ToText(int argc, const char** argv, const CliCredentials& cred,
+ GrpcToolOutputCallback callback) {
+ CommandUsage(
+ "Convert binary message to text\n"
+ " grpc_cli totext <protofiles> <type>\n"
+ " <protofiles> ; Comma separated list of proto files\n"
+ " <type> ; Protocol buffer type name\n"
+ " --proto_path ; The search path of proto files\n"
+ " --infile ; Input filename (defaults to stdin)\n"
+ " --outfile ; Output filename (defaults to stdout)\n");
+
+ FLAGS_protofiles = argv[0];
+ FLAGS_remotedb = false;
+ FLAGS_binary_input = true;
+ FLAGS_binary_output = false;
+ return ParseMessage(argc, argv, cred, callback);
+}
+
+bool GrpcTool::ToBinary(int argc, const char** argv, const CliCredentials& cred,
+ GrpcToolOutputCallback callback) {
+ CommandUsage(
+ "Convert text message to binary\n"
+ " grpc_cli tobinary <protofiles> <type> [<message>]\n"
+ " <protofiles> ; Comma separated list of proto files\n"
+ " <type> ; Protocol buffer type name\n"
+ " --proto_path ; The search path of proto files\n"
+ " --infile ; Input filename (defaults to stdin)\n"
+ " --outfile ; Output filename (defaults to stdout)\n");
+
+ FLAGS_protofiles = argv[0];
+ FLAGS_remotedb = false;
+ FLAGS_binary_input = false;
+ FLAGS_binary_output = true;
+ return ParseMessage(argc, argv, cred, callback);
+}
+
} // namespace testing
} // namespace grpc
diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc
index bad1579f11..33ce611a60 100644
--- a/test/cpp/util/grpc_tool_test.cc
+++ b/test/cpp/util/grpc_tool_test.cc
@@ -86,20 +86,28 @@ using grpc::testing::EchoResponse;
" rpc Echo(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \
"{}\n"
+#define ECHO_RESPONSE_MESSAGE \
+ "message: \"echo\"\n" \
+ "param {\n" \
+ " host: \"localhost\"\n" \
+ " peer: \"peer\"\n" \
+ "}\n\n"
+
namespace grpc {
namespace testing {
+DECLARE_bool(binary_input);
+DECLARE_bool(binary_output);
DECLARE_bool(l);
namespace {
-class TestCliCredentials GRPC_FINAL : public grpc::testing::CliCredentials {
+class TestCliCredentials final : public grpc::testing::CliCredentials {
public:
- std::shared_ptr<grpc::ChannelCredentials> GetCredentials() const
- GRPC_OVERRIDE {
+ std::shared_ptr<grpc::ChannelCredentials> GetCredentials() const override {
return InsecureChannelCredentials();
}
- const grpc::string GetCredentialUsage() const GRPC_OVERRIDE { return ""; }
+ const grpc::string GetCredentialUsage() const override { return ""; }
};
bool PrintStream(std::stringstream* ss, const grpc::string& output) {
@@ -113,12 +121,10 @@ size_t ArraySize(T& a) {
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))));
}
-} // namespame
-
class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
public:
Status Echo(ServerContext* context, const EchoRequest* request,
- EchoResponse* response) GRPC_OVERRIDE {
+ EchoResponse* response) override {
if (!context->client_metadata().empty()) {
for (std::multimap<grpc::string_ref, grpc::string_ref>::const_iterator
iter = context->client_metadata().begin();
@@ -133,6 +139,8 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service {
}
};
+} // namespace
+
class GrpcToolTest : public ::testing::Test {
protected:
GrpcToolTest() {}
@@ -339,6 +347,47 @@ TEST_F(GrpcToolTest, CallCommand) {
ShutdownServer();
}
+TEST_F(GrpcToolTest, ParseCommand) {
+ // Test input "grpc_cli parse localhost:<port> grpc.testing.EchoResponse
+ // ECHO_RESPONSE_MESSAGE"
+ std::stringstream output_stream;
+ std::stringstream binary_output_stream;
+
+ const grpc::string server_address = SetUpServer();
+ const char* argv[] = {"grpc_cli", "parse", server_address.c_str(),
+ "grpc.testing.EchoResponse", ECHO_RESPONSE_MESSAGE};
+
+ FLAGS_binary_input = false;
+ FLAGS_binary_output = false;
+ EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
+ std::bind(PrintStream, &output_stream,
+ std::placeholders::_1)));
+ // Expected output: ECHO_RESPONSE_MESSAGE
+ EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(), ECHO_RESPONSE_MESSAGE));
+
+ // Parse text message to binary message and then parse it back to text message
+ output_stream.str(grpc::string());
+ output_stream.clear();
+ FLAGS_binary_output = true;
+ EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
+ std::bind(PrintStream, &output_stream,
+ std::placeholders::_1)));
+ grpc::string binary_data = output_stream.str();
+ output_stream.str(grpc::string());
+ output_stream.clear();
+ argv[4] = binary_data.c_str();
+ FLAGS_binary_input = true;
+ FLAGS_binary_output = false;
+ EXPECT_TRUE(0 == GrpcToolMainLib(5, argv, TestCliCredentials(),
+ std::bind(PrintStream, &output_stream,
+ std::placeholders::_1)));
+
+ // Expected output: ECHO_RESPONSE_MESSAGE
+ EXPECT_TRUE(0 == strcmp(output_stream.str().c_str(), ECHO_RESPONSE_MESSAGE));
+
+ ShutdownServer();
+}
+
TEST_F(GrpcToolTest, TooFewArguments) {
// Test input "grpc_cli call Echo"
std::stringstream output_stream;
diff --git a/test/cpp/util/metrics_server.h b/test/cpp/util/metrics_server.h
index aa9bfed23d..4f1e393a63 100644
--- a/test/cpp/util/metrics_server.h
+++ b/test/cpp/util/metrics_server.h
@@ -83,13 +83,13 @@ class QpsGauge {
std::mutex num_queries_mu_;
};
-class MetricsServiceImpl GRPC_FINAL : public MetricsService::Service {
+class MetricsServiceImpl final : public MetricsService::Service {
public:
grpc::Status GetAllGauges(ServerContext* context, const EmptyMessage* request,
- ServerWriter<GaugeResponse>* writer) GRPC_OVERRIDE;
+ ServerWriter<GaugeResponse>* writer) override;
grpc::Status GetGauge(ServerContext* context, const GaugeRequest* request,
- GaugeResponse* response) GRPC_OVERRIDE;
+ GaugeResponse* response) override;
// Create a QpsGauge with name 'name'. is_present is set to true if the Gauge
// is already present in the map.
diff --git a/test/cpp/util/proto_file_parser.cc b/test/cpp/util/proto_file_parser.cc
index 98dd3f14ad..bc8a6083f4 100644
--- a/test/cpp/util/proto_file_parser.cc
+++ b/test/cpp/util/proto_file_parser.cc
@@ -61,7 +61,7 @@ class ErrorPrinter : public protobuf::compiler::MultiFileErrorCollector {
explicit ErrorPrinter(ProtoFileParser* parser) : parser_(parser) {}
void AddError(const grpc::string& filename, int line, int column,
- const grpc::string& message) GRPC_OVERRIDE {
+ const grpc::string& message) override {
std::ostringstream oss;
oss << "error " << filename << " " << line << " " << column << " "
<< message << "\n";
@@ -69,7 +69,7 @@ class ErrorPrinter : public protobuf::compiler::MultiFileErrorCollector {
}
void AddWarning(const grpc::string& filename, int line, int column,
- const grpc::string& message) GRPC_OVERRIDE {
+ const grpc::string& message) override {
std::cerr << "warning " << filename << " " << line << " " << column << " "
<< message << std::endl;
}
@@ -172,19 +172,19 @@ grpc::string ProtoFileParser::GetFullMethodName(const grpc::string& method) {
return method_descriptor->full_name();
}
-grpc::string ProtoFileParser::GetFormatedMethodName(
+grpc::string ProtoFileParser::GetFormattedMethodName(
const grpc::string& method) {
has_error_ = false;
- grpc::string formated_method_name = GetFullMethodName(method);
+ grpc::string formatted_method_name = GetFullMethodName(method);
if (has_error_) {
return "";
}
- size_t last_dot = formated_method_name.find_last_of('.');
+ size_t last_dot = formatted_method_name.find_last_of('.');
if (last_dot != grpc::string::npos) {
- formated_method_name[last_dot] = '/';
+ formatted_method_name[last_dot] = '/';
}
- formated_method_name.insert(formated_method_name.begin(), '/');
- return formated_method_name;
+ formatted_method_name.insert(formatted_method_name.begin(), '/');
+ return formatted_method_name;
}
grpc::string ProtoFileParser::GetMessageTypeFromMethod(
diff --git a/test/cpp/util/proto_file_parser.h b/test/cpp/util/proto_file_parser.h
index eda3991e72..c1070a37b5 100644
--- a/test/cpp/util/proto_file_parser.h
+++ b/test/cpp/util/proto_file_parser.h
@@ -64,9 +64,9 @@ class ProtoFileParser {
// descriptor database queries.
grpc::string GetFullMethodName(const grpc::string& method);
- // Formated method name is in the form of /Service/Method, it's good to be
+ // Formatted method name is in the form of /Service/Method, it's good to be
// used as the argument of Stub::Call()
- grpc::string GetFormatedMethodName(const grpc::string& method);
+ grpc::string GetFormattedMethodName(const grpc::string& method);
grpc::string GetSerializedProtoFromMethod(
const grpc::string& method, const grpc::string& text_format_proto,
diff --git a/test/cpp/util/proto_reflection_descriptor_database.h b/test/cpp/util/proto_reflection_descriptor_database.h
index dfa36044d9..259277ebbe 100644
--- a/test/cpp/util/proto_reflection_descriptor_database.h
+++ b/test/cpp/util/proto_reflection_descriptor_database.h
@@ -38,14 +38,9 @@
#include <unordered_set>
#include <vector>
-// GRPC_NO_GENERATED_CODE indicates generated pb files should not be used
-#ifdef GRPC_NO_GENERATED_CODE
-#include "src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h"
-#else
-#include <grpc++/ext/reflection.grpc.pb.h>
-#endif // GRPC_NO_GENERATED_CODE
#include <grpc++/grpc++.h>
#include <grpc++/impl/codegen/config_protobuf.h>
+#include "src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h"
namespace grpc {
@@ -67,14 +62,13 @@ class ProtoReflectionDescriptorDatabase : public protobuf::DescriptorDatabase {
// Find a file by file name. Fills in in *output and returns true if found.
// Otherwise, returns false, leaving the contents of *output undefined.
bool FindFileByName(const string& filename,
- protobuf::FileDescriptorProto* output) GRPC_OVERRIDE;
+ protobuf::FileDescriptorProto* output) override;
// Find the file that declares the given fully-qualified symbol name.
// If found, fills in *output and returns true, otherwise returns false
// and leaves *output undefined.
bool FindFileContainingSymbol(const string& symbol_name,
- protobuf::FileDescriptorProto* output)
- GRPC_OVERRIDE;
+ protobuf::FileDescriptorProto* output) override;
// Find the file which defines an extension extending the given message type
// with the given field number. If found, fills in *output and returns true,
@@ -82,7 +76,7 @@ class ProtoReflectionDescriptorDatabase : public protobuf::DescriptorDatabase {
// must be a fully-qualified type name.
bool FindFileContainingExtension(
const string& containing_type, int field_number,
- protobuf::FileDescriptorProto* output) GRPC_OVERRIDE;
+ protobuf::FileDescriptorProto* output) override;
// Finds the tag numbers used by all known extensions of
// extendee_type, and appends them to output in an undefined
@@ -92,7 +86,7 @@ class ProtoReflectionDescriptorDatabase : public protobuf::DescriptorDatabase {
// numbers. Returns true if the search was successful, otherwise
// returns false and leaves output unchanged.
bool FindAllExtensionNumbers(const string& extendee_type,
- std::vector<int>* output) GRPC_OVERRIDE;
+ std::vector<int>* output) override;
// Provide a list of full names of registered services
bool GetServices(std::vector<grpc::string>* output);
diff --git a/test/cpp/util/slice_test.cc b/test/cpp/util/slice_test.cc
index 45799ae157..8926fb7d5a 100644
--- a/test/cpp/util/slice_test.cc
+++ b/test/cpp/util/slice_test.cc
@@ -33,7 +33,7 @@
#include <grpc++/support/slice.h>
-#include <grpc/support/slice.h>
+#include <grpc/slice.h>
#include <gtest/gtest.h>
namespace grpc {
@@ -51,15 +51,15 @@ class SliceTest : public ::testing::Test {
};
TEST_F(SliceTest, Steal) {
- gpr_slice s = gpr_slice_from_copied_string(kContent);
+ grpc_slice s = grpc_slice_from_copied_string(kContent);
Slice spp(s, Slice::STEAL_REF);
CheckSlice(spp, kContent);
}
TEST_F(SliceTest, Add) {
- gpr_slice s = gpr_slice_from_copied_string(kContent);
+ grpc_slice s = grpc_slice_from_copied_string(kContent);
Slice spp(s, Slice::ADD_REF);
- gpr_slice_unref(s);
+ grpc_slice_unref(s);
CheckSlice(spp, kContent);
}
@@ -69,13 +69,13 @@ TEST_F(SliceTest, Empty) {
}
TEST_F(SliceTest, Cslice) {
- gpr_slice s = gpr_slice_from_copied_string(kContent);
+ grpc_slice s = grpc_slice_from_copied_string(kContent);
Slice spp(s, Slice::STEAL_REF);
CheckSlice(spp, kContent);
- gpr_slice c_slice = spp.c_slice();
- EXPECT_EQ(GPR_SLICE_START_PTR(s), GPR_SLICE_START_PTR(c_slice));
- EXPECT_EQ(GPR_SLICE_END_PTR(s), GPR_SLICE_END_PTR(c_slice));
- gpr_slice_unref(c_slice);
+ grpc_slice c_slice = spp.c_slice();
+ EXPECT_EQ(GRPC_SLICE_START_PTR(s), GRPC_SLICE_START_PTR(c_slice));
+ EXPECT_EQ(GRPC_SLICE_END_PTR(s), GRPC_SLICE_END_PTR(c_slice));
+ grpc_slice_unref(c_slice);
}
} // namespace
diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc
index ca15f29795..0456b96667 100644
--- a/test/cpp/util/test_credentials_provider.cc
+++ b/test/cpp/util/test_credentials_provider.cc
@@ -34,9 +34,9 @@
#include "test/cpp/util/test_credentials_provider.h"
+#include <mutex>
#include <unordered_map>
-#include <grpc++/impl/sync.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
@@ -64,14 +64,14 @@ class CredentialsProvider {
class DefaultCredentialsProvider : public CredentialsProvider {
public:
- ~DefaultCredentialsProvider() GRPC_OVERRIDE {}
+ ~DefaultCredentialsProvider() override {}
- void AddSecureType(const grpc::string& type,
- std::unique_ptr<CredentialTypeProvider> type_provider)
- GRPC_OVERRIDE {
+ void AddSecureType(
+ const grpc::string& type,
+ std::unique_ptr<CredentialTypeProvider> type_provider) override {
// This clobbers any existing entry for type, except the defaults, which
// can't be clobbered.
- grpc::unique_lock<grpc::mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
auto it = std::find(added_secure_type_names_.begin(),
added_secure_type_names_.end(), type);
if (it == added_secure_type_names_.end()) {
@@ -84,7 +84,7 @@ class DefaultCredentialsProvider : public CredentialsProvider {
}
std::shared_ptr<ChannelCredentials> GetChannelCredentials(
- const grpc::string& type, ChannelArguments* args) GRPC_OVERRIDE {
+ const grpc::string& type, ChannelArguments* args) override {
if (type == grpc::testing::kInsecureCredentialsType) {
return InsecureChannelCredentials();
} else if (type == grpc::testing::kTlsCredentialsType) {
@@ -92,7 +92,7 @@ class DefaultCredentialsProvider : public CredentialsProvider {
args->SetSslTargetNameOverride("foo.test.google.fr");
return SslCredentials(ssl_opts);
} else {
- grpc::unique_lock<grpc::mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
auto it(std::find(added_secure_type_names_.begin(),
added_secure_type_names_.end(), type));
if (it == added_secure_type_names_.end()) {
@@ -105,7 +105,7 @@ class DefaultCredentialsProvider : public CredentialsProvider {
}
std::shared_ptr<ServerCredentials> GetServerCredentials(
- const grpc::string& type) GRPC_OVERRIDE {
+ const grpc::string& type) override {
if (type == grpc::testing::kInsecureCredentialsType) {
return InsecureServerCredentials();
} else if (type == grpc::testing::kTlsCredentialsType) {
@@ -116,7 +116,7 @@ class DefaultCredentialsProvider : public CredentialsProvider {
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
return SslServerCredentials(ssl_opts);
} else {
- grpc::unique_lock<grpc::mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
auto it(std::find(added_secure_type_names_.begin(),
added_secure_type_names_.end(), type));
if (it == added_secure_type_names_.end()) {
@@ -127,10 +127,10 @@ class DefaultCredentialsProvider : public CredentialsProvider {
->GetServerCredentials();
}
}
- std::vector<grpc::string> GetSecureCredentialsTypeList() GRPC_OVERRIDE {
+ std::vector<grpc::string> GetSecureCredentialsTypeList() override {
std::vector<grpc::string> types;
types.push_back(grpc::testing::kTlsCredentialsType);
- grpc::unique_lock<grpc::mutex> lock(mu_);
+ std::unique_lock<std::mutex> lock(mu_);
for (auto it = added_secure_type_names_.begin();
it != added_secure_type_names_.end(); it++) {
types.push_back(*it);
@@ -139,7 +139,7 @@ class DefaultCredentialsProvider : public CredentialsProvider {
}
private:
- grpc::mutex mu_;
+ std::mutex mu_;
std::vector<grpc::string> added_secure_type_names_;
std::vector<std::unique_ptr<CredentialTypeProvider>>
added_secure_type_providers_;
diff --git a/test/http2_test/http2_base_server.py b/test/http2_test/http2_base_server.py
new file mode 100644
index 0000000000..ee7719b1a8
--- /dev/null
+++ b/test/http2_test/http2_base_server.py
@@ -0,0 +1,205 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import messages_pb2
+import struct
+
+import h2
+import h2.connection
+import twisted
+import twisted.internet
+import twisted.internet.protocol
+
+_READ_CHUNK_SIZE = 16384
+_GRPC_HEADER_SIZE = 5
+
+class H2ProtocolBaseServer(twisted.internet.protocol.Protocol):
+ def __init__(self):
+ self._conn = h2.connection.H2Connection(client_side=False)
+ self._recv_buffer = {}
+ self._handlers = {}
+ self._handlers['ConnectionMade'] = self.on_connection_made_default
+ self._handlers['DataReceived'] = self.on_data_received_default
+ self._handlers['WindowUpdated'] = self.on_window_update_default
+ self._handlers['RequestReceived'] = self.on_request_received_default
+ self._handlers['SendDone'] = self.on_send_done_default
+ self._handlers['ConnectionLost'] = self.on_connection_lost
+ self._handlers['PingAcknowledged'] = self.on_ping_acknowledged_default
+ self._stream_status = {}
+ self._send_remaining = {}
+ self._outstanding_pings = 0
+
+ def set_handlers(self, handlers):
+ self._handlers = handlers
+
+ def connectionMade(self):
+ self._handlers['ConnectionMade']()
+
+ def connectionLost(self, reason):
+ self._handlers['ConnectionLost'](reason)
+
+ def on_connection_made_default(self):
+ logging.info('Connection Made')
+ self._conn.initiate_connection()
+ self.transport.setTcpNoDelay(True)
+ self.transport.write(self._conn.data_to_send())
+
+ def on_connection_lost(self, reason):
+ logging.info('Disconnected %s' % reason)
+ twisted.internet.reactor.callFromThread(twisted.internet.reactor.stop)
+
+ def dataReceived(self, data):
+ try:
+ events = self._conn.receive_data(data)
+ except h2.exceptions.ProtocolError:
+ # this try/except block catches exceptions due to race between sending
+ # GOAWAY and processing a response in flight.
+ return
+ if self._conn.data_to_send:
+ self.transport.write(self._conn.data_to_send())
+ for event in events:
+ if isinstance(event, h2.events.RequestReceived) and self._handlers.has_key('RequestReceived'):
+ logging.info('RequestReceived Event for stream: %d' % event.stream_id)
+ self._handlers['RequestReceived'](event)
+ elif isinstance(event, h2.events.DataReceived) and self._handlers.has_key('DataReceived'):
+ logging.info('DataReceived Event for stream: %d' % event.stream_id)
+ self._handlers['DataReceived'](event)
+ elif isinstance(event, h2.events.WindowUpdated) and self._handlers.has_key('WindowUpdated'):
+ logging.info('WindowUpdated Event for stream: %d' % event.stream_id)
+ self._handlers['WindowUpdated'](event)
+ elif isinstance(event, h2.events.PingAcknowledged) and self._handlers.has_key('PingAcknowledged'):
+ logging.info('PingAcknowledged Event')
+ self._handlers['PingAcknowledged'](event)
+ self.transport.write(self._conn.data_to_send())
+
+ def on_ping_acknowledged_default(self, event):
+ logging.info('ping acknowledged')
+ self._outstanding_pings -= 1
+
+ def on_data_received_default(self, event):
+ self._conn.acknowledge_received_data(len(event.data), event.stream_id)
+ self._recv_buffer[event.stream_id] += event.data
+
+ def on_request_received_default(self, event):
+ self._recv_buffer[event.stream_id] = ''
+ self._stream_id = event.stream_id
+ self._stream_status[event.stream_id] = True
+ self._conn.send_headers(
+ stream_id=event.stream_id,
+ headers=[
+ (':status', '200'),
+ ('content-type', 'application/grpc'),
+ ('grpc-encoding', 'identity'),
+ ('grpc-accept-encoding', 'identity,deflate,gzip'),
+ ],
+ )
+ self.transport.write(self._conn.data_to_send())
+
+ def on_window_update_default(self, event):
+ # send pending data, if any
+ self.default_send(event.stream_id)
+
+ def send_reset_stream(self):
+ self._conn.reset_stream(self._stream_id)
+ self.transport.write(self._conn.data_to_send())
+
+ def setup_send(self, data_to_send, stream_id):
+ logging.info('Setting up data to send for stream_id: %d' % stream_id)
+ self._send_remaining[stream_id] = len(data_to_send)
+ self._send_offset = 0
+ self._data_to_send = data_to_send
+ self.default_send(stream_id)
+
+ def default_send(self, stream_id):
+ if not self._send_remaining.has_key(stream_id):
+ # not setup to send data yet
+ return
+
+ while self._send_remaining[stream_id] > 0:
+ lfcw = self._conn.local_flow_control_window(stream_id)
+ if lfcw == 0:
+ break
+ chunk_size = min(lfcw, _READ_CHUNK_SIZE)
+ bytes_to_send = min(chunk_size, self._send_remaining[stream_id])
+ logging.info('flow_control_window = %d. sending [%d:%d] stream_id %d' %
+ (lfcw, self._send_offset, self._send_offset + bytes_to_send,
+ stream_id))
+ data = self._data_to_send[self._send_offset : self._send_offset + bytes_to_send]
+ try:
+ self._conn.send_data(stream_id, data, False)
+ except h2.exceptions.ProtocolError:
+ logging.info('Stream %d is closed' % stream_id)
+ break
+ self._send_remaining[stream_id] -= bytes_to_send
+ self._send_offset += bytes_to_send
+ if self._send_remaining[stream_id] == 0:
+ self._handlers['SendDone'](stream_id)
+
+ def default_ping(self):
+ logging.info('sending ping')
+ self._outstanding_pings += 1
+ self._conn.ping(b'\x00'*8)
+ self.transport.write(self._conn.data_to_send())
+
+ def on_send_done_default(self, stream_id):
+ if self._stream_status[stream_id]:
+ self._stream_status[stream_id] = False
+ self.default_send_trailer(stream_id)
+ else:
+ logging.error('Stream %d is already closed' % stream_id)
+
+ def default_send_trailer(self, stream_id):
+ logging.info('Sending trailer for stream id %d' % stream_id)
+ self._conn.send_headers(stream_id,
+ headers=[ ('grpc-status', '0') ],
+ end_stream=True
+ )
+ self.transport.write(self._conn.data_to_send())
+
+ @staticmethod
+ def default_response_data(response_size):
+ sresp = messages_pb2.SimpleResponse()
+ sresp.payload.body = b'\x00'*response_size
+ serialized_resp_proto = sresp.SerializeToString()
+ response_data = b'\x00' + struct.pack('i', len(serialized_resp_proto))[::-1] + serialized_resp_proto
+ return response_data
+
+ def parse_received_data(self, stream_id):
+ """ returns a grpc framed string of bytes containing response proto of the size
+ asked in request """
+ recv_buffer = self._recv_buffer[stream_id]
+ grpc_msg_size = struct.unpack('i',recv_buffer[1:5][::-1])[0]
+ if len(recv_buffer) != _GRPC_HEADER_SIZE + grpc_msg_size:
+ return None
+ req_proto_str = recv_buffer[5:5+grpc_msg_size]
+ sr = messages_pb2.SimpleRequest()
+ sr.ParseFromString(req_proto_str)
+ logging.info('Parsed request for stream %d: response_size=%s' % (stream_id, sr.response_size))
+ return sr
diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py
new file mode 100644
index 0000000000..44e36d34b6
--- /dev/null
+++ b/test/http2_test/http2_test_server.py
@@ -0,0 +1,90 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""HTTP2 Test Server"""
+
+import argparse
+import logging
+import twisted
+import twisted.internet
+import twisted.internet.endpoints
+import twisted.internet.reactor
+
+import http2_base_server
+import test_goaway
+import test_max_streams
+import test_ping
+import test_rst_after_data
+import test_rst_after_header
+import test_rst_during_data
+
+_TEST_CASE_MAPPING = {
+ 'rst_after_header': test_rst_after_header.TestcaseRstStreamAfterHeader,
+ 'rst_after_data': test_rst_after_data.TestcaseRstStreamAfterData,
+ 'rst_during_data': test_rst_during_data.TestcaseRstStreamDuringData,
+ 'goaway': test_goaway.TestcaseGoaway,
+ 'ping': test_ping.TestcasePing,
+ 'max_streams': test_max_streams.TestcaseSettingsMaxStreams,
+}
+
+class H2Factory(twisted.internet.protocol.Factory):
+ def __init__(self, testcase):
+ logging.info('Creating H2Factory for new connection.')
+ self._num_streams = 0
+ self._testcase = testcase
+
+ def buildProtocol(self, addr):
+ self._num_streams += 1
+ logging.info('New Connection: %d' % self._num_streams)
+ if not _TEST_CASE_MAPPING.has_key(self._testcase):
+ logging.error('Unknown test case: %s' % self._testcase)
+ assert(0)
+ else:
+ t = _TEST_CASE_MAPPING[self._testcase]
+
+ if self._testcase == 'goaway':
+ return t(self._num_streams).get_base_server()
+ else:
+ return t().get_base_server()
+
+if __name__ == '__main__':
+ logging.basicConfig(
+ format='%(levelname) -10s %(asctime)s %(module)s:%(lineno)s | %(message)s',
+ level=logging.INFO)
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--test_case', choices=sorted(_TEST_CASE_MAPPING.keys()),
+ help='test case to run', required=True)
+ parser.add_argument('--port', type=int, default=8080,
+ help='port to run the server (default: 8080)')
+ args = parser.parse_args()
+ logging.info('Running test case %s on port %d' % (args.test_case, args.port))
+ endpoint = twisted.internet.endpoints.TCP4ServerEndpoint(
+ twisted.internet.reactor, args.port, backlog=128)
+ endpoint.listen(H2Factory(args.test_case))
+ twisted.internet.reactor.run()
diff --git a/test/http2_test/messages_pb2.py b/test/http2_test/messages_pb2.py
new file mode 100644
index 0000000000..86cf5a8970
--- /dev/null
+++ b/test/http2_test/messages_pb2.py
@@ -0,0 +1,661 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: messages.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='messages.proto',
+ package='grpc.testing',
+ syntax='proto3',
+ serialized_pb=_b('\n\x0emessages.proto\x12\x0cgrpc.testing\"\x1a\n\tBoolValue\x12\r\n\x05value\x18\x01 \x01(\x08\"@\n\x07Payload\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.grpc.testing.PayloadType\x12\x0c\n\x04\x62ody\x18\x02 \x01(\x0c\"+\n\nEchoStatus\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xce\x02\n\rSimpleRequest\x12\x30\n\rresponse_type\x18\x01 \x01(\x0e\x32\x19.grpc.testing.PayloadType\x12\x15\n\rresponse_size\x18\x02 \x01(\x05\x12&\n\x07payload\x18\x03 \x01(\x0b\x32\x15.grpc.testing.Payload\x12\x15\n\rfill_username\x18\x04 \x01(\x08\x12\x18\n\x10\x66ill_oauth_scope\x18\x05 \x01(\x08\x12\x34\n\x13response_compressed\x18\x06 \x01(\x0b\x32\x17.grpc.testing.BoolValue\x12\x31\n\x0fresponse_status\x18\x07 \x01(\x0b\x32\x18.grpc.testing.EchoStatus\x12\x32\n\x11\x65xpect_compressed\x18\x08 \x01(\x0b\x32\x17.grpc.testing.BoolValue\"_\n\x0eSimpleResponse\x12&\n\x07payload\x18\x01 \x01(\x0b\x32\x15.grpc.testing.Payload\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x13\n\x0boauth_scope\x18\x03 \x01(\t\"w\n\x19StreamingInputCallRequest\x12&\n\x07payload\x18\x01 \x01(\x0b\x32\x15.grpc.testing.Payload\x12\x32\n\x11\x65xpect_compressed\x18\x02 \x01(\x0b\x32\x17.grpc.testing.BoolValue\"=\n\x1aStreamingInputCallResponse\x12\x1f\n\x17\x61ggregated_payload_size\x18\x01 \x01(\x05\"d\n\x12ResponseParameters\x12\x0c\n\x04size\x18\x01 \x01(\x05\x12\x13\n\x0binterval_us\x18\x02 \x01(\x05\x12+\n\ncompressed\x18\x03 \x01(\x0b\x32\x17.grpc.testing.BoolValue\"\xe8\x01\n\x1aStreamingOutputCallRequest\x12\x30\n\rresponse_type\x18\x01 \x01(\x0e\x32\x19.grpc.testing.PayloadType\x12=\n\x13response_parameters\x18\x02 \x03(\x0b\x32 .grpc.testing.ResponseParameters\x12&\n\x07payload\x18\x03 \x01(\x0b\x32\x15.grpc.testing.Payload\x12\x31\n\x0fresponse_status\x18\x07 \x01(\x0b\x32\x18.grpc.testing.EchoStatus\"E\n\x1bStreamingOutputCallResponse\x12&\n\x07payload\x18\x01 \x01(\x0b\x32\x15.grpc.testing.Payload\"3\n\x0fReconnectParams\x12 \n\x18max_reconnect_backoff_ms\x18\x01 \x01(\x05\"3\n\rReconnectInfo\x12\x0e\n\x06passed\x18\x01 \x01(\x08\x12\x12\n\nbackoff_ms\x18\x02 \x03(\x05*\x1f\n\x0bPayloadType\x12\x10\n\x0c\x43OMPRESSABLE\x10\x00\x62\x06proto3')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_PAYLOADTYPE = _descriptor.EnumDescriptor(
+ name='PayloadType',
+ full_name='grpc.testing.PayloadType',
+ filename=None,
+ file=DESCRIPTOR,
+ values=[
+ _descriptor.EnumValueDescriptor(
+ name='COMPRESSABLE', index=0, number=0,
+ options=None,
+ type=None),
+ ],
+ containing_type=None,
+ options=None,
+ serialized_start=1303,
+ serialized_end=1334,
+)
+_sym_db.RegisterEnumDescriptor(_PAYLOADTYPE)
+
+PayloadType = enum_type_wrapper.EnumTypeWrapper(_PAYLOADTYPE)
+COMPRESSABLE = 0
+
+
+
+_BOOLVALUE = _descriptor.Descriptor(
+ name='BoolValue',
+ full_name='grpc.testing.BoolValue',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='value', full_name='grpc.testing.BoolValue.value', index=0,
+ number=1, type=8, cpp_type=7, label=1,
+ has_default_value=False, default_value=False,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=32,
+ serialized_end=58,
+)
+
+
+_PAYLOAD = _descriptor.Descriptor(
+ name='Payload',
+ full_name='grpc.testing.Payload',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='type', full_name='grpc.testing.Payload.type', index=0,
+ number=1, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='body', full_name='grpc.testing.Payload.body', index=1,
+ number=2, type=12, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b(""),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=60,
+ serialized_end=124,
+)
+
+
+_ECHOSTATUS = _descriptor.Descriptor(
+ name='EchoStatus',
+ full_name='grpc.testing.EchoStatus',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='code', full_name='grpc.testing.EchoStatus.code', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='message', full_name='grpc.testing.EchoStatus.message', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=126,
+ serialized_end=169,
+)
+
+
+_SIMPLEREQUEST = _descriptor.Descriptor(
+ name='SimpleRequest',
+ full_name='grpc.testing.SimpleRequest',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='response_type', full_name='grpc.testing.SimpleRequest.response_type', index=0,
+ number=1, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='response_size', full_name='grpc.testing.SimpleRequest.response_size', index=1,
+ number=2, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='payload', full_name='grpc.testing.SimpleRequest.payload', index=2,
+ number=3, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='fill_username', full_name='grpc.testing.SimpleRequest.fill_username', index=3,
+ number=4, type=8, cpp_type=7, label=1,
+ has_default_value=False, default_value=False,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='fill_oauth_scope', full_name='grpc.testing.SimpleRequest.fill_oauth_scope', index=4,
+ number=5, type=8, cpp_type=7, label=1,
+ has_default_value=False, default_value=False,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='response_compressed', full_name='grpc.testing.SimpleRequest.response_compressed', index=5,
+ number=6, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='response_status', full_name='grpc.testing.SimpleRequest.response_status', index=6,
+ number=7, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='expect_compressed', full_name='grpc.testing.SimpleRequest.expect_compressed', index=7,
+ number=8, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=172,
+ serialized_end=506,
+)
+
+
+_SIMPLERESPONSE = _descriptor.Descriptor(
+ name='SimpleResponse',
+ full_name='grpc.testing.SimpleResponse',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='payload', full_name='grpc.testing.SimpleResponse.payload', index=0,
+ number=1, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='username', full_name='grpc.testing.SimpleResponse.username', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='oauth_scope', full_name='grpc.testing.SimpleResponse.oauth_scope', index=2,
+ number=3, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=508,
+ serialized_end=603,
+)
+
+
+_STREAMINGINPUTCALLREQUEST = _descriptor.Descriptor(
+ name='StreamingInputCallRequest',
+ full_name='grpc.testing.StreamingInputCallRequest',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='payload', full_name='grpc.testing.StreamingInputCallRequest.payload', index=0,
+ number=1, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='expect_compressed', full_name='grpc.testing.StreamingInputCallRequest.expect_compressed', index=1,
+ number=2, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=605,
+ serialized_end=724,
+)
+
+
+_STREAMINGINPUTCALLRESPONSE = _descriptor.Descriptor(
+ name='StreamingInputCallResponse',
+ full_name='grpc.testing.StreamingInputCallResponse',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='aggregated_payload_size', full_name='grpc.testing.StreamingInputCallResponse.aggregated_payload_size', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=726,
+ serialized_end=787,
+)
+
+
+_RESPONSEPARAMETERS = _descriptor.Descriptor(
+ name='ResponseParameters',
+ full_name='grpc.testing.ResponseParameters',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='size', full_name='grpc.testing.ResponseParameters.size', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='interval_us', full_name='grpc.testing.ResponseParameters.interval_us', index=1,
+ number=2, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='compressed', full_name='grpc.testing.ResponseParameters.compressed', index=2,
+ number=3, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=789,
+ serialized_end=889,
+)
+
+
+_STREAMINGOUTPUTCALLREQUEST = _descriptor.Descriptor(
+ name='StreamingOutputCallRequest',
+ full_name='grpc.testing.StreamingOutputCallRequest',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='response_type', full_name='grpc.testing.StreamingOutputCallRequest.response_type', index=0,
+ number=1, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='response_parameters', full_name='grpc.testing.StreamingOutputCallRequest.response_parameters', index=1,
+ number=2, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='payload', full_name='grpc.testing.StreamingOutputCallRequest.payload', index=2,
+ number=3, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='response_status', full_name='grpc.testing.StreamingOutputCallRequest.response_status', index=3,
+ number=7, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=892,
+ serialized_end=1124,
+)
+
+
+_STREAMINGOUTPUTCALLRESPONSE = _descriptor.Descriptor(
+ name='StreamingOutputCallResponse',
+ full_name='grpc.testing.StreamingOutputCallResponse',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='payload', full_name='grpc.testing.StreamingOutputCallResponse.payload', index=0,
+ number=1, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=1126,
+ serialized_end=1195,
+)
+
+
+_RECONNECTPARAMS = _descriptor.Descriptor(
+ name='ReconnectParams',
+ full_name='grpc.testing.ReconnectParams',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='max_reconnect_backoff_ms', full_name='grpc.testing.ReconnectParams.max_reconnect_backoff_ms', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=1197,
+ serialized_end=1248,
+)
+
+
+_RECONNECTINFO = _descriptor.Descriptor(
+ name='ReconnectInfo',
+ full_name='grpc.testing.ReconnectInfo',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='passed', full_name='grpc.testing.ReconnectInfo.passed', index=0,
+ number=1, type=8, cpp_type=7, label=1,
+ has_default_value=False, default_value=False,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='backoff_ms', full_name='grpc.testing.ReconnectInfo.backoff_ms', index=1,
+ number=2, type=5, cpp_type=1, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=1250,
+ serialized_end=1301,
+)
+
+_PAYLOAD.fields_by_name['type'].enum_type = _PAYLOADTYPE
+_SIMPLEREQUEST.fields_by_name['response_type'].enum_type = _PAYLOADTYPE
+_SIMPLEREQUEST.fields_by_name['payload'].message_type = _PAYLOAD
+_SIMPLEREQUEST.fields_by_name['response_compressed'].message_type = _BOOLVALUE
+_SIMPLEREQUEST.fields_by_name['response_status'].message_type = _ECHOSTATUS
+_SIMPLEREQUEST.fields_by_name['expect_compressed'].message_type = _BOOLVALUE
+_SIMPLERESPONSE.fields_by_name['payload'].message_type = _PAYLOAD
+_STREAMINGINPUTCALLREQUEST.fields_by_name['payload'].message_type = _PAYLOAD
+_STREAMINGINPUTCALLREQUEST.fields_by_name['expect_compressed'].message_type = _BOOLVALUE
+_RESPONSEPARAMETERS.fields_by_name['compressed'].message_type = _BOOLVALUE
+_STREAMINGOUTPUTCALLREQUEST.fields_by_name['response_type'].enum_type = _PAYLOADTYPE
+_STREAMINGOUTPUTCALLREQUEST.fields_by_name['response_parameters'].message_type = _RESPONSEPARAMETERS
+_STREAMINGOUTPUTCALLREQUEST.fields_by_name['payload'].message_type = _PAYLOAD
+_STREAMINGOUTPUTCALLREQUEST.fields_by_name['response_status'].message_type = _ECHOSTATUS
+_STREAMINGOUTPUTCALLRESPONSE.fields_by_name['payload'].message_type = _PAYLOAD
+DESCRIPTOR.message_types_by_name['BoolValue'] = _BOOLVALUE
+DESCRIPTOR.message_types_by_name['Payload'] = _PAYLOAD
+DESCRIPTOR.message_types_by_name['EchoStatus'] = _ECHOSTATUS
+DESCRIPTOR.message_types_by_name['SimpleRequest'] = _SIMPLEREQUEST
+DESCRIPTOR.message_types_by_name['SimpleResponse'] = _SIMPLERESPONSE
+DESCRIPTOR.message_types_by_name['StreamingInputCallRequest'] = _STREAMINGINPUTCALLREQUEST
+DESCRIPTOR.message_types_by_name['StreamingInputCallResponse'] = _STREAMINGINPUTCALLRESPONSE
+DESCRIPTOR.message_types_by_name['ResponseParameters'] = _RESPONSEPARAMETERS
+DESCRIPTOR.message_types_by_name['StreamingOutputCallRequest'] = _STREAMINGOUTPUTCALLREQUEST
+DESCRIPTOR.message_types_by_name['StreamingOutputCallResponse'] = _STREAMINGOUTPUTCALLRESPONSE
+DESCRIPTOR.message_types_by_name['ReconnectParams'] = _RECONNECTPARAMS
+DESCRIPTOR.message_types_by_name['ReconnectInfo'] = _RECONNECTINFO
+DESCRIPTOR.enum_types_by_name['PayloadType'] = _PAYLOADTYPE
+
+BoolValue = _reflection.GeneratedProtocolMessageType('BoolValue', (_message.Message,), dict(
+ DESCRIPTOR = _BOOLVALUE,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.BoolValue)
+ ))
+_sym_db.RegisterMessage(BoolValue)
+
+Payload = _reflection.GeneratedProtocolMessageType('Payload', (_message.Message,), dict(
+ DESCRIPTOR = _PAYLOAD,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.Payload)
+ ))
+_sym_db.RegisterMessage(Payload)
+
+EchoStatus = _reflection.GeneratedProtocolMessageType('EchoStatus', (_message.Message,), dict(
+ DESCRIPTOR = _ECHOSTATUS,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.EchoStatus)
+ ))
+_sym_db.RegisterMessage(EchoStatus)
+
+SimpleRequest = _reflection.GeneratedProtocolMessageType('SimpleRequest', (_message.Message,), dict(
+ DESCRIPTOR = _SIMPLEREQUEST,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.SimpleRequest)
+ ))
+_sym_db.RegisterMessage(SimpleRequest)
+
+SimpleResponse = _reflection.GeneratedProtocolMessageType('SimpleResponse', (_message.Message,), dict(
+ DESCRIPTOR = _SIMPLERESPONSE,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.SimpleResponse)
+ ))
+_sym_db.RegisterMessage(SimpleResponse)
+
+StreamingInputCallRequest = _reflection.GeneratedProtocolMessageType('StreamingInputCallRequest', (_message.Message,), dict(
+ DESCRIPTOR = _STREAMINGINPUTCALLREQUEST,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.StreamingInputCallRequest)
+ ))
+_sym_db.RegisterMessage(StreamingInputCallRequest)
+
+StreamingInputCallResponse = _reflection.GeneratedProtocolMessageType('StreamingInputCallResponse', (_message.Message,), dict(
+ DESCRIPTOR = _STREAMINGINPUTCALLRESPONSE,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.StreamingInputCallResponse)
+ ))
+_sym_db.RegisterMessage(StreamingInputCallResponse)
+
+ResponseParameters = _reflection.GeneratedProtocolMessageType('ResponseParameters', (_message.Message,), dict(
+ DESCRIPTOR = _RESPONSEPARAMETERS,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.ResponseParameters)
+ ))
+_sym_db.RegisterMessage(ResponseParameters)
+
+StreamingOutputCallRequest = _reflection.GeneratedProtocolMessageType('StreamingOutputCallRequest', (_message.Message,), dict(
+ DESCRIPTOR = _STREAMINGOUTPUTCALLREQUEST,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.StreamingOutputCallRequest)
+ ))
+_sym_db.RegisterMessage(StreamingOutputCallRequest)
+
+StreamingOutputCallResponse = _reflection.GeneratedProtocolMessageType('StreamingOutputCallResponse', (_message.Message,), dict(
+ DESCRIPTOR = _STREAMINGOUTPUTCALLRESPONSE,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.StreamingOutputCallResponse)
+ ))
+_sym_db.RegisterMessage(StreamingOutputCallResponse)
+
+ReconnectParams = _reflection.GeneratedProtocolMessageType('ReconnectParams', (_message.Message,), dict(
+ DESCRIPTOR = _RECONNECTPARAMS,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.ReconnectParams)
+ ))
+_sym_db.RegisterMessage(ReconnectParams)
+
+ReconnectInfo = _reflection.GeneratedProtocolMessageType('ReconnectInfo', (_message.Message,), dict(
+ DESCRIPTOR = _RECONNECTINFO,
+ __module__ = 'messages_pb2'
+ # @@protoc_insertion_point(class_scope:grpc.testing.ReconnectInfo)
+ ))
+_sym_db.RegisterMessage(ReconnectInfo)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/test/http2_test/test_goaway.py b/test/http2_test/test_goaway.py
new file mode 100644
index 0000000000..61f4beb74a
--- /dev/null
+++ b/test/http2_test/test_goaway.py
@@ -0,0 +1,77 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import time
+
+import http2_base_server
+
+class TestcaseGoaway(object):
+ """
+ This test does the following:
+ Process incoming request normally, i.e. send headers, data and trailers.
+ Then send a GOAWAY frame with the stream id of the processed request.
+ It checks that the next request is made on a different TCP connection.
+ """
+ def __init__(self, iteration):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['RequestReceived'] = self.on_request_received
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['SendDone'] = self.on_send_done
+ self._base_server._handlers['ConnectionLost'] = self.on_connection_lost
+ self._ready_to_send = False
+ self._iteration = iteration
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_connection_lost(self, reason):
+ logging.info('Disconnect received. Count %d' % self._iteration)
+ # _iteration == 2 => Two different connections have been used.
+ if self._iteration == 2:
+ self._base_server.on_connection_lost(reason)
+
+ def on_send_done(self, stream_id):
+ self._base_server.on_send_done_default(stream_id)
+ logging.info('Sending GOAWAY for stream %d:' % stream_id)
+ self._base_server._conn.close_connection(error_code=0, additional_data=None, last_stream_id=stream_id)
+ self._base_server._stream_status[stream_id] = False
+
+ def on_request_received(self, event):
+ self._ready_to_send = False
+ self._base_server.on_request_received_default(event)
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(event.stream_id)
+ if sr:
+ logging.info('Creating response size = %s' % sr.response_size)
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._ready_to_send = True
+ self._base_server.setup_send(response_data, event.stream_id)
diff --git a/test/http2_test/test_max_streams.py b/test/http2_test/test_max_streams.py
new file mode 100644
index 0000000000..9942b1bb9a
--- /dev/null
+++ b/test/http2_test/test_max_streams.py
@@ -0,0 +1,63 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import hyperframe.frame
+import logging
+
+import http2_base_server
+
+class TestcaseSettingsMaxStreams(object):
+ """
+ This test sets MAX_CONCURRENT_STREAMS to 1 and asserts that at any point
+ only 1 stream is active.
+ """
+ def __init__(self):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['ConnectionMade'] = self.on_connection_made
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_connection_made(self):
+ logging.info('Connection Made')
+ self._base_server._conn.initiate_connection()
+ self._base_server._conn.update_settings(
+ {hyperframe.frame.SettingsFrame.MAX_CONCURRENT_STREAMS: 1})
+ self._base_server.transport.setTcpNoDelay(True)
+ self._base_server.transport.write(self._base_server._conn.data_to_send())
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(event.stream_id)
+ if sr:
+ logging.info('Creating response of size = %s' % sr.response_size)
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._base_server.setup_send(response_data, event.stream_id)
+ # TODO (makdharma): Add assertion to check number of live streams
diff --git a/test/http2_test/test_ping.py b/test/http2_test/test_ping.py
new file mode 100644
index 0000000000..da41fd01bb
--- /dev/null
+++ b/test/http2_test/test_ping.py
@@ -0,0 +1,67 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+
+import http2_base_server
+
+class TestcasePing(object):
+ """
+ This test injects PING frames before and after header and data. Keeps count
+ of outstanding ping response and asserts when the count is non-zero at the
+ end of the test.
+ """
+ def __init__(self):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['RequestReceived'] = self.on_request_received
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['ConnectionLost'] = self.on_connection_lost
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_request_received(self, event):
+ self._base_server.default_ping()
+ self._base_server.on_request_received_default(event)
+ self._base_server.default_ping()
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(event.stream_id)
+ if sr:
+ logging.info('Creating response size = %s' % sr.response_size)
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._base_server.default_ping()
+ self._base_server.setup_send(response_data, event.stream_id)
+ self._base_server.default_ping()
+
+ def on_connection_lost(self, reason):
+ logging.info('Disconnect received. Ping Count %d' % self._base_server._outstanding_pings)
+ assert(self._base_server._outstanding_pings == 0)
+ self._base_server.on_connection_lost(reason)
diff --git a/test/http2_test/test_rst_after_data.py b/test/http2_test/test_rst_after_data.py
new file mode 100644
index 0000000000..9236025395
--- /dev/null
+++ b/test/http2_test/test_rst_after_data.py
@@ -0,0 +1,57 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import http2_base_server
+
+class TestcaseRstStreamAfterData(object):
+ """
+ In response to an incoming request, this test sends headers, followed by
+ data, followed by a reset stream frame. Client asserts that the RPC failed.
+ Client needs to deliver the complete message to the application layer.
+ """
+ def __init__(self):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['SendDone'] = self.on_send_done
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(event.stream_id)
+ if sr:
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._ready_to_send = True
+ self._base_server.setup_send(response_data, event.stream_id)
+ # send reset stream
+
+ def on_send_done(self, stream_id):
+ self._base_server.send_reset_stream()
+ self._base_server._stream_status[stream_id] = False
diff --git a/test/http2_test/test_rst_after_header.py b/test/http2_test/test_rst_after_header.py
new file mode 100644
index 0000000000..41e1adb8ad
--- /dev/null
+++ b/test/http2_test/test_rst_after_header.py
@@ -0,0 +1,48 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import http2_base_server
+
+class TestcaseRstStreamAfterHeader(object):
+ """
+ In response to an incoming request, this test sends headers, followed by
+ a reset stream frame. Client asserts that the RPC failed.
+ """
+ def __init__(self):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['RequestReceived'] = self.on_request_received
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_request_received(self, event):
+ # send initial headers
+ self._base_server.on_request_received_default(event)
+ # send reset stream
+ self._base_server.send_reset_stream()
diff --git a/test/http2_test/test_rst_during_data.py b/test/http2_test/test_rst_during_data.py
new file mode 100644
index 0000000000..7c859db267
--- /dev/null
+++ b/test/http2_test/test_rst_during_data.py
@@ -0,0 +1,58 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import http2_base_server
+
+class TestcaseRstStreamDuringData(object):
+ """
+ In response to an incoming request, this test sends headers, followed by
+ some data, followed by a reset stream frame. Client asserts that the RPC
+ failed and does not deliver the message to the application.
+ """
+ def __init__(self):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['SendDone'] = self.on_send_done
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(event.stream_id)
+ if sr:
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._ready_to_send = True
+ response_len = len(response_data)
+ truncated_response_data = response_data[0:response_len/2]
+ self._base_server.setup_send(truncated_response_data, event.stream_id)
+
+ def on_send_done(self, stream_id):
+ self._base_server.send_reset_stream()
+ self._base_server._stream_status[stream_id] = False